aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/README.md14
-rw-r--r--plugins/all-modules-page/README.md7
-rw-r--r--plugins/all-modules-page/api/all-modules-page.api87
-rw-r--r--plugins/all-modules-page/build.gradle.kts34
-rw-r--r--plugins/all-modules-page/src/main/kotlin/AllModulesPageGeneration.kt80
-rw-r--r--plugins/all-modules-page/src/main/kotlin/AllModulesPagePlugin.kt58
-rw-r--r--plugins/all-modules-page/src/main/kotlin/ExternalModuleLinkResolver.kt79
-rw-r--r--plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt59
-rw-r--r--plugins/all-modules-page/src/main/kotlin/MultimodulePageCreator.kt115
-rw-r--r--plugins/all-modules-page/src/main/kotlin/ResolveLinkCommandHandler.kt49
-rw-r--r--plugins/all-modules-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/all-modules-page/src/test/kotlin/MultiModuleDokkaTestGenerator.kt98
-rw-r--r--plugins/all-modules-page/src/test/kotlin/templates/MultiModuleDocumentationTest.kt75
-rw-r--r--plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkCommandResolutionTest.kt109
-rw-r--r--plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkGfmCommandResolutionTest.kt76
-rw-r--r--plugins/all-modules-page/src/test/kotlin/templates/mockedPackageListFactory.kt16
-rw-r--r--plugins/android-documentation/README.md10
-rw-r--r--plugins/android-documentation/api/android-documentation.api11
-rw-r--r--plugins/android-documentation/build.gradle.kts33
-rw-r--r--plugins/android-documentation/src/main/kotlin/AndroidDocumentationPlugin.kt26
-rw-r--r--plugins/android-documentation/src/main/kotlin/transformers/HideTagDocumentableFilter.kt18
-rw-r--r--plugins/android-documentation/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/android-documentation/src/test/kotlin/transformers/HideTagDocumentableFilterTest.kt75
-rw-r--r--plugins/base/README.md21
-rw-r--r--plugins/base/api/base.api1541
-rw-r--r--plugins/base/base-test-utils/api/base-test-utils.api199
-rw-r--r--plugins/base/base-test-utils/build.gradle.kts34
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/renderers/JsoupUtils.kt79
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/renderers/RenderingOnlyTestBase.kt12
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/renderers/SignatureUtils.kt23
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/renderers/TestPage.kt59
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt124
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/utils/TestOutputWriter.kt47
-rw-r--r--plugins/base/base-test-utils/src/main/kotlin/utils/assertHtmlEqualsIgnoringWhitespace.kt24
-rw-r--r--plugins/base/build.gradle.kts82
-rw-r--r--plugins/base/frontend/.gitignore2
-rw-r--r--plugins/base/frontend/build.gradle.kts52
-rw-r--r--plugins/base/frontend/package-lock.json19352
-rw-r--r--plugins/base/frontend/package.json61
-rw-r--r--plugins/base/frontend/postcss.config.js20
-rw-r--r--plugins/base/frontend/src/main/components/app/index.scss30
-rw-r--r--plugins/base/frontend/src/main/components/app/index.tsx15
-rw-r--r--plugins/base/frontend/src/main/components/assets/clear.svg7
-rw-r--r--plugins/base/frontend/src/main/components/assets/searchIcon.svg7
-rw-r--r--plugins/base/frontend/src/main/components/root.tsx22
-rw-r--r--plugins/base/frontend/src/main/components/search/dokkaFuzzyFilter.tsx101
-rw-r--r--plugins/base/frontend/src/main/components/search/dokkaSearchAnchor.tsx32
-rw-r--r--plugins/base/frontend/src/main/components/search/search.scss118
-rw-r--r--plugins/base/frontend/src/main/components/search/search.tsx74
-rw-r--r--plugins/base/frontend/src/main/components/search/searchResultRow.tsx36
-rw-r--r--plugins/base/frontend/src/main/components/search/types.ts55
-rw-r--r--plugins/base/frontend/src/main/components/utils/hotkey.ts62
-rw-r--r--plugins/base/frontend/src/main/components/utils/os.ts18
-rw-r--r--plugins/base/frontend/src/main/components/utils/requests.tsx11
-rw-r--r--plugins/base/frontend/src/main/scss/index.scss10
-rw-r--r--plugins/base/frontend/src/main/types/@jetbrains/index.d.ts9
-rw-r--r--plugins/base/frontend/stylelint.config.js8
-rw-r--r--plugins/base/frontend/tsconfig.json31
-rw-r--r--plugins/base/frontend/webpack.config.js83
-rw-r--r--plugins/base/src/main/kotlin/DokkaBase.kt299
-rw-r--r--plugins/base/src/main/kotlin/DokkaBaseConfiguration.kt28
-rw-r--r--plugins/base/src/main/kotlin/deprecated/AnalysisApiDeprecatedError.kt16
-rw-r--r--plugins/base/src/main/kotlin/deprecated/KotlinAnalysisDeprecatedApi.kt77
-rw-r--r--plugins/base/src/main/kotlin/deprecated/ParsersDeprecatedAPI.kt42
-rw-r--r--plugins/base/src/main/kotlin/deprecated/ParsersFactoriesDeprecatedAPI.kt24
-rw-r--r--plugins/base/src/main/kotlin/deprecated/TranslatorDescriptorsDeprecatedAPI.kt50
-rw-r--r--plugins/base/src/main/kotlin/deprecated/TranslatorPsiDeprecatedAPI.kt25
-rw-r--r--plugins/base/src/main/kotlin/generation/SingleModuleGeneration.kt131
-rw-r--r--plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt257
-rw-r--r--plugins/base/src/main/kotlin/renderers/FileWriter.kt109
-rw-r--r--plugins/base/src/main/kotlin/renderers/OutputWriter.kt11
-rw-r--r--plugins/base/src/main/kotlin/renderers/PackageListService.kt80
-rw-r--r--plugins/base/src/main/kotlin/renderers/TabSortingStrategy.kt11
-rw-r--r--plugins/base/src/main/kotlin/renderers/contentTypeChecking.kt24
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/HtmlContent.kt18
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt1013
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/NavigationDataProvider.kt134
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt129
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/SearchbarDataInstaller.kt128
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/Tags.kt82
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt37
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt26
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/command/consumers/ReplaceVersionsConsumer.kt29
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt34
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/htmlFormatingUtils.kt67
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt172
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelFactory.kt234
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelMerger.kt20
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/innerTemplating/HtmlTemplater.kt82
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelFactory.kt19
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelMerger.kt9
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/shouldRenderSourceSetBubbles.kt20
-rw-r--r--plugins/base/src/main/kotlin/renderers/pageId.kt31
-rw-r--r--plugins/base/src/main/kotlin/renderers/preprocessors.kt41
-rw-r--r--plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt19
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProvider.kt46
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProviderFactory.kt28
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/Dokka010ExternalLocationProvider.kt46
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProvider.kt18
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt11
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactoryWithCache.kt21
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/javadoc/AndroidExternalLocationProvider.kt18
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt62
-rw-r--r--plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProviderFactory.kt39
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt82
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DokkaBaseLocationProvider.kt27
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt182
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt26
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt47
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt11
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentation.kt9
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt10
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt83
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt29
-rw-r--r--plugins/base/src/main/kotlin/resolvers/shared/utils.kt41
-rw-r--r--plugins/base/src/main/kotlin/signatures/JvmSignatureUtils.kt231
-rw-r--r--plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt503
-rw-r--r--plugins/base/src/main/kotlin/signatures/KotlinSignatureUtils.kt86
-rw-r--r--plugins/base/src/main/kotlin/signatures/SignatureProvider.kt12
-rw-r--r--plugins/base/src/main/kotlin/templating/AddToNavigationCommand.kt9
-rw-r--r--plugins/base/src/main/kotlin/templating/AddToSearch.kt12
-rw-r--r--plugins/base/src/main/kotlin/templating/AddToSourcesetDependencies.kt10
-rw-r--r--plugins/base/src/main/kotlin/templating/Command.kt15
-rw-r--r--plugins/base/src/main/kotlin/templating/ImmediateHtmlCommandConsumer.kt17
-rw-r--r--plugins/base/src/main/kotlin/templating/InsertTemplateExtra.kt16
-rw-r--r--plugins/base/src/main/kotlin/templating/PathToRootSubstitutionCommand.kt10
-rw-r--r--plugins/base/src/main/kotlin/templating/ProjectNameSubstitutionCommand.kt10
-rw-r--r--plugins/base/src/main/kotlin/templating/ReplaceVersionsCommand.kt7
-rw-r--r--plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt11
-rw-r--r--plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt62
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt127
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ClashingDriIdentifier.kt12
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/DeprecatedDocumentableFilterTransformer.kt62
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/DocumentableReplacerTransformer.kt239
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilterTransformer.kt388
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/EmptyModulesFilterTransformer.kt14
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/EmptyPackagesFilterTransformer.kt30
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ExtensionExtractorTransformer.kt160
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/InheritedEntriesDocumentableFilterTransformer.kt23
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt91
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/KotlinArrayDocumentableReplacerTransformer.kt68
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt47
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ObviousFunctionsDocumentableFilterTransformer.kt17
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ReportUndocumentedTransformer.kt143
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/SuppressTagDocumentableFilter.kt17
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer.kt146
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConfigurationDocumentableFilterTransformer.kt57
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/utils.kt35
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/DefaultSamplesTransformer.kt117
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/annotations/SinceKotlinTransformer.kt186
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt22
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt270
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/FallbackPageMergerStrategy.kt22
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/PageMerger.kt40
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/PageMergerStrategy.kt13
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt68
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt43
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt140
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/tags/CustomTagContentProvider.kt63
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/tags/SinceKotlinTagContentProvider.kt38
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt34
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt779
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DeprecationSectionCreator.kt194
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DescriptionSections.kt349
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DriClashAwareName.kt13
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt781
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/briefFromContentNodes.kt62
-rw-r--r--plugins/base/src/main/kotlin/utils/CollectionExtensions.kt16
-rw-r--r--plugins/base/src/main/kotlin/utils/alphabeticalOrder.kt11
-rw-r--r--plugins/base/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/base/src/main/resources/dokka/docs/javadoc/EnumValueOf.java.template12
-rw-r--r--plugins/base/src/main/resources/dokka/docs/javadoc/EnumValues.java.template8
-rw-r--r--plugins/base/src/main/resources/dokka/docs/kdoc/EnumEntries.kt.template3
-rw-r--r--plugins/base/src/main/resources/dokka/docs/kdoc/EnumValueOf.kt.template4
-rw-r--r--plugins/base/src/main/resources/dokka/docs/kdoc/EnumValues.kt.template3
-rw-r--r--plugins/base/src/main/resources/dokka/format/gfm.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/format/html-as-java.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/format/html.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/format/java-layout-html.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/format/jekyll.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/format/kotlin-website-html.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/format/markdown.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/images/anchor-copy-button.svg8
-rwxr-xr-xplugins/base/src/main/resources/dokka/images/arrow_down.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/burger.svg9
-rw-r--r--plugins/base/src/main/resources/dokka/images/copy-icon.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/copy-successful-icon.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/footer-go-to-link.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/go-to-top-icon.svg8
-rw-r--r--plugins/base/src/main/resources/dokka/images/homepage.svg5
-rwxr-xr-xplugins/base/src/main/resources/dokka/images/logo-icon.svg14
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class-kotlin.svg26
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class.svg20
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/annotation-kotlin.svg13
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/annotation.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/class-kotlin.svg13
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/class.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/enum-kotlin.svg13
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/enum.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/exception-class.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/field-value.svg10
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/field-variable.svg10
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/function.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/interface-kotlin.svg13
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/interface.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/object.svg13
-rw-r--r--plugins/base/src/main/resources/dokka/images/nav-icons/typealias-kotlin.svg13
-rw-r--r--plugins/base/src/main/resources/dokka/images/theme-toggle.svg7
-rw-r--r--plugins/base/src/main/resources/dokka/inbound-link-resolver/dokka-default.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/inbound-link-resolver/java-layout-html.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/inbound-link-resolver/javadoc.properties6
-rw-r--r--plugins/base/src/main/resources/dokka/scripts/clipboard.js56
-rw-r--r--plugins/base/src/main/resources/dokka/scripts/navigation-loader.js95
-rw-r--r--plugins/base/src/main/resources/dokka/scripts/platform-content-handler.js400
-rw-r--r--plugins/base/src/main/resources/dokka/scripts/prism.js22
-rw-r--r--plugins/base/src/main/resources/dokka/scripts/symbol-parameters-wrapper_deferred.js64
-rw-r--r--plugins/base/src/main/resources/dokka/styles/font-jb-sans-auto.css36
-rw-r--r--plugins/base/src/main/resources/dokka/styles/logo-styles.css9
-rw-r--r--plugins/base/src/main/resources/dokka/styles/prism.css217
-rw-r--r--plugins/base/src/main/resources/dokka/styles/style.css1513
-rw-r--r--plugins/base/src/main/resources/dokka/templates/base.ftl44
-rw-r--r--plugins/base/src/main/resources/dokka/templates/includes/footer.ftl7
-rw-r--r--plugins/base/src/main/resources/dokka/templates/includes/header.ftl31
-rw-r--r--plugins/base/src/main/resources/dokka/templates/includes/page_metadata.ftl6
-rw-r--r--plugins/base/src/main/resources/dokka/templates/includes/source_set_selector.ftl9
-rw-r--r--plugins/base/src/test/kotlin/basic/AbortGracefullyOnMissingDocumentablesTest.kt22
-rw-r--r--plugins/base/src/test/kotlin/basic/DRITest.kt351
-rw-r--r--plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt46
-rw-r--r--plugins/base/src/test/kotlin/basic/FailOnWarningTest.kt128
-rw-r--r--plugins/base/src/test/kotlin/basic/LoggerTest.kt48
-rw-r--r--plugins/base/src/test/kotlin/content/ContentInDescriptionTest.kt142
-rw-r--r--plugins/base/src/test/kotlin/content/HighlightingTest.kt83
-rw-r--r--plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt351
-rw-r--r--plugins/base/src/test/kotlin/content/annotations/FileLevelJvmNameTest.kt115
-rw-r--r--plugins/base/src/test/kotlin/content/annotations/JavaDeprecatedTest.kt144
-rw-r--r--plugins/base/src/test/kotlin/content/annotations/KotlinDeprecatedTest.kt401
-rw-r--r--plugins/base/src/test/kotlin/content/annotations/SinceKotlinTest.kt350
-rw-r--r--plugins/base/src/test/kotlin/content/exceptions/ContentForExceptions.kt439
-rw-r--r--plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt388
-rw-r--r--plugins/base/src/test/kotlin/content/functions/ContentForConstructors.kt53
-rw-r--r--plugins/base/src/test/kotlin/content/inheritors/ContentForInheritorsTest.kt499
-rw-r--r--plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt1529
-rw-r--r--plugins/base/src/test/kotlin/content/properties/ContentForClassWithParamsAndPropertiesTest.kt272
-rw-r--r--plugins/base/src/test/kotlin/content/receiver/ContentForReceiverTest.kt61
-rw-r--r--plugins/base/src/test/kotlin/content/samples/ContentForSamplesTest.kt207
-rw-r--r--plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt866
-rw-r--r--plugins/base/src/test/kotlin/content/signatures/ConstructorsSignaturesTest.kt469
-rw-r--r--plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt515
-rw-r--r--plugins/base/src/test/kotlin/content/typealiases/TypealiasTest.kt83
-rw-r--r--plugins/base/src/test/kotlin/enums/JavaEnumsTest.kt75
-rw-r--r--plugins/base/src/test/kotlin/enums/KotlinEnumsTest.kt471
-rw-r--r--plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt109
-rw-r--r--plugins/base/src/test/kotlin/expect/ExpectGenerator.kt17
-rw-r--r--plugins/base/src/test/kotlin/expect/ExpectTest.kt28
-rw-r--r--plugins/base/src/test/kotlin/expect/ExpectUtils.kt32
-rw-r--r--plugins/base/src/test/kotlin/expectActuals/ExpectActualsTest.kt179
-rw-r--r--plugins/base/src/test/kotlin/filter/DeprecationFilterTest.kt264
-rw-r--r--plugins/base/src/test/kotlin/filter/EmptyPackagesFilterTest.kt70
-rw-r--r--plugins/base/src/test/kotlin/filter/JavaFileFilterTest.kt40
-rw-r--r--plugins/base/src/test/kotlin/filter/JavaVisibilityFilterTest.kt308
-rw-r--r--plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt211
-rw-r--r--plugins/base/src/test/kotlin/filter/VisibilityFilterTest.kt755
-rw-r--r--plugins/base/src/test/kotlin/issues/IssuesTest.kt59
-rw-r--r--plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt418
-rw-r--r--plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt142
-rw-r--r--plugins/base/src/test/kotlin/locationProvider/AndroidExternalLocationProviderTest.kt109
-rw-r--r--plugins/base/src/test/kotlin/locationProvider/DefaultExternalLocationProviderTest.kt78
-rw-r--r--plugins/base/src/test/kotlin/locationProvider/Dokka010ExternalLocationProviderTest.kt123
-rw-r--r--plugins/base/src/test/kotlin/locationProvider/DokkaLocationProviderTest.kt126
-rw-r--r--plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt85
-rw-r--r--plugins/base/src/test/kotlin/locationProvider/MultiModuleLinkingTest.kt74
-rw-r--r--plugins/base/src/test/kotlin/markdown/KDocTest.kt51
-rw-r--r--plugins/base/src/test/kotlin/markdown/LinkTest.kt240
-rw-r--r--plugins/base/src/test/kotlin/markdown/ParserTest.kt1633
-rw-r--r--plugins/base/src/test/kotlin/model/ClassesTest.kt594
-rw-r--r--plugins/base/src/test/kotlin/model/CommentTest.kt338
-rw-r--r--plugins/base/src/test/kotlin/model/ExtensionsTest.kt159
-rw-r--r--plugins/base/src/test/kotlin/model/FunctionsTest.kt403
-rw-r--r--plugins/base/src/test/kotlin/model/InheritorsTest.kt428
-rw-r--r--plugins/base/src/test/kotlin/model/JavaTest.kt491
-rw-r--r--plugins/base/src/test/kotlin/model/MultiLanguageInheritanceTest.kt365
-rw-r--r--plugins/base/src/test/kotlin/model/ObjectTest.kt43
-rw-r--r--plugins/base/src/test/kotlin/model/PackagesTest.kt123
-rw-r--r--plugins/base/src/test/kotlin/model/PropertyTest.kt277
-rw-r--r--plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsForParametersTest.kt181
-rw-r--r--plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsTest.kt195
-rw-r--r--plugins/base/src/test/kotlin/model/annotations/KotlinAnnotationsForParametersTest.kt105
-rw-r--r--plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt58
-rw-r--r--plugins/base/src/test/kotlin/packageList/PackageListTest.kt69
-rw-r--r--plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt465
-rw-r--r--plugins/base/src/test/kotlin/parsers/JavadocParserTest.kt618
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/BasicTest.kt24
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt88
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/CoverPageTest.kt51
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/CustomFooterTest.kt48
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt316
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/FooterMessageTest.kt31
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/FormattingUtilsTest.kt86
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt82
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/HeaderTest.kt102
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/HtmlRenderingOnlyTestBase.kt68
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/ListStylesTest.kt45
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/NavigationIconTest.kt292
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/NavigationTest.kt414
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/SearchbarDataInstallerTest.kt50
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt139
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/SourceSetFilterTest.kt68
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/TabbedContentTest.kt188
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt113
-rw-r--r--plugins/base/src/test/kotlin/resourceLinks/ResourceLinksTest.kt301
-rw-r--r--plugins/base/src/test/kotlin/signatures/AbstractRenderingTest.kt65
-rw-r--r--plugins/base/src/test/kotlin/signatures/DivergentSignatureTest.kt73
-rw-r--r--plugins/base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt312
-rw-r--r--plugins/base/src/test/kotlin/signatures/InheritedAccessorsSignatureTest.kt461
-rw-r--r--plugins/base/src/test/kotlin/signatures/ObviousTypeSkippingTest.kt206
-rw-r--r--plugins/base/src/test/kotlin/signatures/RawHtmlRenderingTest.kt70
-rw-r--r--plugins/base/src/test/kotlin/signatures/SignatureTest.kt1035
-rw-r--r--plugins/base/src/test/kotlin/signatures/VarianceSignatureTest.kt108
-rw-r--r--plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt366
-rw-r--r--plugins/base/src/test/kotlin/superFields/PsiSuperFieldsTest.kt177
-rw-r--r--plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt195
-rw-r--r--plugins/base/src/test/kotlin/transformers/AbstractContextModuleAndPackageDocumentationReaderTest.kt27
-rw-r--r--plugins/base/src/test/kotlin/transformers/CommentsToContentConverterTest.kt484
-rw-r--r--plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest1.kt187
-rw-r--r--plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest3.kt61
-rw-r--r--plugins/base/src/test/kotlin/transformers/DivisionSwitchTest.kt126
-rw-r--r--plugins/base/src/test/kotlin/transformers/InheritedEntriesDocumentableFilterTransfromerTest.kt162
-rw-r--r--plugins/base/src/test/kotlin/transformers/InvalidContentModuleAndPackageDocumentationReaderTest.kt100
-rw-r--r--plugins/base/src/test/kotlin/transformers/MergeImplicitExpectActualDeclarationsTest.kt386
-rw-r--r--plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerFunctionalTest.kt137
-rw-r--r--plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerUnitTest.kt260
-rw-r--r--plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt229
-rw-r--r--plugins/base/src/test/kotlin/transformers/ReportUndocumentedTransformerTest.kt927
-rw-r--r--plugins/base/src/test/kotlin/transformers/SourceLinkTransformerTest.kt131
-rw-r--r--plugins/base/src/test/kotlin/transformers/SuppressTagFilterTest.kt211
-rw-r--r--plugins/base/src/test/kotlin/transformers/SuppressedByConfigurationDocumentableFilterTransformerTest.kt193
-rw-r--r--plugins/base/src/test/kotlin/transformers/isExceptionTest.kt147
-rw-r--r--plugins/base/src/test/kotlin/translators/AccessorMethodNamingTest.kt123
-rw-r--r--plugins/base/src/test/kotlin/translators/Bug1341.kt48
-rw-r--r--plugins/base/src/test/kotlin/translators/DefaultDescriptorToDocumentableTranslatorTest.kt1107
-rw-r--r--plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt1027
-rw-r--r--plugins/base/src/test/kotlin/translators/ExternalDocumentablesTest.kt144
-rw-r--r--plugins/base/src/test/kotlin/translators/JavadocInheritDocsTest.kt312
-rw-r--r--plugins/base/src/test/kotlin/translators/JavadocInheritedDocTagsTest.kt252
-rw-r--r--plugins/base/src/test/kotlin/translators/JavadocParserTest.kt208
-rw-r--r--plugins/base/src/test/kotlin/translators/utils.kt43
-rw-r--r--plugins/base/src/test/kotlin/utils/HtmlUtils.kt20
-rw-r--r--plugins/base/src/test/kotlin/utils/ModelUtils.kt43
-rw-r--r--plugins/base/src/test/kotlin/utils/TagsAnnotations.kt42
-rw-r--r--plugins/base/src/test/kotlin/utils/TestUtils.kt94
-rw-r--r--plugins/base/src/test/kotlin/utils/contentUtils.kt355
-rw-r--r--plugins/base/src/test/resources/content/samples/samples.kt9
-rw-r--r--plugins/base/src/test/resources/linkable/includes/include1.md14
-rw-r--r--plugins/base/src/test/resources/linkable/includes/include11.md3
-rw-r--r--plugins/base/src/test/resources/linkable/includes/include2.md7
-rw-r--r--plugins/base/src/test/resources/linkable/samples/jsMain/kotlin/JsClass.kt13
-rw-r--r--plugins/base/src/test/resources/linkable/samples/jsMain/resources/Samples.kt14
-rw-r--r--plugins/base/src/test/resources/linkable/samples/jvmMain/kotlin/JvmClass.kt13
-rw-r--r--plugins/base/src/test/resources/linkable/samples/jvmMain/resources/Samples.kt14
-rw-r--r--plugins/base/src/test/resources/linkable/sources/jsMain/kotlin/JsClass.kt7
-rw-r--r--plugins/base/src/test/resources/linkable/sources/jvmMain/kotlin/JvmClass.kt7
-rw-r--r--plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java5
-rw-r--r--plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java8
-rw-r--r--plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt9
-rw-r--r--plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt12
-rw-r--r--plugins/base/src/test/resources/locationProvider/jdk8-package-list217
-rw-r--r--plugins/base/src/test/resources/locationProvider/multi-module-package-list8
-rw-r--r--plugins/base/src/test/resources/locationProvider/old-package-list9
-rw-r--r--plugins/base/src/test/resources/locationProvider/stdlib-package-list67
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/Clock.kt19
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/House.kt28
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jsMain/kotlin/Clock.kt32
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmAndJsSecondCommonMain/kotlin/Greeter.kt14
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/Clock.kt43
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ClockDays.kt19
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/HtmlTest.kt24
-rw-r--r--plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ParticularClock.kt36
-rw-r--r--plugins/gfm/README.md17
-rw-r--r--plugins/gfm/api/gfm.api77
-rw-r--r--plugins/gfm/build.gradle.kts33
-rw-r--r--plugins/gfm/gfm-template-processing/api/gfm-template-processing.api14
-rw-r--r--plugins/gfm/gfm-template-processing/build.gradle.kts29
-rw-r--r--plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingPlugin.kt44
-rw-r--r--plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingStrategy.kt72
-rw-r--r--plugins/gfm/gfm-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/GfmPlugin.kt63
-rw-r--r--plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/gfmTemplating.kt39
-rw-r--r--plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/location/MarkdownLocationProvider.kt23
-rw-r--r--plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/BriefCommentPreprocessor.kt22
-rw-r--r--plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt414
-rw-r--r--plugins/gfm/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/gfm/src/test/kotlin/renderers/gfm/CodeWrappingTest.kt86
-rw-r--r--plugins/gfm/src/test/kotlin/renderers/gfm/DivergentTest.kt505
-rw-r--r--plugins/gfm/src/test/kotlin/renderers/gfm/GfmRenderingOnlyTestBase.kt34
-rw-r--r--plugins/gfm/src/test/kotlin/renderers/gfm/GroupWrappingTest.kt95
-rw-r--r--plugins/gfm/src/test/kotlin/renderers/gfm/SimpleElementsTest.kt393
-rw-r--r--plugins/gfm/src/test/kotlin/renderers/gfm/SourceSetDependentHintTest.kt184
-rw-r--r--plugins/javadoc/README.md19
-rw-r--r--plugins/javadoc/api/javadoc.api694
-rw-r--r--plugins/javadoc/build.gradle.kts37
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocDocumentableToPageTranslator.kt16
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt261
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPlugin.kt113
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProvider.kt147
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProviderFactory.kt17
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt206
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocIndexExtra.kt14
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocPageNodes.kt529
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/htmlPreprocessors.kt200
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt42
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToHtmlTranslator.kt90
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt312
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/KorteJavadocRenderer.kt213
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/SearchScriptsCreator.kt280
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/signatures/JavadocSignatureProvider.kt225
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilter.kt27
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder.kt83
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/utils.kt12
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker.kt28
-rw-r--r--plugins/javadoc/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/javadoc/src/main/resources/static_res/dokka-javadoc-stylesheet.css10
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/external/jquery/jquery.js10881
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_444444_256x240.pngbin7090 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_555555_256x240.pngbin7074 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777620_256x240.pngbin4618 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777777_256x240.pngbin7111 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_cc0000_256x240.pngbin4618 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_ffffff_256x240.pngbin6487 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-3.6.0.min.js2
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-migrate-3.4.0.min.js2
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.css1315
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.js19057
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.css7
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.js6
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.css886
-rw-r--r--plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.min.css5
-rw-r--r--plugins/javadoc/src/main/resources/static_res/resources/glass.pngbin499 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/resources/x.pngbin394 -> 0 bytes
-rw-r--r--plugins/javadoc/src/main/resources/static_res/search.js212
-rw-r--r--plugins/javadoc/src/main/resources/static_res/stylesheet.css889
-rw-r--r--plugins/javadoc/src/main/resources/views/class.korte329
-rw-r--r--plugins/javadoc/src/main/resources/views/components/base.korte19
-rw-r--r--plugins/javadoc/src/main/resources/views/components/bottomNavbar.korte20
-rw-r--r--plugins/javadoc/src/main/resources/views/components/head.korte18
-rw-r--r--plugins/javadoc/src/main/resources/views/components/indexPage.korte30
-rw-r--r--plugins/javadoc/src/main/resources/views/components/indexTable.korte18
-rw-r--r--plugins/javadoc/src/main/resources/views/components/navList.korte27
-rw-r--r--plugins/javadoc/src/main/resources/views/components/subNav.korte44
-rw-r--r--plugins/javadoc/src/main/resources/views/components/topNavbar.korte24
-rw-r--r--plugins/javadoc/src/main/resources/views/deprecated.korte40
-rw-r--r--plugins/javadoc/src/main/resources/views/indexPage.korte32
-rw-r--r--plugins/javadoc/src/main/resources/views/listPage.korte13
-rw-r--r--plugins/javadoc/src/main/resources/views/tabPage.korte4
-rw-r--r--plugins/javadoc/src/main/resources/views/treePage.korte48
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/AbstractJavadocTemplateMapTest.kt132
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/Asserts.kt22
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAccessorNamingTest.kt93
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAllClassesTemplateMapTest.kt54
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt461
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocDeprecatedTest.kt196
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocIndexTest.kt186
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocLocationTemplateMapTest.kt42
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocModuleTemplateMapTest.kt150
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocPackageTemplateMapTest.kt204
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocTest.kt4
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLinkingTest.kt78
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt272
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/packagelist/JavadocPackageListTest.kt80
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/search/JavadocIndexSearchTest.kt66
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilterTest.kt94
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredCheckerTest.kt96
-rw-r--r--plugins/jekyll/README.md17
-rw-r--r--plugins/jekyll/api/jekyll.api16
-rw-r--r--plugins/jekyll/build.gradle.kts26
-rw-r--r--plugins/jekyll/jekyll-template-processing/api/jekyll-template-processing.api6
-rw-r--r--plugins/jekyll/jekyll-template-processing/build.gradle.kts31
-rw-r--r--plugins/jekyll/jekyll-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/JekyllTemplateProcessingPlugin.kt44
-rw-r--r--plugins/jekyll/jekyll-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/jekyll/src/main/kotlin/JekyllPlugin.kt85
-rw-r--r--plugins/jekyll/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/kotlin-as-java/README.md15
-rw-r--r--plugins/kotlin-as-java/api/kotlin-as-java.api103
-rw-r--r--plugins/kotlin-as-java/build.gradle.kts35
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt16
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt55
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt65
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt508
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/jvmField.kt16
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/jvmName.kt23
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt18
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt16
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt17
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt227
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt44
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt42
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt116
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt37
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt19
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt9
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt35
-rw-r--r--plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt33
-rw-r--r--plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt548
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt129
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt170
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt190
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt60
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt71
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt618
-rw-r--r--plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt137
-rw-r--r--plugins/mathjax/README.md27
-rw-r--r--plugins/mathjax/api/mathjax.api18
-rw-r--r--plugins/mathjax/build.gradle.kts34
-rw-r--r--plugins/mathjax/src/main/kotlin/MathjaxPlugin.kt67
-rw-r--r--plugins/mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/mathjax/src/test/kotlin/MathjaxPluginTest.kt92
-rw-r--r--plugins/templating/README.md4
-rw-r--r--plugins/templating/api/templating.api185
-rw-r--r--plugins/templating/build.gradle.kts32
-rw-r--r--plugins/templating/src/main/kotlin/templates/AddToNavigationCommandHandler.kt62
-rw-r--r--plugins/templating/src/main/kotlin/templates/CommandHandler.kt25
-rw-r--r--plugins/templating/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt102
-rw-r--r--plugins/templating/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt16
-rw-r--r--plugins/templating/src/main/kotlin/templates/JsonElementBasedTemplateProcessingStrategy.kt67
-rw-r--r--plugins/templating/src/main/kotlin/templates/PackageListProcessingStrategy.kt56
-rw-r--r--plugins/templating/src/main/kotlin/templates/PathToRootSubstitutor.kt20
-rw-r--r--plugins/templating/src/main/kotlin/templates/ProjectNameSubstitutor.kt19
-rw-r--r--plugins/templating/src/main/kotlin/templates/ReplaceVersionCommandHandler.kt31
-rw-r--r--plugins/templating/src/main/kotlin/templates/SourcesetDependencyProcessingStrategy.kt40
-rw-r--r--plugins/templating/src/main/kotlin/templates/SubstitutionCommandHandler.kt71
-rw-r--r--plugins/templating/src/main/kotlin/templates/Substitutor.kt11
-rw-r--r--plugins/templating/src/main/kotlin/templates/TemplateProcessor.kt104
-rw-r--r--plugins/templating/src/main/kotlin/templates/TemplatingPlugin.kt80
-rw-r--r--plugins/templating/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToNavigationCommandResolutionTest.kt143
-rw-r--r--plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToSearchCommandResolutionTest.kt82
-rw-r--r--plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/SubstitutionCommandResolutionTest.kt110
-rw-r--r--plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TemplatingDokkaTestGenerator.kt74
-rw-r--r--plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingGeneration.kt34
-rw-r--r--plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingPlugin.kt26
-rw-r--r--plugins/versioning/README.md332
-rw-r--r--plugins/versioning/api/versioning.api149
-rw-r--r--plugins/versioning/build.gradle.kts35
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/DefaultPreviousDocumentationCopyPostAction.kt60
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionCommandConsumer.kt54
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionsCommand.kt29
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningConfiguration.kt38
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningPlugin.kt70
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningStorage.kt72
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsNavigationCreator.kt91
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsOrdering.kt26
-rw-r--r--plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/htmlPreprocessors.kt46
-rw-r--r--plugins/versioning/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin5
-rw-r--r--plugins/versioning/src/main/resources/dokka/not-found-version.html193
-rw-r--r--plugins/versioning/src/main/resources/dokka/styles/multimodule.css55
-rw-r--r--plugins/versioning/versioning-plugin-example.pngbin43684 -> 0 bytes
556 files changed, 0 insertions, 117164 deletions
diff --git a/plugins/README.md b/plugins/README.md
deleted file mode 100644
index 00e0396f..00000000
--- a/plugins/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Dokka plugins
-
-| Plugin project | Description |
-|------------------------------------------------|-----------------------------------------------------------------------------------------------|
-| [all-modules-page](all-modules-page) | Provides the ability to generate multi-module documentation. |
-| [android-documentation](android-documentation) | Improves documentation experience on the Android platform. |
-| [base](base) | Includes base Dokka features and extensions, along with the built-in HTML format |
-| [gfm](gfm) | Provides the ability to generate documentation in `GitHub Flavoured Markdown` format. |
-| [javadoc](javadoc) | Provides the ability to generate documentation in Javadoc format. |
-| [jekyll](jekyll) | Provides the ability to generate documentation in `Jekyll Flavoured Markdown` format. |
-| [kotlin-as-java](kotlin-as-java) | Renders all Kotlin signatures as Java signatures. |
-| [mathjax](mathjax) | Allows rendering mathematics in the web pages. |
-| [templating](templating) | An internal Dokka plugin that handles HTML template processing. |
-| [versioning](versioning) | Provides the ability to host documentation for multiple versions of your library/application. |
diff --git a/plugins/all-modules-page/README.md b/plugins/all-modules-page/README.md
deleted file mode 100644
index 459c3ef5..00000000
--- a/plugins/all-modules-page/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# All Modules plugin
-
-The All Modules plugin is used for documenting multi-module projects. It creates a common table of contents
-for all submodules and helps resolve cross-module links and resource locations.
-
-You can find the All Modules plugin on
-[Maven Central](https://mvnrepository.com/artifact/org.jetbrains.dokka/all-modules-page-plugin).
diff --git a/plugins/all-modules-page/api/all-modules-page.api b/plugins/all-modules-page/api/all-modules-page.api
deleted file mode 100644
index 3e6dc898..00000000
--- a/plugins/all-modules-page/api/all-modules-page.api
+++ /dev/null
@@ -1,87 +0,0 @@
-public final class org/jetbrains/dokka/allModulesPage/AllModulesPageGeneration : org/jetbrains/dokka/generation/Generation {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun createAllModulesPage (Lorg/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public final fun finishProcessingSubmodules ()V
- public fun generate (Lorg/jetbrains/dokka/Timer;)V
- public fun getGenerationName ()Ljava/lang/String;
- public final fun processMultiModule (Lorg/jetbrains/dokka/pages/RootPageNode;)V
- public final fun processSubmodules ()Lorg/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext;
- public final fun render (Lorg/jetbrains/dokka/pages/RootPageNode;)V
- public final fun runPostActions ()V
- public final fun transformAllModulesPage (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext : org/jetbrains/dokka/transformers/pages/CreationContext {
- public fun <init> (Ljava/util/List;)V
- public fun <init> (Lorg/jetbrains/dokka/templates/TemplatingResult;)V
- public final fun component1 ()Ljava/util/List;
- public final fun copy (Ljava/util/List;)Lorg/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getNonEmptyModules ()Ljava/util/List;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/AllModulesPagePlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getAllModulesPageCreator ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getAllModulesPageCreators ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getAllModulesPageGeneration ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getAllModulesPageTransformer ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getBaseLocationProviderFactory ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getExternalModuleLinkResolver ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getMultiModuleLinkResolver ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getMultimoduleLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPartialLocationProviderFactory ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getResolveLinkCommandHandler ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/DefaultExternalModuleLinkResolver : org/jetbrains/dokka/allModulesPage/ExternalModuleLinkResolver {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun resolve (Lorg/jetbrains/dokka/links/DRI;Ljava/io/File;)Ljava/lang/String;
- public fun resolveLinkToModuleIndex (Ljava/lang/String;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/allModulesPage/ExternalModuleLinkResolver {
- public abstract fun resolve (Lorg/jetbrains/dokka/links/DRI;Ljava/io/File;)Ljava/lang/String;
- public abstract fun resolveLinkToModuleIndex (Ljava/lang/String;)Ljava/lang/String;
-}
-
-public class org/jetbrains/dokka/allModulesPage/MultimoduleLocationProvider : org/jetbrains/dokka/base/resolvers/local/DokkaBaseLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun ancestors (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/util/List;
- public final fun getExtension ()Ljava/lang/String;
- public fun pathToRoot (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public fun resolve (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public fun resolve (Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;Z)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/MultimoduleLocationProvider$Factory : org/jetbrains/dokka/base/resolvers/local/LocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun getLocationProvider (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/MultimodulePageCreator : org/jetbrains/dokka/transformers/pages/PageCreator {
- public static final field Companion Lorg/jetbrains/dokka/allModulesPage/MultimodulePageCreator$Companion;
- public static final field MULTIMODULE_PACKAGE_PLACEHOLDER Ljava/lang/String;
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/allModulesPage/AllModulesPageGeneration$DefaultAllModulesContext;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public synthetic fun invoke (Lorg/jetbrains/dokka/transformers/pages/CreationContext;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/MultimodulePageCreator$Companion {
- public final fun getMULTIMODULE_ROOT_DRI ()Lorg/jetbrains/dokka/links/DRI;
-}
-
-public final class org/jetbrains/dokka/allModulesPage/ResolveLinkCommandHandler : org/jetbrains/dokka/templates/CommandHandler {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canHandle (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun finish (Ljava/io/File;)V
- public fun handleCommand (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsTag (Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
diff --git a/plugins/all-modules-page/build.gradle.kts b/plugins/all-modules-page/build.gradle.kts
deleted file mode 100644
index c596837b..00000000
--- a/plugins/all-modules-page/build.gradle.kts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-registerDokkaArtifactPublication("dokkaAllModulesPage") {
- artifactId = "all-modules-page-plugin"
-}
-
-dependencies {
- compileOnly(projects.core)
- compileOnly(projects.subprojects.analysisKotlinApi)
-
- implementation(projects.plugins.base)
- implementation(projects.plugins.templating)
-
- implementation(projects.subprojects.analysisMarkdownJb)
-
- implementation(libs.kotlinx.html)
-
- testImplementation(kotlin("test"))
- testImplementation(projects.plugins.base)
- testImplementation(projects.plugins.base.baseTestUtils)
- testImplementation(projects.plugins.gfm)
- testImplementation(projects.plugins.gfm.gfmTemplateProcessing)
- testImplementation(projects.core.contentMatcherTestUtils)
- testImplementation(projects.core.testApi)
-}
diff --git a/plugins/all-modules-page/src/main/kotlin/AllModulesPageGeneration.kt b/plugins/all-modules-page/src/main/kotlin/AllModulesPageGeneration.kt
deleted file mode 100644
index 11d2d32c..00000000
--- a/plugins/all-modules-page/src/main/kotlin/AllModulesPageGeneration.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.Timer
-import org.jetbrains.dokka.generation.Generation
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.templates.TemplatingPlugin
-import org.jetbrains.dokka.templates.TemplatingResult
-import org.jetbrains.dokka.transformers.pages.CreationContext
-
-public class AllModulesPageGeneration(private val context: DokkaContext) : Generation {
-
- private val allModulesPagePlugin by lazy { context.plugin<AllModulesPagePlugin>() }
- private val templatingPlugin by lazy { context.plugin<TemplatingPlugin>() }
-
- override fun Timer.generate() {
- report("Processing submodules")
- val generationContext = processSubmodules()
-
- report("Creating all modules page")
- val pages = createAllModulesPage(generationContext)
-
- report("Transforming pages")
- val transformedPages = transformAllModulesPage(pages)
-
- report("Rendering")
- render(transformedPages)
-
- report("Processing multimodule")
- processMultiModule(transformedPages)
-
- report("Finish submodule processing")
- finishProcessingSubmodules()
-
- report("Running post-actions")
- runPostActions()
- }
-
- override val generationName: String = "index page for project"
-
- public fun createAllModulesPage(allModulesContext: DefaultAllModulesContext): RootPageNode =
- allModulesPagePlugin.querySingle { allModulesPageCreator }.invoke(allModulesContext)
-
- public fun transformAllModulesPage(pages: RootPageNode): RootPageNode =
- allModulesPagePlugin.query { allModulesPageTransformer }.fold(pages) { acc, t -> t(acc) }
-
- public fun render(transformedPages: RootPageNode) {
- context.single(CoreExtensions.renderer).render(transformedPages)
- }
-
- public fun runPostActions() {
- context[CoreExtensions.postActions].forEach { it() }
- }
-
- public fun processSubmodules(): DefaultAllModulesContext {
- return templatingPlugin.querySingle { submoduleTemplateProcessor }
- .process(context.configuration.modules)
- .let { DefaultAllModulesContext(it) }
- }
-
- public fun processMultiModule(root: RootPageNode) {
- templatingPlugin.querySingle { multimoduleTemplateProcessor }.process(root)
- }
-
- public fun finishProcessingSubmodules() {
- templatingPlugin.query { templateProcessingStrategy }.forEach { it.finish(context.configuration.outputDir) }
- }
-
- public data class DefaultAllModulesContext(val nonEmptyModules: List<String>) : CreationContext {
- public constructor(templating: TemplatingResult) : this(templating.modules)
- }
-}
diff --git a/plugins/all-modules-page/src/main/kotlin/AllModulesPagePlugin.kt b/plugins/all-modules-page/src/main/kotlin/AllModulesPagePlugin.kt
deleted file mode 100644
index 06202082..00000000
--- a/plugins/all-modules-page/src/main/kotlin/AllModulesPagePlugin.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.generation.Generation
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.templates.CommandHandler
-import org.jetbrains.dokka.templates.TemplatingPlugin
-import org.jetbrains.dokka.transformers.pages.PageCreator
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class AllModulesPagePlugin : DokkaPlugin() {
-
- public val partialLocationProviderFactory: ExtensionPoint<LocationProviderFactory> by extensionPoint()
- public val allModulesPageCreator: ExtensionPoint<PageCreator<AllModulesPageGeneration.DefaultAllModulesContext>> by extensionPoint()
- public val allModulesPageTransformer: ExtensionPoint<PageTransformer> by extensionPoint()
- public val externalModuleLinkResolver: ExtensionPoint<ExternalModuleLinkResolver> by extensionPoint()
-
- public val allModulesPageCreators: Extension<PageCreator<AllModulesPageGeneration.DefaultAllModulesContext>, *, *> by extending {
- allModulesPageCreator providing ::MultimodulePageCreator
- }
-
- private val dokkaBase: DokkaBase by lazy { plugin<DokkaBase>() }
-
- public val multimoduleLocationProvider: Extension<LocationProviderFactory, *, *> by extending {
- (dokkaBase.locationProviderFactory
- providing MultimoduleLocationProvider::Factory
- override plugin<DokkaBase>().locationProvider)
- }
-
- public val baseLocationProviderFactory: Extension<LocationProviderFactory, *, *> by extending {
- partialLocationProviderFactory providing ::DokkaLocationProviderFactory
- }
-
- public val allModulesPageGeneration: Extension<Generation, *, *> by extending {
- (CoreExtensions.generation
- providing ::AllModulesPageGeneration
- override dokkaBase.singleGeneration)
- }
-
- public val resolveLinkCommandHandler: Extension<CommandHandler, *, *> by extending {
- plugin<TemplatingPlugin>().directiveBasedCommandHandlers providing ::ResolveLinkCommandHandler
- }
-
- public val multiModuleLinkResolver: Extension<ExternalModuleLinkResolver, *, *> by extending {
- externalModuleLinkResolver providing ::DefaultExternalModuleLinkResolver
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/all-modules-page/src/main/kotlin/ExternalModuleLinkResolver.kt b/plugins/all-modules-page/src/main/kotlin/ExternalModuleLinkResolver.kt
deleted file mode 100644
index da747bda..00000000
--- a/plugins/all-modules-page/src/main/kotlin/ExternalModuleLinkResolver.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaModuleDescription
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.resolvers.shared.PackageList.Companion.PACKAGE_LIST_NAME
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import java.io.File
-import java.net.URL
-
-public interface ExternalModuleLinkResolver {
- public fun resolve(dri: DRI, fileContext: File): String?
- public fun resolveLinkToModuleIndex(moduleName: String): String?
-}
-
-public class DefaultExternalModuleLinkResolver(
- public val context: DokkaContext
-) : ExternalModuleLinkResolver {
- private val elpFactory = context.plugin<DokkaBase>().query { externalLocationProviderFactory }
- private val externalDocumentations by lazy(::setupExternalDocumentations)
- private val elps by lazy {
- elpFactory.flatMap { externalDocumentations.map { ed -> it.getExternalLocationProvider(ed) } }.filterNotNull()
- }
-
- private fun setupExternalDocumentations(): List<ExternalDocumentation> =
- context.configuration.modules.mapNotNull { module ->
- loadPackageListForModule(module)?.let { packageList ->
- ExternalDocumentation(
- URL("file:/${module.relativePathToOutputDirectory.toRelativeOutputDir()}"),
- packageList
- )
- }
- }
-
-
- private fun File.toRelativeOutputDir(): File = if (isAbsolute) {
- relativeToOrSelf(context.configuration.outputDir)
- } else {
- this
- }
-
- private fun loadPackageListForModule(module: DokkaModuleDescription) =
- module.sourceOutputDirectory.walkTopDown().maxDepth(3).firstOrNull { it.name == PACKAGE_LIST_NAME }?.let {
- PackageList.load(
- URL("file:" + it.path),
- 8,
- true
- )
- }
-
- override fun resolve(dri: DRI, fileContext: File): String? {
- val absoluteLink = elps.mapNotNull { it.resolve(dri) }.firstOrNull() ?: return null
- val modulePath = context.configuration.outputDir.absolutePath.split(File.separator)
- val contextPath = fileContext.absolutePath.split(File.separator)
- val commonPathElements = modulePath.zip(contextPath)
- .takeWhile { (a, b) -> a == b }.count()
-
- return (List(contextPath.size - commonPathElements - 1) { ".." } + modulePath.drop(commonPathElements)).joinToString(
- "/"
- ) + absoluteLink.removePrefix("file:")
- }
-
- override fun resolveLinkToModuleIndex(moduleName: String): String? =
- context.configuration.modules.firstOrNull { it.name == moduleName }
- ?.let { module ->
- val packageList = loadPackageListForModule(module)
- val extension = packageList?.linkFormat?.linkExtension?.let { ".$it" }.orEmpty()
- "${module.relativePathToOutputDirectory}/index$extension"
- }
-
-}
diff --git a/plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt b/plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt
deleted file mode 100644
index b0fa13d0..00000000
--- a/plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.allModulesPage.MultimodulePageCreator.Companion.MULTIMODULE_PACKAGE_PLACEHOLDER
-import org.jetbrains.dokka.base.resolvers.local.DokkaBaseLocationProvider
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-
-public open class MultimoduleLocationProvider(
- private val root: RootPageNode, dokkaContext: DokkaContext,
- public val extension: String = ".html"
-) : DokkaBaseLocationProvider(root, dokkaContext) {
-
- private val defaultLocationProvider =
- dokkaContext.plugin<AllModulesPagePlugin>().querySingle { partialLocationProviderFactory }
- .getLocationProvider(root)
- private val externalModuleLinkResolver =
- dokkaContext.plugin<AllModulesPagePlugin>().querySingle { externalModuleLinkResolver }
-
- override fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode?): String? {
- return if (dri == MultimodulePageCreator.MULTIMODULE_ROOT_DRI) {
- pathToRoot(root) + "index"
- } else {
- dri.takeIf { it.packageName == MULTIMODULE_PACKAGE_PLACEHOLDER }
- ?.classNames
- ?.let(externalModuleLinkResolver::resolveLinkToModuleIndex)
- }
- }
-
- override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean): String? {
- return if (node is ContentPage && MultimodulePageCreator.MULTIMODULE_ROOT_DRI in node.dri) {
- pathToRoot(root) + "index" + if (!skipExtension) extension else ""
- } else {
- defaultLocationProvider.resolve(node, context, skipExtension)
- }
- }
-
- override fun pathToRoot(from: PageNode): String = defaultLocationProvider.pathToRoot(from)
-
- override fun ancestors(node: PageNode): List<PageNode> = listOf(root)
-
- public class Factory(
- private val context: DokkaContext
- ) : LocationProviderFactory {
- override fun getLocationProvider(pageNode: RootPageNode): LocationProvider =
- MultimoduleLocationProvider(pageNode, context)
- }
-}
diff --git a/plugins/all-modules-page/src/main/kotlin/MultimodulePageCreator.kt b/plugins/all-modules-page/src/main/kotlin/MultimodulePageCreator.kt
deleted file mode 100644
index 7b832d21..00000000
--- a/plugins/all-modules-page/src/main/kotlin/MultimodulePageCreator.kt
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaModuleDescription
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.analysis.markdown.jb.MarkdownParser
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
-import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.doc.DocTag
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.model.doc.P
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.pages.PageCreator
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import java.io.File
-
-public class MultimodulePageCreator(
- private val context: DokkaContext,
-) : PageCreator<AllModulesPageGeneration.DefaultAllModulesContext> {
- private val commentsConverter by lazy { context.plugin<DokkaBase>().querySingle { commentsToContentConverter } }
- private val signatureProvider by lazy { context.plugin<DokkaBase>().querySingle { signatureProvider } }
- private val moduleDocumentationReader by lazy { context.plugin<InternalKotlinAnalysisPlugin>().querySingle { moduleAndPackageDocumentationReader } }
-
- override fun invoke(creationContext: AllModulesPageGeneration.DefaultAllModulesContext): RootPageNode {
- val modules = context.configuration.modules
- val sourceSetData = emptySet<DokkaSourceSet>()
- val builder = PageContentBuilder(commentsConverter, signatureProvider, context.logger)
- val contentNode = builder.contentFor(
- dri = DRI(MULTIMODULE_PACKAGE_PLACEHOLDER),
- kind = ContentKind.Cover,
- sourceSets = sourceSetData
- ) {
- getMultiModuleDocumentation(context.configuration.includes).takeIf { it.isNotEmpty() }?.let { nodes ->
- group(kind = ContentKind.Cover) {
- nodes.forEach { node ->
- group {
- node.children.forEach { comment(it.root) }
- }
- }
- }
- }
- header(2, "All modules:")
- table(styles = setOf(MultimoduleTable)) {
- header { group { text("Name") } }
- modules.filter { it.name in creationContext.nonEmptyModules }.sortedBy { it.name }
- .forEach { module ->
- val displayedModuleDocumentation = getDisplayedModuleDocumentation(module)
- val dri = DRI(packageName = MULTIMODULE_PACKAGE_PLACEHOLDER, classNames = module.name)
- val dci = DCI(setOf(dri), ContentKind.Comment)
- val extraWithAnchor = PropertyContainer.withAll(SymbolAnchorHint(module.name, ContentKind.Main))
- row(setOf(dri), emptySet(), styles = emptySet(), extra = extraWithAnchor) {
- +linkNode(module.name, dri, DCI(setOf(dri), ContentKind.Main), extra = extraWithAnchor)
- +ContentGroup(
- children =
- if (displayedModuleDocumentation != null)
- DocTagToContentConverter().buildContent(
- displayedModuleDocumentation,
- dci,
- emptySet()
- )
- else emptyList(),
- dci = dci,
- sourceSets = emptySet(),
- style = emptySet()
- )
- }
- }
- }
- }
- return MultimoduleRootPageNode(
- setOf(MULTIMODULE_ROOT_DRI),
- contentNode
- )
- }
-
- private fun getMultiModuleDocumentation(files: Set<File>): List<DocumentationNode> =
- files.map { MarkdownParser({ null }, it.absolutePath).parse(it.readText()) }
-
- private fun getDisplayedModuleDocumentation(module: DokkaModuleDescription): P? {
- return moduleDocumentationReader.read(module)?.firstParagraph()
- }
-
- private fun DocumentationNode.firstParagraph(): P? =
- this.children
- .map { it.root }
- .mapNotNull { it.firstParagraph() }
- .firstOrNull()
-
- /**
- * @return The very first, most inner paragraph. If any [P] is wrapped inside another [P], the inner one
- * is preferred.
- */
- private fun DocTag.firstParagraph(): P? {
- val firstChildParagraph = children.mapNotNull { it.firstParagraph() }.firstOrNull()
- return if (firstChildParagraph == null && this is P) this
- else firstChildParagraph
- }
-
- public companion object {
- public const val MULTIMODULE_PACKAGE_PLACEHOLDER: String = ".ext"
- public val MULTIMODULE_ROOT_DRI: DRI =
- DRI(packageName = MULTIMODULE_PACKAGE_PLACEHOLDER, classNames = "allModules")
- }
-}
diff --git a/plugins/all-modules-page/src/main/kotlin/ResolveLinkCommandHandler.kt b/plugins/all-modules-page/src/main/kotlin/ResolveLinkCommandHandler.kt
deleted file mode 100644
index f6d34271..00000000
--- a/plugins/all-modules-page/src/main/kotlin/ResolveLinkCommandHandler.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ResolveLinkCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.templates.CommandHandler
-import org.jsoup.nodes.Attributes
-import org.jsoup.nodes.Element
-import org.jsoup.parser.Tag
-import java.io.File
-
-public class ResolveLinkCommandHandler(context: DokkaContext) : CommandHandler {
-
- private val externalModuleLinkResolver =
- context.plugin<AllModulesPagePlugin>().querySingle { externalModuleLinkResolver }
-
- override fun handleCommandAsTag(command: Command, body: Element, input: File, output: File) {
- command as ResolveLinkCommand
- val link = externalModuleLinkResolver.resolve(command.dri, output)
- if (link == null) {
- val children = body.childNodes().toList()
- val attributes = Attributes().apply {
- put("data-unresolved-link", command.dri.toString())
- }
- val el = Element(Tag.valueOf("span"), "", attributes).apply {
- children.forEach { ch -> appendChild(ch) }
- }
- body.replaceWith(el)
- return
- }
-
- val attributes = Attributes().apply {
- put("href", link)
- }
- val children = body.childNodes().toList()
- val el = Element(Tag.valueOf("a"), "", attributes).apply {
- children.forEach { ch -> appendChild(ch) }
- }
- body.replaceWith(el)
- }
-
- override fun canHandle(command: Command): Boolean = command is ResolveLinkCommand
-}
diff --git a/plugins/all-modules-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/all-modules-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index f50db659..00000000
--- a/plugins/all-modules-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.allModulesPage.AllModulesPagePlugin
diff --git a/plugins/all-modules-page/src/test/kotlin/MultiModuleDokkaTestGenerator.kt b/plugins/all-modules-page/src/test/kotlin/MultiModuleDokkaTestGenerator.kt
deleted file mode 100644
index f3548e4c..00000000
--- a/plugins/all-modules-page/src/test/kotlin/MultiModuleDokkaTestGenerator.kt
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaGenerator
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.testApi.logger.TestLogger
-import org.jetbrains.dokka.testApi.testRunner.AbstractTest
-import org.jetbrains.dokka.testApi.testRunner.DokkaTestGenerator
-import org.jetbrains.dokka.testApi.testRunner.TestBuilder
-import org.jetbrains.dokka.testApi.testRunner.TestMethods
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-
-class MultiModuleDokkaTestGenerator(
- configuration: DokkaConfiguration,
- logger: DokkaLogger,
- testMethods: MultiModuleTestMethods,
- additionalPlugins: List<DokkaPlugin> = emptyList()
-) : DokkaTestGenerator<MultiModuleTestMethods>(
- configuration,
- logger,
- testMethods,
- additionalPlugins + AllModulesPagePlugin()
-) {
- override fun generate() = with(testMethods) {
- val dokkaGenerator = DokkaGenerator(configuration, logger)
-
- val context =
- dokkaGenerator.initializePlugins(configuration, logger, additionalPlugins + AllModulesPagePlugin())
- pluginsSetupStage(context)
-
- val generation = context.single(CoreExtensions.generation) as AllModulesPageGeneration
-
- val generationContext = generation.processSubmodules()
- submoduleProcessingStage(context)
-
- val allModulesPage = generation.createAllModulesPage(generationContext)
- allModulesPageCreationStage(allModulesPage)
-
- val transformedPages = generation.transformAllModulesPage(allModulesPage)
- pagesTransformationStage(transformedPages)
-
- generation.render(transformedPages)
- renderingStage(transformedPages, context)
-
- generation.processMultiModule(transformedPages)
- processMultiModule(transformedPages)
-
- generation.finishProcessingSubmodules()
- finishProcessingSubmodules(context)
- }
-
-}
-
-open class MultiModuleTestMethods(
- open val pluginsSetupStage: (DokkaContext) -> Unit,
- open val allModulesPageCreationStage: (RootPageNode) -> Unit,
- open val pagesTransformationStage: (RootPageNode) -> Unit,
- open val renderingStage: (RootPageNode, DokkaContext) -> Unit,
- open val submoduleProcessingStage: (DokkaContext) -> Unit,
- open val processMultiModule: (RootPageNode) -> Unit,
- open val finishProcessingSubmodules: (DokkaContext) -> Unit,
-) : TestMethods
-
-class MultiModuleTestBuilder : TestBuilder<MultiModuleTestMethods>() {
- var pluginsSetupStage: (DokkaContext) -> Unit = {}
- var allModulesPageCreationStage: (RootPageNode) -> Unit = {}
- var pagesTransformationStage: (RootPageNode) -> Unit = {}
- var renderingStage: (RootPageNode, DokkaContext) -> Unit = { _, _ -> }
- var submoduleProcessingStage: (DokkaContext) -> Unit = {}
- var processMultiModule: (RootPageNode) -> Unit = {}
- var finishProcessingSubmodules: (DokkaContext) -> Unit = {}
-
- override fun build() = MultiModuleTestMethods(
- pluginsSetupStage,
- allModulesPageCreationStage,
- pagesTransformationStage,
- renderingStage,
- submoduleProcessingStage,
- processMultiModule,
- finishProcessingSubmodules
- )
-}
-
-abstract class MultiModuleAbstractTest(logger: TestLogger = TestLogger(DokkaConsoleLogger(LoggingLevel.DEBUG))) :
- AbstractTest<MultiModuleTestMethods, MultiModuleTestBuilder, MultiModuleDokkaTestGenerator>(
- ::MultiModuleTestBuilder,
- ::MultiModuleDokkaTestGenerator,
- logger,
- )
diff --git a/plugins/all-modules-page/src/test/kotlin/templates/MultiModuleDocumentationTest.kt b/plugins/all-modules-page/src/test/kotlin/templates/MultiModuleDocumentationTest.kt
deleted file mode 100644
index 3d9636ef..00000000
--- a/plugins/all-modules-page/src/test/kotlin/templates/MultiModuleDocumentationTest.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage.templates
-
-import matchers.content.*
-import org.jetbrains.dokka.allModulesPage.MultiModuleAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.ContentResolvedLink
-import org.jetbrains.dokka.pages.MultimoduleRootPageNode
-import org.junit.jupiter.api.io.TempDir
-import java.io.File
-import kotlin.test.AfterTest
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class MultiModuleDocumentationTest : MultiModuleAbstractTest() {
-
- @field:TempDir
- lateinit var tempDir: File
-
- val documentationContent = """
- # Sample project
- Sample documentation with [external link](https://www.google.pl)
- """.trimIndent()
-
- @BeforeTest
- fun setup() {
- tempDir.resolve("README.md").writeText(documentationContent)
- }
-
- @AfterTest
- fun teardown(){
- tempDir.resolve("README.md").delete()
- }
-
- @Test
- fun `documentation should be included in all modules page`() {
- val configuration = dokkaConfiguration {
- includes = listOf(tempDir.resolve("README.md"))
- }
-
- testFromData(configuration) {
- allModulesPageCreationStage = { rootPage ->
- (rootPage as? MultimoduleRootPageNode)?.content?.dfs { it.dci.kind == ContentKind.Cover }?.children?.firstOrNull()
- ?.assertNode {
- group {
- group {
- group {
- header(1) {
- +"Sample project"
- }
- group {
- +"Sample documentation with "
- link {
- +"external link"
- check {
- assertEquals(
- "https://www.google.pl",
- (this as ContentResolvedLink).address
- )
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkCommandResolutionTest.kt b/plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkCommandResolutionTest.kt
deleted file mode 100644
index 32b06a5b..00000000
--- a/plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkCommandResolutionTest.kt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage.templates
-
-import kotlinx.html.a
-import kotlinx.html.span
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.DokkaModuleDescriptionImpl
-import org.jetbrains.dokka.allModulesPage.MultiModuleAbstractTest
-import org.jetbrains.dokka.base.renderers.html.templateCommand
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.base.templating.ResolveLinkCommand
-import org.jetbrains.dokka.links.DRI
-import org.junit.jupiter.api.io.TempDir
-import utils.assertHtmlEqualsIgnoringWhitespace
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class ResolveLinkCommandResolutionTest : MultiModuleAbstractTest() {
-
- @Test
- fun `should resolve link to another module`(@TempDir outputDirectory: File) {
- val testedDri = DRI(
- packageName = "package2",
- classNames = "Sample",
- )
- val link = createHTML().templateCommand(ResolveLinkCommand(testedDri)) {
- span {
- +"Sample"
- }
- }
-
- val expected = createHTML().a {
- href = "../module2/package2/-sample/index.html"
- span {
- +"Sample"
- }
- }
-
- val contentFile = setup(outputDirectory, link)
- val configuration = createConfiguration(outputDirectory)
-
- testFromData(configuration, useOutputLocationFromConfig = true) {
- finishProcessingSubmodules = {
- assertHtmlEqualsIgnoringWhitespace(expected, contentFile.readText())
- }
- }
- }
-
- @Test
- fun `should produce content when link is not resolvable`(@TempDir outputDirectory: File) {
- val testedDri = DRI(
- packageName = "not-resolvable-package",
- classNames = "Sample",
- )
- val link = createHTML().templateCommand(ResolveLinkCommand(testedDri)) {
- span {
- +"Sample"
- }
- }
-
- val expected = createHTML().span {
- attributes["data-unresolved-link"] = testedDri.toString()
- span {
- +"Sample"
- }
- }
-
- val contentFile = setup(outputDirectory, link)
- val configuration = createConfiguration(outputDirectory)
-
- testFromData(configuration, useOutputLocationFromConfig = true) {
- finishProcessingSubmodules = {
- assertHtmlEqualsIgnoringWhitespace(expected, contentFile.readText())
- }
- }
- }
-
- private fun setup(outputDirectory: File, content: String): File {
- val innerModule1 = outputDirectory.resolve("module1").also { assertTrue(it.mkdirs()) }
- val innerModule2 = outputDirectory.resolve("module2").also { assertTrue(it.mkdirs()) }
- val packageList = innerModule2.resolve("package-list")
- packageList.writeText(mockedPackageListForPackages(RecognizedLinkFormat.DokkaHtml, "package2"))
- val contentFile = innerModule1.resolve("index.html")
- contentFile.writeText(content)
- return contentFile
- }
-
- private fun createConfiguration(outputDirectory: File) = dokkaConfiguration {
- modules = listOf(
- DokkaModuleDescriptionImpl(
- name = "module1",
- relativePathToOutputDirectory = outputDirectory.resolve("module1"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module1"),
- ),
- DokkaModuleDescriptionImpl(
- name = "module2",
- relativePathToOutputDirectory = outputDirectory.resolve("module2"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module2"),
- )
- )
- this.outputDir = outputDirectory
- }
-}
diff --git a/plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkGfmCommandResolutionTest.kt b/plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkGfmCommandResolutionTest.kt
deleted file mode 100644
index b17d6765..00000000
--- a/plugins/all-modules-page/src/test/kotlin/templates/ResolveLinkGfmCommandResolutionTest.kt
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage.templates
-
-import org.jetbrains.dokka.DokkaModuleDescriptionImpl
-import org.jetbrains.dokka.allModulesPage.MultiModuleAbstractTest
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.gfm.GfmCommand.Companion.templateCommand
-import org.jetbrains.dokka.gfm.GfmPlugin
-import org.jetbrains.dokka.gfm.ResolveLinkGfmCommand
-import org.jetbrains.dokka.gfm.templateProcessing.GfmTemplateProcessingPlugin
-import org.jetbrains.dokka.links.DRI
-import org.junit.jupiter.api.io.TempDir
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class ResolveLinkGfmCommandResolutionTest : MultiModuleAbstractTest() {
-
- @Test
- fun `should resolve link to another module`(@TempDir outputDirectory: File) {
- val configuration = dokkaConfiguration {
- modules = listOf(
- DokkaModuleDescriptionImpl(
- name = "module1",
- relativePathToOutputDirectory = outputDirectory.resolve("module1"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module1"),
- ),
- DokkaModuleDescriptionImpl(
- name = "module2",
- relativePathToOutputDirectory = outputDirectory.resolve("module2"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module2"),
- )
- )
- outputDir = outputDirectory
- }
-
- val innerModule1 = outputDirectory.resolve("module1").also { assertTrue(it.mkdirs()) }
- val innerModule2 = outputDirectory.resolve("module2").also { assertTrue(it.mkdirs()) }
-
- val indexMd = innerModule1.resolve("index.md")
- val packageList = innerModule2.resolve("package-list")
-
- val indexMdContent = StringBuilder().apply {
- templateCommand(
- ResolveLinkGfmCommand(
- dri = DRI(
- packageName = "package2",
- classNames = "Sample",
- )
- )
- ) {
- append("Sample text inside")
- }
- }.toString()
-
- indexMd.writeText(indexMdContent)
- packageList.writeText(mockedPackageListForPackages(RecognizedLinkFormat.DokkaGFM, "package2"))
-
- testFromData(
- configuration,
- pluginOverrides = listOf(GfmTemplateProcessingPlugin(), GfmPlugin()),
- useOutputLocationFromConfig = true
- ) {
- finishProcessingSubmodules = {
- val expectedIndexMd = "[Sample text inside](../module2/package2/-sample/index.md)"
- assertEquals(expectedIndexMd, indexMd.readText().trim())
- }
- }
- }
-}
diff --git a/plugins/all-modules-page/src/test/kotlin/templates/mockedPackageListFactory.kt b/plugins/all-modules-page/src/test/kotlin/templates/mockedPackageListFactory.kt
deleted file mode 100644
index e4ee4eaa..00000000
--- a/plugins/all-modules-page/src/test/kotlin/templates/mockedPackageListFactory.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage.templates
-
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-
-internal fun mockedPackageListForPackages(format: RecognizedLinkFormat, vararg packages: String): String =
- """
- ${PackageList.DOKKA_PARAM_PREFIX}.format:${format.formatName}
- ${PackageList.DOKKA_PARAM_PREFIX}.linkExtension:${format.linkExtension}
-
- ${packages.sorted().joinToString(separator = "\n", postfix = "\n") { it }}
- """.trimIndent()
diff --git a/plugins/android-documentation/README.md b/plugins/android-documentation/README.md
deleted file mode 100644
index 2928f180..00000000
--- a/plugins/android-documentation/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Android documentation plugin
-
-The Android documentation plugin aim to improve documentation experience on the Android platform.
-
-Features:
-
-* Support for the `@hide` KDoc tag. It hides marked declaration from being displayed in documentation.
-
-You can find the Android documentation plugin on
-[Maven Central](https://mvnrepository.com/artifact/org.jetbrains.dokka/android-documentation-plugin).
diff --git a/plugins/android-documentation/api/android-documentation.api b/plugins/android-documentation/api/android-documentation.api
deleted file mode 100644
index 23e021a1..00000000
--- a/plugins/android-documentation/api/android-documentation.api
+++ /dev/null
@@ -1,11 +0,0 @@
-public final class org/jetbrains/dokka/android/AndroidDocumentationPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getSuppressedByHideTagDocumentableFilter ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/android/transformers/HideTagDocumentableFilter : org/jetbrains/dokka/base/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun shouldBeSuppressed (Lorg/jetbrains/dokka/model/Documentable;)Z
-}
-
diff --git a/plugins/android-documentation/build.gradle.kts b/plugins/android-documentation/build.gradle.kts
deleted file mode 100644
index 66a12837..00000000
--- a/plugins/android-documentation/build.gradle.kts
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
- id("org.jetbrains.conventions.base-unit-test")
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
-
- implementation(kotlin("reflect"))
-
- testImplementation(kotlin("test"))
- testImplementation(projects.plugins.base)
- testImplementation(projects.core.testApi)
-
- symbolsTestConfiguration(project(path = ":subprojects:analysis-kotlin-symbols", configuration = "shadow"))
- descriptorsTestConfiguration(project(path = ":subprojects:analysis-kotlin-descriptors", configuration = "shadow"))
- testImplementation(projects.plugins.base.baseTestUtils) {
- exclude(module = "analysis-kotlin-descriptors")
- }
-}
-
-registerDokkaArtifactPublication("androidDocumentationPlugin") {
- artifactId = "android-documentation-plugin"
-}
diff --git a/plugins/android-documentation/src/main/kotlin/AndroidDocumentationPlugin.kt b/plugins/android-documentation/src/main/kotlin/AndroidDocumentationPlugin.kt
deleted file mode 100644
index 089a19a4..00000000
--- a/plugins/android-documentation/src/main/kotlin/AndroidDocumentationPlugin.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.android
-
-import org.jetbrains.dokka.android.transformers.HideTagDocumentableFilter
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.Extension
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-
-public class AndroidDocumentationPlugin : DokkaPlugin() {
-
- private val dokkaBase by lazy { plugin<DokkaBase>() }
-
- public val suppressedByHideTagDocumentableFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- dokkaBase.preMergeDocumentableTransformer providing ::HideTagDocumentableFilter order { before(dokkaBase.emptyPackagesFilter) }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/android-documentation/src/main/kotlin/transformers/HideTagDocumentableFilter.kt b/plugins/android-documentation/src/main/kotlin/transformers/HideTagDocumentableFilter.kt
deleted file mode 100644
index ec05efc5..00000000
--- a/plugins/android-documentation/src/main/kotlin/transformers/HideTagDocumentableFilter.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.android.transformers
-
-import org.jetbrains.dokka.base.transformers.documentables.SuppressedByConditionDocumentableFilterTransformer
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.CustomTagWrapper
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class HideTagDocumentableFilter(public val dokkaContext: DokkaContext) :
- SuppressedByConditionDocumentableFilterTransformer(dokkaContext) {
-
- override fun shouldBeSuppressed(d: Documentable): Boolean =
- d.documentation.any { (_, docs) -> docs.dfs { it is CustomTagWrapper && it.name.trim() == "hide" } != null }
-}
diff --git a/plugins/android-documentation/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/android-documentation/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index ee64db6b..00000000
--- a/plugins/android-documentation/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.android.AndroidDocumentationPlugin
diff --git a/plugins/android-documentation/src/test/kotlin/transformers/HideTagDocumentableFilterTest.kt b/plugins/android-documentation/src/test/kotlin/transformers/HideTagDocumentableFilterTest.kt
deleted file mode 100644
index e461755d..00000000
--- a/plugins/android-documentation/src/test/kotlin/transformers/HideTagDocumentableFilterTest.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class HideTagDocumentableFilterTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- }
-
-
- @Test
- fun `should work as hide in java with functions`() {
- testInline(
- """
- |/src/suppressed/Testing.java
- |package testing;
- |
- |public class Testing {
- | /**
- | * @hide
- | */
- | public void shouldNotBeVisible() { }
- |}
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val testingClass = modules.flatMap { it.packages }.flatMap { it.classlikes }.single() as DClass
- assertEquals(0, testingClass.functions.size)
- }
- }
- }
-
- @Test
- fun `should work as hide in java with classes`() {
- testInline(
- """
- |/src/suppressed/Suppressed.java
- |package testing;
- |
- |/**
- | * @hide
- | */
- |public class Suppressed {
- |}
- |/src/suppressed/Visible.java
- |package testing;
- |
- |/**
- | * Another docs
- | * @undeprecate
- | */
- |public class Visible {
- |}
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val classes = modules.flatMap { it.packages }.flatMap { it.classlikes }.map { it.name }
- assertEquals(listOf("Visible"), classes)
- }
- }
- }
-
-
-}
diff --git a/plugins/base/README.md b/plugins/base/README.md
deleted file mode 100644
index e4cba717..00000000
--- a/plugins/base/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Base plugin
-
-The Base plugin comes with a number of basic extensions and features that are likely to be needed by any output format and
-some plugins in general.
-
-Including, but not limited to:
-
-* Markdown and KDoc parsing.
-* Kotlin signature generation.
-* Transformers that suppress empty modules/packages, unwanted visibility modifiers, obvious functions
- (hashCode/equals/etc), and so on.
-* Declaration link resolution (i.e linking to a class in a KDoc).
-* Support for external documentation links (i.e links to Java's Javadocs website or Kotlin's stdlib).
-* Declaration source link generation for navigation to source code (a.k.a `source` button).
-* Multiplatform support.
-* Output file writers.
-
-The Base plugin is not intended to be used directly by those who want to generate documentation - it is a building block
-for other plugins and formats.
-
-It is in the heart of all documentation formats that come with Dokka.
diff --git a/plugins/base/api/base.api b/plugins/base/api/base.api
deleted file mode 100644
index 13f877e3..00000000
--- a/plugins/base/api/base.api
+++ /dev/null
@@ -1,1541 +0,0 @@
-public final class org/jetbrains/dokka/analysis/AnalysisContext : java/io/Closeable {
- public fun <init> (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
- public fun close ()V
- public final fun component1 ()Ljava/lang/Object;
- public final fun component2 ()Ljava/lang/Object;
- public final fun getEnvironment ()Ljava/lang/Object;
- public final fun getFacade ()Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/analysis/DokkaAnalysisConfiguration {
- public fun <init> ()V
- public fun <init> (Z)V
- public synthetic fun <init> (ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun getIgnoreCommonBuiltIns ()Z
-}
-
-public abstract class org/jetbrains/dokka/analysis/KotlinAnalysis : java/io/Closeable {
- public fun <init> ()V
- public fun <init> (Lorg/jetbrains/dokka/analysis/KotlinAnalysis;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/analysis/KotlinAnalysis;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- protected abstract fun find (Lorg/jetbrains/dokka/DokkaSourceSetID;)Lorg/jetbrains/dokka/analysis/AnalysisContext;
- public final fun get (Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/analysis/AnalysisContext;
- public final fun get (Lorg/jetbrains/dokka/DokkaSourceSetID;)Lorg/jetbrains/dokka/analysis/AnalysisContext;
-}
-
-public final class org/jetbrains/dokka/analysis/KotlinAnalysisDeprecatedApiKt {
- public static final fun KotlinAnalysis (Ljava/util/List;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/analysis/DokkaAnalysisConfiguration;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
- public static final fun KotlinAnalysis (Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
- public static synthetic fun KotlinAnalysis$default (Ljava/util/List;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/analysis/DokkaAnalysisConfiguration;ILjava/lang/Object;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
- public static final fun ProjectKotlinAnalysis (Ljava/util/List;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/analysis/DokkaAnalysisConfiguration;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
- public static synthetic fun ProjectKotlinAnalysis$default (Ljava/util/List;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/analysis/DokkaAnalysisConfiguration;ILjava/lang/Object;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
- public static final fun SamplesKotlinAnalysis (Ljava/util/List;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/analysis/KotlinAnalysis;Lorg/jetbrains/dokka/analysis/DokkaAnalysisConfiguration;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
- public static synthetic fun SamplesKotlinAnalysis$default (Ljava/util/List;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/analysis/KotlinAnalysis;Lorg/jetbrains/dokka/analysis/DokkaAnalysisConfiguration;ILjava/lang/Object;)Lorg/jetbrains/dokka/analysis/KotlinAnalysis;
-}
-
-public final class org/jetbrains/dokka/base/DokkaBase : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getActualTypealiasAdder ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getAssetsInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getBaseSearchbarDataInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getCommentsToContentConverter ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getCustomResourceInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getCustomTagContentProvider ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getDefaultExternalClasslikesTranslator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultExternalDocumentablesProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultKotlinAnalysis ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultSamplesTransformer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDeprecatedDocumentableFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDescriptorToDocumentableTranslator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDocTagToContentConverter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDocumentableMerger ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDocumentableToPageTranslator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDocumentableVisibilityFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDokkaLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getEmptyModulesFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getEmptyPackagesFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getExtensionsExtractor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getExternalClasslikesTranslator ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getExternalDocumentablesProvider ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getExternalLocationProviderFactory ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getFallbackMerger ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getFileWriter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getHtmlPreprocessors ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getHtmlRenderer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getImmediateHtmlCommandConsumer ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getInheritedEntriesVisbilityFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getInheritorsExtractor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJavadocLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getKotlinAnalysis ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getKotlinArrayDocumentableReplacer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getKotlinSignatureProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getLocationProviderFactory ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getModulesAndPackagesDocumentation ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getNavigationPageInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getObviousFunctionsVisbilityFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getOutputWriter ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getPackageListCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPageMerger ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPageMergerStrategy ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getPathToRootConsumer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPreMergeDocumentableTransformer ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getPsiToDocumentableTranslator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getReplaceVersionConsumer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getResolveLinkConsumer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getRootCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSameMethodNameMerger ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getScriptsInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSignatureProvider ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getSinceKotlinTagContentProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSinceKotlinTransformer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSingleGeneration ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSourceLinksTransformer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSourceSetMerger ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSourcesetDependencyAppender ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getStylesInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSuppressedBySuppressTagDocumentableFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSuppressedDocumentableFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getTabSortingStrategy ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getUndocumentedCodeReporter ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/base/DokkaBaseConfiguration : org/jetbrains/dokka/plugability/ConfigurableBlock {
- public static final field Companion Lorg/jetbrains/dokka/base/DokkaBaseConfiguration$Companion;
- public static final field mergeImplicitExpectActualDeclarationsDefault Z
- public static final field separateInheritedMembersDefault Z
- public fun <init> ()V
- public fun <init> (Ljava/util/List;Ljava/util/List;ZLjava/lang/String;ZLjava/io/File;Ljava/lang/String;)V
- public synthetic fun <init> (Ljava/util/List;Ljava/util/List;ZLjava/lang/String;ZLjava/io/File;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/util/List;
- public final fun component2 ()Ljava/util/List;
- public final fun component3 ()Z
- public final fun component4 ()Ljava/lang/String;
- public final fun component5 ()Z
- public final fun component6 ()Ljava/io/File;
- public final fun component7 ()Ljava/lang/String;
- public final fun copy (Ljava/util/List;Ljava/util/List;ZLjava/lang/String;ZLjava/io/File;Ljava/lang/String;)Lorg/jetbrains/dokka/base/DokkaBaseConfiguration;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/DokkaBaseConfiguration;Ljava/util/List;Ljava/util/List;ZLjava/lang/String;ZLjava/io/File;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/DokkaBaseConfiguration;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getCustomAssets ()Ljava/util/List;
- public final fun getCustomStyleSheets ()Ljava/util/List;
- public final fun getFooterMessage ()Ljava/lang/String;
- public final fun getHomepageLink ()Ljava/lang/String;
- public final fun getMergeImplicitExpectActualDeclarations ()Z
- public final fun getSeparateInheritedMembers ()Z
- public final fun getTemplatesDir ()Ljava/io/File;
- public fun hashCode ()I
- public final fun setCustomAssets (Ljava/util/List;)V
- public final fun setCustomStyleSheets (Ljava/util/List;)V
- public final fun setFooterMessage (Ljava/lang/String;)V
- public final fun setHomepageLink (Ljava/lang/String;)V
- public final fun setMergeImplicitExpectActualDeclarations (Z)V
- public final fun setSeparateInheritedMembers (Z)V
- public final fun setTemplatesDir (Ljava/io/File;)V
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/DokkaBaseConfiguration$Companion {
- public final fun getDefaultCustomAssets ()Ljava/util/List;
- public final fun getDefaultCustomStyleSheets ()Ljava/util/List;
- public final fun getDefaultFooterMessage ()Ljava/lang/String;
- public final fun getDefaultTemplatesDir ()Ljava/io/File;
-}
-
-public final class org/jetbrains/dokka/base/deprecated/AnalysisApiDeprecatedError : java/lang/Error {
- public fun <init> ()V
-}
-
-public final class org/jetbrains/dokka/base/generation/SingleModuleGeneration : org/jetbrains/dokka/generation/Generation {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun createDocumentationModels ()Ljava/util/List;
- public final fun createPages (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public fun generate (Lorg/jetbrains/dokka/Timer;)V
- public fun getGenerationName ()Ljava/lang/String;
- public final fun mergeDocumentationModels (Ljava/util/List;)Lorg/jetbrains/dokka/model/DModule;
- public final fun render (Lorg/jetbrains/dokka/pages/RootPageNode;)V
- public final fun reportAfterRendering ()V
- public final fun runPostActions ()V
- public final fun transformDocumentationModelAfterMerge (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/model/DModule;
- public final fun transformDocumentationModelBeforeMerge (Ljava/util/List;)Ljava/util/List;
- public final fun transformPages (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public final fun validityCheck (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
-}
-
-public class org/jetbrains/dokka/base/parsers/MarkdownParser : org/jetbrains/dokka/base/parsers/Parser {
- public static final field Companion Lorg/jetbrains/dokka/base/parsers/MarkdownParser$Companion;
- public fun <init> (Lkotlin/jvm/functions/Function1;Ljava/lang/String;)V
-}
-
-public final class org/jetbrains/dokka/base/parsers/MarkdownParser$Companion {
- public final fun parseFromKDocTag (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Z)Lorg/jetbrains/dokka/model/doc/DocumentationNode;
- public static synthetic fun parseFromKDocTag$default (Lorg/jetbrains/dokka/base/parsers/MarkdownParser$Companion;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Ljava/lang/String;ZILjava/lang/Object;)Lorg/jetbrains/dokka/model/doc/DocumentationNode;
-}
-
-public abstract class org/jetbrains/dokka/base/parsers/Parser {
- public fun <init> ()V
- public fun parseStringToDocNode (Ljava/lang/String;)Lorg/jetbrains/dokka/model/doc/DocTag;
- public fun parseTagWithBody (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/dokka/model/doc/TagWrapper;
- public fun preparse (Ljava/lang/String;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/parsers/factories/DocTagsFromStringFactory {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/parsers/factories/DocTagsFromStringFactory;
- public final fun getInstance (Ljava/lang/String;Ljava/util/List;Ljava/util/Map;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;)Lorg/jetbrains/dokka/model/doc/DocTag;
- public static synthetic fun getInstance$default (Lorg/jetbrains/dokka/base/parsers/factories/DocTagsFromStringFactory;Ljava/lang/String;Ljava/util/List;Ljava/util/Map;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;ILjava/lang/Object;)Lorg/jetbrains/dokka/model/doc/DocTag;
-}
-
-public final class org/jetbrains/dokka/base/renderers/ContentTypeCheckingKt {
- public static final fun getURIExtension (Ljava/lang/String;)Ljava/lang/String;
- public static final fun isImage (Ljava/lang/String;)Z
- public static final fun isImage (Lorg/jetbrains/dokka/pages/ContentEmbeddedResource;)Z
-}
-
-public abstract class org/jetbrains/dokka/base/renderers/DefaultRenderer : org/jetbrains/dokka/renderers/Renderer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun build (Lorg/jetbrains/dokka/pages/ContentNode;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public static synthetic fun build$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public fun buildCodeBlock (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentCodeBlock;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildCodeInline (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentCodeInline;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildContentNode (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public final fun buildContentNode (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentPage;Lorg/jetbrains/dokka/model/DisplaySourceSet;)V
- public static synthetic fun buildContentNode$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public fun buildDRILink (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDRILink;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildDivergent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDivergentGroup;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildDivergentInstance (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDivergentInstance;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public abstract fun buildError (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public fun buildGroup (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public static synthetic fun buildGroup$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public abstract fun buildHeader (Ljava/lang/Object;ILorg/jetbrains/dokka/pages/ContentHeader;Lkotlin/jvm/functions/Function1;)V
- public fun buildHeader (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentHeader;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public static synthetic fun buildHeader$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentHeader;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public abstract fun buildLineBreak (Ljava/lang/Object;)V
- public fun buildLineBreak (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentBreakLine;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public abstract fun buildLink (Ljava/lang/Object;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public abstract fun buildList (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentList;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public static synthetic fun buildList$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentList;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public abstract fun buildNavigation (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/PageNode;)V
- public abstract fun buildPage (Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function2;)Ljava/lang/String;
- public fun buildPageContent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildPlatformDependent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/PlatformHintedContent;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildResolvedLink (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentResolvedLink;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public abstract fun buildResource (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentEmbeddedResource;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public abstract fun buildTable (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public static synthetic fun buildTable$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public fun buildText (Ljava/lang/Object;Ljava/util/List;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public abstract fun buildText (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentText;)V
- public static synthetic fun buildText$default (Lorg/jetbrains/dokka/base/renderers/DefaultRenderer;Ljava/lang/Object;Ljava/util/List;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- protected final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- protected final fun getLocationProvider ()Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;
- protected final fun getOutputWriter ()Lorg/jetbrains/dokka/base/renderers/OutputWriter;
- protected fun getPreprocessors ()Ljava/lang/Iterable;
- protected final fun groupDivergentInstances (Lorg/jetbrains/dokka/pages/ContentDivergentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)Ljava/util/Map;
- public fun render (Lorg/jetbrains/dokka/pages/RootPageNode;)V
- public fun renderPage (Lorg/jetbrains/dokka/pages/PageNode;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
- public fun wrapGroup (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function1;)V
-}
-
-public final class org/jetbrains/dokka/base/renderers/DefaultRendererKt {
- public static final fun sourceSets (Lorg/jetbrains/dokka/pages/ContentPage;)Ljava/util/Set;
-}
-
-public final class org/jetbrains/dokka/base/renderers/FileWriter : org/jetbrains/dokka/base/renderers/OutputWriter {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun write (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
- public fun writeResources (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/renderers/HtmlFileExtensions {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/renderers/HtmlFileExtensions;
- public final fun getImageExtensions ()Ljava/util/Set;
-}
-
-public abstract interface class org/jetbrains/dokka/base/renderers/OutputWriter {
- public abstract fun write (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
- public abstract fun writeResources (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/renderers/PackageListCreator : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;Lorg/jetbrains/dokka/base/resolvers/shared/LinkFormat;Ljava/util/List;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;Lorg/jetbrains/dokka/base/resolvers/shared/LinkFormat;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public final fun getFormat ()Lorg/jetbrains/dokka/base/resolvers/shared/LinkFormat;
- public final fun getOutputFilesNames ()Ljava/util/List;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/PackageListService {
- public static final field Companion Lorg/jetbrains/dokka/base/renderers/PackageListService$Companion;
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;Lorg/jetbrains/dokka/pages/RootPageNode;)V
- public final fun createPackageList (Lorg/jetbrains/dokka/pages/ModulePage;Lorg/jetbrains/dokka/base/resolvers/shared/LinkFormat;)Ljava/lang/String;
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public final fun getRootPage ()Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/PackageListService$Companion {
- public final fun renderPackageList (Ljava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/renderers/RootCreator : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/renderers/RootCreator;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public abstract interface class org/jetbrains/dokka/base/renderers/TabSortingStrategy {
- public abstract fun sort (Ljava/util/Collection;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/AssetsInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/renderers/html/AssetsInstaller;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/CustomResourceInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/HtmlFormatingUtilsKt {
- public static final fun buildBreakableDotSeparatedHtml (Lkotlinx/html/FlowContent;Ljava/lang/String;)V
- public static final fun buildBreakableText (Lkotlinx/html/FlowContent;Ljava/lang/String;)V
- public static final fun buildTextBreakableAfterCapitalLetters (Lkotlinx/html/FlowContent;Ljava/lang/String;Z)V
- public static synthetic fun buildTextBreakableAfterCapitalLetters$default (Lkotlinx/html/FlowContent;Ljava/lang/String;ZILjava/lang/Object;)V
-}
-
-public class org/jetbrains/dokka/base/renderers/html/HtmlRenderer : org/jetbrains/dokka/base/renderers/DefaultRenderer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun buildAnchorCopyButton (Lkotlinx/html/FlowContent;Ljava/lang/String;)V
- public synthetic fun buildCodeBlock (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentCodeBlock;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildCodeBlock (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentCodeBlock;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildCodeInline (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentCodeInline;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildCodeInline (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentCodeInline;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildDRILink (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDRILink;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildDRILink (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentDRILink;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public final fun buildDefaultTable (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildDivergent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDivergentGroup;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildDivergent (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentDivergentGroup;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildError (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public synthetic fun buildHeader (Ljava/lang/Object;ILorg/jetbrains/dokka/pages/ContentHeader;Lkotlin/jvm/functions/Function1;)V
- public fun buildHeader (Lkotlinx/html/FlowContent;ILorg/jetbrains/dokka/pages/ContentHeader;Lkotlin/jvm/functions/Function1;)V
- public fun buildHtml (Lorg/jetbrains/dokka/pages/PageNode;Ljava/util/List;Lkotlin/jvm/functions/Function1;)Ljava/lang/String;
- public synthetic fun buildLineBreak (Ljava/lang/Object;)V
- public synthetic fun buildLineBreak (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentBreakLine;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildLineBreak (Lkotlinx/html/FlowContent;)V
- public fun buildLineBreak (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentBreakLine;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildLink (Ljava/lang/Object;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public fun buildLink (Lkotlinx/html/FlowContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public final fun buildLink (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/links/DRI;Ljava/util/List;Lorg/jetbrains/dokka/pages/PageNode;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun buildLink$default (Lorg/jetbrains/dokka/base/renderers/html/HtmlRenderer;Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/links/DRI;Ljava/util/List;Lorg/jetbrains/dokka/pages/PageNode;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public synthetic fun buildList (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentList;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildList (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentList;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildListItems (Lkotlinx/html/OL;Ljava/util/List;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildListItems (Lkotlinx/html/UL;Ljava/util/List;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public static synthetic fun buildListItems$default (Lorg/jetbrains/dokka/base/renderers/html/HtmlRenderer;Lkotlinx/html/OL;Ljava/util/List;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public static synthetic fun buildListItems$default (Lorg/jetbrains/dokka/base/renderers/html/HtmlRenderer;Lkotlinx/html/UL;Ljava/util/List;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;ILjava/lang/Object;)V
- public synthetic fun buildNavigation (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/PageNode;)V
- public fun buildNavigation (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/PageNode;)V
- public fun buildPage (Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function2;)Ljava/lang/String;
- public synthetic fun buildPlatformDependent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/PlatformHintedContent;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildPlatformDependent (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/PlatformHintedContent;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildResource (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentEmbeddedResource;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildResource (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentEmbeddedResource;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildTable (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildTable (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildText (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentText;)V
- public fun buildText (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentText;)V
- public fun clickableLogo (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/PageNode;Ljava/lang/String;)V
- public synthetic fun getPreprocessors ()Ljava/lang/Iterable;
- protected fun getPreprocessors ()Ljava/util/List;
- public fun render (Lorg/jetbrains/dokka/pages/RootPageNode;)V
- public synthetic fun wrapGroup (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function1;)V
- public fun wrapGroup (Lkotlinx/html/FlowContent;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function1;)V
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/HtmlRendererKt {
- public static final fun joinAttr (Ljava/util/List;)Ljava/lang/String;
-}
-
-public abstract class org/jetbrains/dokka/base/renderers/html/NavigationDataProvider {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun navigableChildren (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;
- public fun visit (Lorg/jetbrains/dokka/pages/ContentPage;)Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/NavigationNode : org/jetbrains/dokka/model/WithChildren {
- public fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;Ljava/util/Set;Ljava/util/List;)V
- public synthetic fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;Ljava/util/Set;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component3 ()Ljava/util/Set;
- public final fun component4 ()Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public final fun component5 ()Ljava/util/Set;
- public final fun component6 ()Ljava/util/List;
- public final fun copy (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;Ljava/util/Set;Ljava/util/List;)Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;Ljava/util/Set;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;
- public fun equals (Ljava/lang/Object;)Z
- public fun getChildren ()Ljava/util/List;
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public final fun getIcon ()Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public final fun getName ()Ljava/lang/String;
- public final fun getSourceSets ()Ljava/util/Set;
- public final fun getStyles ()Ljava/util/Set;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/NavigationNodeIcon : java/lang/Enum {
- public static final field ABSTRACT_CLASS Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field ABSTRACT_CLASS_KT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field ANNOTATION_CLASS Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field ANNOTATION_CLASS_KT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field CLASS Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field CLASS_KT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field ENUM_CLASS Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field ENUM_CLASS_KT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field EXCEPTION Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field FUNCTION Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field INTERFACE Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field INTERFACE_KT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field OBJECT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field TYPEALIAS_KT Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field VAL Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static final field VAR Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
- public static fun values ()[Lorg/jetbrains/dokka/base/renderers/html/NavigationNodeIcon;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/NavigationPage : org/jetbrains/dokka/pages/RendererSpecificPage {
- public fun <init> (Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;Ljava/lang/String;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun getChildren ()Ljava/util/List;
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public final fun getModuleName ()Ljava/lang/String;
- public fun getName ()Ljava/lang/String;
- public final fun getRoot ()Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;
- public fun getStrategy ()Lorg/jetbrains/dokka/pages/RenderingStrategy;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/base/renderers/html/NavigationPage;
- public synthetic fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
-}
-
-public class org/jetbrains/dokka/base/renderers/html/NavigationPageInstaller : org/jetbrains/dokka/base/renderers/html/NavigationDataProvider, org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/NavigationPageKt {
- public static final fun transform (Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/base/renderers/html/NavigationNode;
- public static final fun transform (Lorg/jetbrains/dokka/base/renderers/html/NavigationPage;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/base/renderers/html/NavigationPage;
-}
-
-public class org/jetbrains/dokka/base/renderers/html/STRIKE : kotlinx/html/HTMLTag, kotlinx/html/HtmlBlockInlineTag {
- public fun <init> (Ljava/util/Map;Lkotlinx/html/TagConsumer;)V
- public fun getConsumer ()Lkotlinx/html/TagConsumer;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/ScriptsInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/SearchRecord {
- public static final field Companion Lorg/jetbrains/dokka/base/renderers/html/SearchRecord$Companion;
- public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
- public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Ljava/lang/String;
- public final fun component4 ()Ljava/util/List;
- public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/base/renderers/html/SearchRecord;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/renderers/html/SearchRecord;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/renderers/html/SearchRecord;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDescription ()Ljava/lang/String;
- public final fun getLocation ()Ljava/lang/String;
- public final fun getName ()Ljava/lang/String;
- public final fun getSearchKeys ()Ljava/util/List;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/SearchRecord$Companion {
-}
-
-public class org/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun createSearchRecord (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/base/renderers/html/SearchRecord;
- public fun generatePagesList (Ljava/util/List;Lorg/jetbrains/dokka/pages/DriResolver;)Ljava/util/List;
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public fun processPage (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Ljava/util/Set;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;)Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public final fun getSourceSet ()Ljava/util/Set;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$SignatureWithId {
- public fun <init> (Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;Ljava/lang/String;)V
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public final fun component1 ()Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;
- public final fun component2 ()Ljava/lang/String;
- public final fun copy (Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;Ljava/lang/String;)Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$SignatureWithId;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$SignatureWithId;Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$SignatureWithId;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDisplayableSignature ()Ljava/lang/String;
- public final fun getDriWithSourceSets ()Lorg/jetbrains/dokka/base/renderers/html/SearchbarDataInstaller$DRIWithSourceSets;
- public final fun getId ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/SourcesetDependencyAppender : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/StylesInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/TagsKt {
- public static final field TEMPLATE_COMMAND_BEGIN_BORDER Ljava/lang/String;
- public static final field TEMPLATE_COMMAND_END_BORDER Ljava/lang/String;
- public static final field TEMPLATE_COMMAND_SEPARATOR Ljava/lang/String;
- public static final fun buildAsInnerHtml (Lkotlin/jvm/functions/Function1;)Ljava/lang/String;
- public static final fun strike (Lkotlinx/html/FlowOrPhrasingContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun strike$default (Lkotlinx/html/FlowOrPhrasingContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public static final fun templateCommand (Lkotlinx/html/FlowOrMetaDataContent;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;)V
- public static final fun templateCommand (Lkotlinx/html/TagConsumer;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
- public static synthetic fun templateCommand$default (Lkotlinx/html/FlowOrMetaDataContent;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public static synthetic fun templateCommand$default (Lkotlinx/html/TagConsumer;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;
- public static final fun templateCommandAsHtmlComment (Ljava/lang/Appendable;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;)V
- public static final fun templateCommandAsHtmlComment (Lkotlinx/html/FlowOrMetaDataContent;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun templateCommandAsHtmlComment$default (Lkotlinx/html/FlowOrMetaDataContent;Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public static final fun templateCommandFor (Lorg/jetbrains/dokka/base/templating/Command;Lkotlinx/html/TagConsumer;)Lorg/jetbrains/dokka/base/renderers/html/TemplateCommand;
- public static final fun underline (Lkotlinx/html/FlowOrPhrasingContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun underline$default (Lkotlinx/html/FlowOrPhrasingContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public static final fun wbr (Lkotlinx/html/FlowOrPhrasingContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun wbr$default (Lkotlinx/html/FlowOrPhrasingContent;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/TemplateCommand : kotlinx/html/HTMLTag, kotlinx/html/CommonAttributeGroupFacadeFlowInteractivePhrasingContent {
- public fun <init> (Ljava/util/Map;Lkotlinx/html/TagConsumer;)V
-}
-
-public class org/jetbrains/dokka/base/renderers/html/UNDERLINE : kotlinx/html/HTMLTag, kotlinx/html/HtmlBlockInlineTag {
- public fun <init> (Ljava/util/Map;Lkotlinx/html/TagConsumer;)V
- public fun getConsumer ()Lkotlinx/html/TagConsumer;
-}
-
-public class org/jetbrains/dokka/base/renderers/html/WBR : kotlinx/html/HTMLTag, kotlinx/html/HtmlBlockInlineTag {
- public fun <init> (Ljava/util/Map;Lkotlinx/html/TagConsumer;)V
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer : kotlinx/html/TagConsumer {
- public fun <init> (Lkotlinx/html/TagConsumer;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun finalize ()Ljava/lang/Object;
- public fun onTagAttributeChange (Lkotlinx/html/Tag;Ljava/lang/String;Ljava/lang/String;)V
- public fun onTagComment (Ljava/lang/CharSequence;)V
- public fun onTagContent (Ljava/lang/CharSequence;)V
- public fun onTagContentEntity (Lkotlinx/html/Entities;)V
- public fun onTagContentUnsafe (Lkotlin/jvm/functions/Function1;)V
- public fun onTagEnd (Lkotlinx/html/Tag;)V
- public fun onTagEvent (Lkotlinx/html/Tag;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public fun onTagStart (Lkotlinx/html/Tag;)V
- public final fun processCommand (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;)V
- public final fun processCommandAndFinalize (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/command/consumers/PathToRootConsumer : org/jetbrains/dokka/base/templating/ImmediateHtmlCommandConsumer {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/renderers/html/command/consumers/PathToRootConsumer;
- public fun canProcess (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun processCommand (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)V
- public fun processCommandAndFinalize (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/command/consumers/ReplaceVersionsConsumer : org/jetbrains/dokka/base/templating/ImmediateHtmlCommandConsumer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canProcess (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun processCommand (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)V
- public fun processCommandAndFinalize (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/command/consumers/ResolveLinkConsumer : org/jetbrains/dokka/base/templating/ImmediateHtmlCommandConsumer {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ResolveLinkConsumer;
- public fun canProcess (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun processCommand (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)V
- public fun processCommandAndFinalize (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/innerTemplating/DefaultTemplateModelFactory : org/jetbrains/dokka/base/renderers/html/innerTemplating/TemplateModelFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun buildModel (Lorg/jetbrains/dokka/pages/PageNode;Ljava/util/List;Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Ljava/lang/String;)Ljava/util/Map;
- public fun buildSharedModel ()Ljava/util/Map;
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/innerTemplating/DefaultTemplateModelFactory$SourceSetModel {
- public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DefaultTemplateModelFactory$SourceSetModel;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DefaultTemplateModelFactory$SourceSetModel;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DefaultTemplateModelFactory$SourceSetModel;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getFilter ()Ljava/lang/String;
- public final fun getName ()Ljava/lang/String;
- public final fun getPlatform ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/innerTemplating/DefaultTemplateModelMerger : org/jetbrains/dokka/base/renderers/html/innerTemplating/TemplateModelMerger {
- public fun <init> ()V
- public fun invoke (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/innerTemplating/DokkaTemplateTypes : java/lang/Enum {
- public static final field BASE Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DokkaTemplateTypes;
- public final fun getPath ()Ljava/lang/String;
- public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DokkaTemplateTypes;
- public static fun values ()[Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DokkaTemplateTypes;
-}
-
-public final class org/jetbrains/dokka/base/renderers/html/innerTemplating/HtmlTemplater {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun renderFromTemplate (Lorg/jetbrains/dokka/base/renderers/html/innerTemplating/DokkaTemplateTypes;Lkotlin/jvm/functions/Function0;)Ljava/lang/String;
- public final fun setupSharedModel (Ljava/util/Map;)V
-}
-
-public abstract interface class org/jetbrains/dokka/base/renderers/html/innerTemplating/TemplateModelFactory {
- public abstract fun buildModel (Lorg/jetbrains/dokka/pages/PageNode;Ljava/util/List;Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Ljava/lang/String;)Ljava/util/Map;
- public abstract fun buildSharedModel ()Ljava/util/Map;
-}
-
-public abstract interface class org/jetbrains/dokka/base/renderers/html/innerTemplating/TemplateModelMerger {
- public abstract fun invoke (Ljava/util/List;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint : org/jetbrains/dokka/model/properties/ExtraProperty {
- public static final field Companion Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint$Companion;
- public fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun copy (Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;)Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint;Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getAnchorName ()Ljava/lang/String;
- public final fun getContentKind ()Lorg/jetbrains/dokka/pages/Kind;
- public fun getKey ()Lorg/jetbrains/dokka/model/properties/ExtraProperty$Key;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint$Companion : org/jetbrains/dokka/model/properties/ExtraProperty$Key {
- public final fun from (Lorg/jetbrains/dokka/model/Documentable;Lorg/jetbrains/dokka/pages/Kind;)Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint;
- public synthetic fun mergeStrategyFor (Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
- public fun mergeStrategyFor (Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint;Lorg/jetbrains/dokka/base/resolvers/anchors/SymbolAnchorHint;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
-}
-
-public class org/jetbrains/dokka/base/resolvers/external/DefaultExternalLocationProvider : org/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;Ljava/lang/String;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- protected fun constructPath (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
- public final fun getDocURL ()Ljava/lang/String;
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public final fun getExtension ()Ljava/lang/String;
- public final fun getExternalDocumentation ()Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;
- public fun resolve (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/external/DefaultExternalLocationProviderFactory : org/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun getExternalLocationProvider (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;)Lorg/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider;
-}
-
-public class org/jetbrains/dokka/base/resolvers/external/Dokka010ExternalLocationProvider : org/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;Ljava/lang/String;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getDocURL ()Ljava/lang/String;
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public final fun getExtension ()Ljava/lang/String;
- public final fun getExternalDocumentation ()Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;
- public fun resolve (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider {
- public abstract fun resolve (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactory {
- public abstract fun getExternalLocationProvider (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;)Lorg/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactoryWithCache : org/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactory;)V
- public final fun getExt ()Lorg/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactory;
- public fun getExternalLocationProvider (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;)Lorg/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider;
-}
-
-public class org/jetbrains/dokka/base/resolvers/external/javadoc/AndroidExternalLocationProvider : org/jetbrains/dokka/base/resolvers/external/javadoc/JavadocExternalLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- protected fun anchorPart (Lorg/jetbrains/dokka/links/Callable;)Ljava/lang/String;
-}
-
-public class org/jetbrains/dokka/base/resolvers/external/javadoc/JavadocExternalLocationProvider : org/jetbrains/dokka/base/resolvers/external/DefaultExternalLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- protected fun anchorPart (Lorg/jetbrains/dokka/links/Callable;)Ljava/lang/String;
- protected fun constructPath (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
- public final fun getBrackets ()Ljava/lang/String;
- public final fun getSeparator ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/external/javadoc/JavadocExternalLocationProviderFactory : org/jetbrains/dokka/base/resolvers/external/ExternalLocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun getExternalLocationProvider (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;)Lorg/jetbrains/dokka/base/resolvers/external/ExternalLocationProvider;
-}
-
-public abstract class org/jetbrains/dokka/base/resolvers/local/DefaultLocationProvider : org/jetbrains/dokka/base/resolvers/local/LocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun expectedLocationForDri (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
- protected final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- protected fun getExternalLocation (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;)Ljava/lang/String;
- protected final fun getExternalLocationProviderFactories ()Ljava/util/List;
- protected final fun getExternalLocationProviders ()Ljava/util/Map;
- protected final fun getLocationsIndex ()Ljava/util/Map;
- protected final fun getPackagesIndex ()Ljava/util/Map;
- protected final fun getPageGraphRoot ()Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public abstract class org/jetbrains/dokka/base/resolvers/local/DokkaBaseLocationProvider : org/jetbrains/dokka/base/resolvers/local/DefaultLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun anchorForDCI (Lorg/jetbrains/dokka/pages/DCI;Ljava/util/Set;)Ljava/lang/String;
-}
-
-public class org/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider : org/jetbrains/dokka/base/resolvers/local/DokkaBaseLocationProvider {
- public static final field Companion Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$Companion;
- public fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun ancestors (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/util/List;
- protected final fun getAnchorsIndex ()Ljava/util/Map;
- public final fun getExtension ()Ljava/lang/String;
- protected fun getPAGE_WITH_CHILDREN_SUFFIX ()Ljava/lang/String;
- protected final fun getPagesIndex ()Ljava/util/Map;
- protected fun getPathsIndex ()Ljava/util/Map;
- protected fun pathTo (Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public fun pathToRoot (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public fun resolve (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public fun resolve (Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;Z)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$Companion {
- public final fun getReservedFilenames ()Ljava/util/Set;
- public final fun identifierToFilename (Ljava/lang/String;)Ljava/lang/String;
-}
-
-protected final class org/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$DRIWithSourceSets {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Ljava/util/Set;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;)Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$DRIWithSourceSets;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$DRIWithSourceSets;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$DRIWithSourceSets;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public final fun getSourceSet ()Ljava/util/Set;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-protected final class org/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$PageWithKind {
- public fun <init> (Lorg/jetbrains/dokka/pages/ContentPage;Lorg/jetbrains/dokka/pages/Kind;)V
- public final fun component1 ()Lorg/jetbrains/dokka/pages/ContentPage;
- public final fun component2 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun copy (Lorg/jetbrains/dokka/pages/ContentPage;Lorg/jetbrains/dokka/pages/Kind;)Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$PageWithKind;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$PageWithKind;Lorg/jetbrains/dokka/pages/ContentPage;Lorg/jetbrains/dokka/pages/Kind;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider$PageWithKind;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun getPage ()Lorg/jetbrains/dokka/pages/ContentPage;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/local/DokkaLocationProviderFactory : org/jetbrains/dokka/base/resolvers/local/LocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun getLocationProvider (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;
-}
-
-public abstract interface class org/jetbrains/dokka/base/resolvers/local/LocationProvider {
- public abstract fun ancestors (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/util/List;
- public abstract fun expectedLocationForDri (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
- public abstract fun pathToRoot (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public abstract fun resolve (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public abstract fun resolve (Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;Z)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/local/LocationProvider$DefaultImpls {
- public static fun expectedLocationForDri (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
- public static synthetic fun resolve$default (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;ILjava/lang/Object;)Ljava/lang/String;
- public static synthetic fun resolve$default (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;ZILjava/lang/Object;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/base/resolvers/local/LocationProviderFactory {
- public abstract fun getLocationProvider (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/local/LocationProviderKt {
- public static final fun resolveOrThrow (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public static final fun resolveOrThrow (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;Z)Ljava/lang/String;
- public static synthetic fun resolveOrThrow$default (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;ILjava/lang/Object;)Ljava/lang/String;
- public static synthetic fun resolveOrThrow$default (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;ZILjava/lang/Object;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation {
- public fun <init> (Ljava/net/URL;Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;)V
- public final fun component1 ()Ljava/net/URL;
- public final fun component2 ()Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;
- public final fun copy (Ljava/net/URL;Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;)Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;Ljava/net/URL;Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/resolvers/shared/ExternalDocumentation;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDocumentationURL ()Ljava/net/URL;
- public final fun getPackageList ()Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/base/resolvers/shared/LinkFormat {
- public abstract fun getFormatName ()Ljava/lang/String;
- public abstract fun getLinkExtension ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/shared/PackageList {
- public static final field Companion Lorg/jetbrains/dokka/base/resolvers/shared/PackageList$Companion;
- public static final field DOKKA_PARAM_PREFIX Ljava/lang/String;
- public static final field MODULE_DELIMITER Ljava/lang/String;
- public static final field PACKAGE_LIST_NAME Ljava/lang/String;
- public static final field SINGLE_MODULE_NAME Ljava/lang/String;
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;Ljava/util/Map;Ljava/util/Map;Ljava/net/URL;)V
- public final fun component1 ()Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public final fun component2 ()Ljava/util/Map;
- public final fun component3 ()Ljava/util/Map;
- public final fun component4 ()Ljava/net/URL;
- public final fun copy (Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;Ljava/util/Map;Ljava/util/Map;Ljava/net/URL;)Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;Ljava/util/Map;Ljava/util/Map;Ljava/net/URL;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getLinkFormat ()Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public final fun getLocations ()Ljava/util/Map;
- public final fun getModules ()Ljava/util/Map;
- public final fun getPackages ()Ljava/util/Set;
- public final fun getUrl ()Ljava/net/URL;
- public fun hashCode ()I
- public final fun moduleFor (Ljava/lang/String;)Ljava/lang/String;
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/shared/PackageList$Companion {
- public final fun load (Ljava/net/URL;IZ)Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;
- public static synthetic fun load$default (Lorg/jetbrains/dokka/base/resolvers/shared/PackageList$Companion;Ljava/net/URL;IZILjava/lang/Object;)Lorg/jetbrains/dokka/base/resolvers/shared/PackageList;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat : java/lang/Enum, org/jetbrains/dokka/base/resolvers/shared/LinkFormat {
- public static final field Companion Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat$Companion;
- public static final field DokkaGFM Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field DokkaHtml Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field DokkaJavadoc Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field DokkaJekyll Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field DokkaOldHtml Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field Javadoc1 Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field Javadoc10 Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field Javadoc8 Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field KotlinWebsite Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static final field KotlinWebsiteHtml Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public fun getFormatName ()Ljava/lang/String;
- public fun getLinkExtension ()Ljava/lang/String;
- public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
- public static fun values ()[Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
-}
-
-public final class org/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat$Companion {
- public final fun fromString (Ljava/lang/String;)Lorg/jetbrains/dokka/base/resolvers/shared/RecognizedLinkFormat;
-}
-
-public final class org/jetbrains/dokka/base/signatures/All : org/jetbrains/dokka/base/signatures/AtStrategy {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/signatures/All;
-}
-
-public abstract class org/jetbrains/dokka/base/signatures/AtStrategy {
-}
-
-public abstract interface class org/jetbrains/dokka/base/signatures/JvmSignatureUtils {
- public abstract fun annotations (Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public abstract fun annotations (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public abstract fun annotations (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public abstract fun annotationsBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public abstract fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public abstract fun annotationsInline (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public abstract fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public abstract fun modifiers (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public abstract fun parametersBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public abstract fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public abstract fun stylesIfDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public abstract fun toSignatureString (Ljava/util/Collection;)Ljava/lang/String;
- public abstract fun toSignatureString (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public abstract fun uses (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/base/signatures/JvmSignatureUtils$DefaultImpls {
- public static fun annotations (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public static fun annotations (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public static fun annotations (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public static fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public static fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public static fun parametersBlock (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public static fun plus (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public static fun stylesIfDeprecated (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public static fun toSignatureString (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Ljava/util/Collection;)Ljava/lang/String;
- public static fun toSignatureString (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public static fun uses (Lorg/jetbrains/dokka/base/signatures/JvmSignatureUtils;Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/base/signatures/KotlinSignatureProvider : org/jetbrains/dokka/base/signatures/JvmSignatureUtils, org/jetbrains/dokka/base/signatures/SignatureProvider {
- public fun <init> (Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/utilities/DokkaLogger;)V
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun annotations (Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun annotationsBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun annotationsInline (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun modifiers (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun parametersBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public fun signature (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/List;
- public fun stylesIfDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public fun toSignatureString (Ljava/util/Collection;)Ljava/lang/String;
- public fun toSignatureString (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun uses (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/base/signatures/KotlinSignatureUtils : org/jetbrains/dokka/base/signatures/JvmSignatureUtils {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/signatures/KotlinSignatureUtils;
- public fun annotations (Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun annotationsBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun annotationsInline (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public final fun getDri (Lorg/jetbrains/dokka/model/PrimitiveJavaType;)Lorg/jetbrains/dokka/links/DRI;
- public final fun getDriOrNull (Lorg/jetbrains/dokka/model/Bound;)Lorg/jetbrains/dokka/links/DRI;
- public final fun getDrisOfAllNestedBounds (Lorg/jetbrains/dokka/model/Projection;)Ljava/util/List;
- public fun modifiers (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun parametersBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public fun stylesIfDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public fun toSignatureString (Ljava/util/Collection;)Ljava/lang/String;
- public fun toSignatureString (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun uses (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/base/signatures/Never : org/jetbrains/dokka/base/signatures/AtStrategy {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/signatures/Never;
-}
-
-public final class org/jetbrains/dokka/base/signatures/OnlyOnce : org/jetbrains/dokka/base/signatures/AtStrategy {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/signatures/OnlyOnce;
-}
-
-public abstract interface class org/jetbrains/dokka/base/signatures/SignatureProvider {
- public abstract fun signature (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/templating/AddToNavigationCommand : org/jetbrains/dokka/base/templating/Command {
- public fun <init> (Ljava/lang/String;)V
- public final fun getModuleName ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/AddToSearch : org/jetbrains/dokka/base/templating/Command {
- public fun <init> (Ljava/lang/String;Ljava/util/List;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/util/List;
- public final fun copy (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/base/templating/AddToSearch;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/templating/AddToSearch;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/templating/AddToSearch;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getElements ()Ljava/util/List;
- public final fun getModuleName ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/AddToSourcesetDependencies : org/jetbrains/dokka/base/templating/Command {
- public fun <init> (Ljava/lang/String;Ljava/util/Map;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/util/Map;
- public final fun copy (Ljava/lang/String;Ljava/util/Map;)Lorg/jetbrains/dokka/base/templating/AddToSourcesetDependencies;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/templating/AddToSourcesetDependencies;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/templating/AddToSourcesetDependencies;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getContent ()Ljava/util/Map;
- public final fun getModuleName ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/base/templating/Command {
-}
-
-public abstract interface class org/jetbrains/dokka/base/templating/ImmediateHtmlCommandConsumer {
- public abstract fun canProcess (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public abstract fun processCommand (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)V
- public abstract fun processCommandAndFinalize (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/base/templating/InsertTemplateExtra : org/jetbrains/dokka/model/properties/ExtraProperty {
- public static final field Companion Lorg/jetbrains/dokka/base/templating/InsertTemplateExtra$Companion;
- public fun <init> (Lorg/jetbrains/dokka/base/templating/Command;)V
- public final fun component1 ()Lorg/jetbrains/dokka/base/templating/Command;
- public final fun copy (Lorg/jetbrains/dokka/base/templating/Command;)Lorg/jetbrains/dokka/base/templating/InsertTemplateExtra;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/templating/InsertTemplateExtra;Lorg/jetbrains/dokka/base/templating/Command;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/templating/InsertTemplateExtra;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getCommand ()Lorg/jetbrains/dokka/base/templating/Command;
- public fun getKey ()Lorg/jetbrains/dokka/model/properties/ExtraProperty$Key;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/InsertTemplateExtra$Companion : org/jetbrains/dokka/model/properties/ExtraProperty$Key {
- public synthetic fun mergeStrategyFor (Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
- public fun mergeStrategyFor (Lorg/jetbrains/dokka/base/templating/InsertTemplateExtra;Lorg/jetbrains/dokka/base/templating/InsertTemplateExtra;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
-}
-
-public final class org/jetbrains/dokka/base/templating/JsonMapperForPluginsKt {
- public static final fun parseJson (Ljava/lang/String;Lorg/jetbrains/dokka/base/templating/TypeReference;)Ljava/lang/Object;
- public static final fun toJsonString (Ljava/lang/Object;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/PathToRootSubstitutionCommand : org/jetbrains/dokka/base/templating/SubstitutionCommand {
- public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/dokka/base/templating/PathToRootSubstitutionCommand;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/templating/PathToRootSubstitutionCommand;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/templating/PathToRootSubstitutionCommand;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDefault ()Ljava/lang/String;
- public fun getPattern ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/ProjectNameSubstitutionCommand : org/jetbrains/dokka/base/templating/SubstitutionCommand {
- public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/dokka/base/templating/ProjectNameSubstitutionCommand;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/templating/ProjectNameSubstitutionCommand;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/templating/ProjectNameSubstitutionCommand;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDefault ()Ljava/lang/String;
- public fun getPattern ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/ReplaceVersionsCommand : org/jetbrains/dokka/base/templating/Command {
- public fun <init> ()V
- public fun <init> (Ljava/lang/String;)V
- public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;)Lorg/jetbrains/dokka/base/templating/ReplaceVersionsCommand;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/templating/ReplaceVersionsCommand;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/templating/ReplaceVersionsCommand;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getLocation ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/ResolveLinkCommand : org/jetbrains/dokka/base/templating/Command {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;)V
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
-}
-
-public abstract class org/jetbrains/dokka/base/templating/SubstitutionCommand : org/jetbrains/dokka/base/templating/Command {
- public fun <init> ()V
- public abstract fun getPattern ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/templating/TypeReference {
- public static final field Companion Lorg/jetbrains/dokka/base/templating/TypeReference$Companion;
- public fun <init> (Lcom/fasterxml/jackson/core/type/TypeReference;)V
-}
-
-public final class org/jetbrains/dokka/base/templating/TypeReference$Companion {
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/ActualTypealiasAdder : org/jetbrains/dokka/transformers/documentation/DocumentableTransformer {
- public fun <init> ()V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/CallableExtensions : org/jetbrains/dokka/model/properties/ExtraProperty {
- public static final field Key Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions$Key;
- public fun <init> (Ljava/util/Set;)V
- public final fun component1 ()Ljava/util/Set;
- public final fun copy (Ljava/util/Set;)Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getExtensions ()Ljava/util/Set;
- public fun getKey ()Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions$Key;
- public synthetic fun getKey ()Lorg/jetbrains/dokka/model/properties/ExtraProperty$Key;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/CallableExtensions$Key : org/jetbrains/dokka/model/properties/ExtraProperty$Key {
- public synthetic fun mergeStrategyFor (Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
- public fun mergeStrategyFor (Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions;Lorg/jetbrains/dokka/base/transformers/documentables/CallableExtensions;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/DeprecatedDocumentableFilterTransformer : org/jetbrains/dokka/base/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun shouldBeSuppressed (Lorg/jetbrains/dokka/model/Documentable;)Z
-}
-
-public abstract class org/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Ljava/util/List;)Ljava/util/List;
- protected fun processBound (Lorg/jetbrains/dokka/model/Bound;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processClassLike (Lorg/jetbrains/dokka/model/DClasslike;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processEnumEntry (Lorg/jetbrains/dokka/model/DEnumEntry;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processFunction (Lorg/jetbrains/dokka/model/DFunction;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processFunctionalTypeConstructor (Lorg/jetbrains/dokka/model/FunctionalTypeConstructor;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processGenericTypeConstructor (Lorg/jetbrains/dokka/model/GenericTypeConstructor;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processModule (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processPackage (Lorg/jetbrains/dokka/model/DPackage;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processParameter (Lorg/jetbrains/dokka/model/DParameter;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processProjection (Lorg/jetbrains/dokka/model/Projection;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processProperty (Lorg/jetbrains/dokka/model/DProperty;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processTypeAlias (Lorg/jetbrains/dokka/model/DTypeAlias;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processTypeParameter (Lorg/jetbrains/dokka/model/DTypeParameter;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- protected fun processVariance (Lorg/jetbrains/dokka/model/Variance;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
-}
-
-protected final class org/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges {
- public fun <init> (Ljava/lang/Object;Z)V
- public synthetic fun <init> (Ljava/lang/Object;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/lang/Object;
- public final fun component2 ()Z
- public final fun copy (Ljava/lang/Object;Z)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;Ljava/lang/Object;ZILjava/lang/Object;)Lorg/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer$AnyWithChanges;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getChanged ()Z
- public final fun getTarget ()Ljava/lang/Object;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/DocumentableVisibilityFilterTransformer : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/EmptyModulesFilterTransformer : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> ()V
- public fun invoke (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/EmptyPackagesFilterTransformer : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/ExtensionExtractorTransformer : org/jetbrains/dokka/transformers/documentation/DocumentableTransformer {
- public fun <init> ()V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/InheritedEntriesDocumentableFilterTransformer : org/jetbrains/dokka/base/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun shouldBeSuppressed (Lorg/jetbrains/dokka/model/Documentable;)Z
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/InheritorsExtractorTransformer : org/jetbrains/dokka/transformers/documentation/DocumentableTransformer {
- public fun <init> ()V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/InheritorsInfo : org/jetbrains/dokka/model/properties/ExtraProperty {
- public static final field Companion Lorg/jetbrains/dokka/base/transformers/documentables/InheritorsInfo$Companion;
- public fun <init> (Ljava/util/Map;)V
- public fun getKey ()Lorg/jetbrains/dokka/model/properties/ExtraProperty$Key;
- public final fun getValue ()Ljava/util/Map;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/InheritorsInfo$Companion : org/jetbrains/dokka/model/properties/ExtraProperty$Key {
- public synthetic fun mergeStrategyFor (Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
- public fun mergeStrategyFor (Lorg/jetbrains/dokka/base/transformers/documentables/InheritorsInfo;Lorg/jetbrains/dokka/base/transformers/documentables/InheritorsInfo;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/KotlinArrayDocumentableReplacerTransformer : org/jetbrains/dokka/base/transformers/documentables/DocumentableReplacerTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/ObviousFunctionsDocumentableFilterTransformer : org/jetbrains/dokka/base/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun shouldBeSuppressed (Lorg/jetbrains/dokka/model/Documentable;)Z
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/SuppressTagDocumentableFilter : org/jetbrains/dokka/base/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun shouldBeSuppressed (Lorg/jetbrains/dokka/model/Documentable;)Z
-}
-
-public abstract class org/jetbrains/dokka/base/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Ljava/util/List;)Ljava/util/List;
- public abstract fun shouldBeSuppressed (Lorg/jetbrains/dokka/model/Documentable;)Z
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/SuppressedByConfigurationDocumentableFilterTransformer : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/documentables/UtilsKt {
- public static final fun getDeprecatedAnnotation (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Lorg/jetbrains/dokka/model/Annotations$Annotation;
- public static final fun isDeprecated (Lorg/jetbrains/dokka/model/Annotations$Annotation;)Z
- public static final fun isDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Z
- public static final fun isException (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Z
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/annotations/SinceKotlinTransformer : org/jetbrains/dokka/transformers/documentation/DocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/annotations/SinceKotlinVersion : java/lang/Comparable {
- public fun <init> (Ljava/lang/String;)V
- public synthetic fun compareTo (Ljava/lang/Object;)I
- public fun compareTo (Lorg/jetbrains/dokka/base/transformers/pages/annotations/SinceKotlinVersion;)I
- public fun toString ()Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter {
- public abstract fun buildContent (Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/DCI;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter$DefaultImpls {
- public static synthetic fun buildContent$default (Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/DCI;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Ljava/util/List;
-}
-
-public class org/jetbrains/dokka/base/transformers/pages/comments/DocTagToContentConverter : org/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter {
- public fun <init> ()V
- public fun buildContent (Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/DCI;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/merger/FallbackPageMergerStrategy : org/jetbrains/dokka/base/transformers/pages/merger/PageMergerStrategy {
- public fun <init> (Lorg/jetbrains/dokka/utilities/DokkaLogger;)V
- public fun tryMerge (Ljava/util/List;Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/merger/PageMerger : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public abstract interface class org/jetbrains/dokka/base/transformers/pages/merger/PageMergerStrategy {
- public abstract fun tryMerge (Ljava/util/List;Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/merger/SameMethodNamePageMergerStrategy : org/jetbrains/dokka/base/transformers/pages/merger/PageMergerStrategy {
- public fun <init> (Lorg/jetbrains/dokka/utilities/DokkaLogger;)V
- public final fun getLogger ()Lorg/jetbrains/dokka/utilities/DokkaLogger;
- public fun tryMerge (Ljava/util/List;Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/merger/SourceSetMergingPageTransformer : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/sourcelinks/SourceLink {
- public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)V
- public fun <init> (Lorg/jetbrains/dokka/DokkaConfiguration$SourceLinkDefinition;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Ljava/lang/String;
- public final fun component4 ()Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;
- public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/base/transformers/pages/sourcelinks/SourceLink;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/transformers/pages/sourcelinks/SourceLink;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/transformers/pages/sourcelinks/SourceLink;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getLineSuffix ()Ljava/lang/String;
- public final fun getPath ()Ljava/lang/String;
- public final fun getSourceSetData ()Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;
- public final fun getUrl ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/sourcelinks/SourceLinksTransformer : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public abstract interface class org/jetbrains/dokka/base/transformers/pages/tags/CustomTagContentProvider {
- public abstract fun contentForBrief (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public abstract fun contentForDescription (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public abstract fun isApplicable (Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)Z
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/tags/CustomTagContentProvider$DefaultImpls {
- public static fun contentForBrief (Lorg/jetbrains/dokka/base/transformers/pages/tags/CustomTagContentProvider;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public static fun contentForDescription (Lorg/jetbrains/dokka/base/transformers/pages/tags/CustomTagContentProvider;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
-}
-
-public final class org/jetbrains/dokka/base/transformers/pages/tags/SinceKotlinTagContentProvider : org/jetbrains/dokka/base/transformers/pages/tags/CustomTagContentProvider {
- public static final field INSTANCE Lorg/jetbrains/dokka/base/transformers/pages/tags/SinceKotlinTagContentProvider;
- public fun contentForBrief (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public fun contentForDescription (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public fun isApplicable (Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)Z
-}
-
-public final class org/jetbrains/dokka/base/translators/descriptors/DefaultDescriptorToDocumentableTranslator : org/jetbrains/dokka/base/translators/descriptors/ExternalClasslikesTranslator, org/jetbrains/dokka/transformers/sources/AsyncSourceToDocumentableTranslator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
- public fun invokeSuspending (Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/plugability/DokkaContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
- public fun translateClassDescriptor (Ljava/lang/Object;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/model/DClasslike;
-}
-
-public final class org/jetbrains/dokka/base/translators/descriptors/DefaultExternalDocumentablesProvider : org/jetbrains/dokka/base/translators/descriptors/ExternalDocumentablesProvider {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun findClasslike (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/model/DClasslike;
-}
-
-public abstract interface class org/jetbrains/dokka/base/translators/descriptors/ExternalClasslikesTranslator {
- public abstract fun translateClassDescriptor (Ljava/lang/Object;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/model/DClasslike;
-}
-
-public abstract interface class org/jetbrains/dokka/base/translators/descriptors/ExternalDocumentablesProvider {
- public abstract fun findClasslike (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/model/DClasslike;
-}
-
-public final class org/jetbrains/dokka/base/translators/documentables/BriefFromContentNodesKt {
- public static final fun firstParagraphBrief (Lorg/jetbrains/dokka/model/doc/DocTag;)Lorg/jetbrains/dokka/model/doc/DocTag;
- public static final fun firstSentenceBriefFromContentNodes (Ljava/util/List;)Ljava/util/List;
-}
-
-public abstract interface annotation class org/jetbrains/dokka/base/translators/documentables/ContentBuilderMarker : java/lang/annotation/Annotation {
-}
-
-public final class org/jetbrains/dokka/base/translators/documentables/DefaultDocumentableToPageTranslator : org/jetbrains/dokka/transformers/documentation/DocumentableToPageTranslator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/ModulePageNode;
- public synthetic fun invoke (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/DefaultPageCreator {
- public fun <init> (Lorg/jetbrains/dokka/base/DokkaBaseConfiguration;Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/base/signatures/SignatureProvider;Lorg/jetbrains/dokka/utilities/DokkaLogger;Ljava/util/List;Lorg/jetbrains/dokka/analysis/kotlin/internal/DocumentableSourceLanguageParser;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/base/DokkaBaseConfiguration;Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/base/signatures/SignatureProvider;Lorg/jetbrains/dokka/utilities/DokkaLogger;Ljava/util/List;Lorg/jetbrains/dokka/analysis/kotlin/internal/DocumentableSourceLanguageParser;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- protected fun contentForBrief (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Documentable;)V
- protected fun contentForClasslikesAndEntries (Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForConstructors (Ljava/util/List;Ljava/util/Set;Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForDescription (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/List;
- protected fun contentForEntries (Ljava/util/List;Ljava/util/Set;Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForFunction (Lorg/jetbrains/dokka/model/DFunction;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForMember (Lorg/jetbrains/dokka/model/Documentable;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForMembers (Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForModule (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForPackage (Lorg/jetbrains/dokka/model/DPackage;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForProperty (Lorg/jetbrains/dokka/model/DProperty;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForScope (Lorg/jetbrains/dokka/model/WithScope;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public static synthetic fun contentForScope$default (Lorg/jetbrains/dokka/base/translators/documentables/DefaultPageCreator;Lorg/jetbrains/dokka/model/WithScope;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun contentForScopes (Ljava/util/List;Ljava/util/Set;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public static synthetic fun contentForScopes$default (Lorg/jetbrains/dokka/base/translators/documentables/DefaultPageCreator;Ljava/util/List;Ljava/util/Set;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentGroup;
- protected fun divergentBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Ljava/util/Collection;Lorg/jetbrains/dokka/pages/ContentKind;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public static synthetic fun divergentBlock$default (Lorg/jetbrains/dokka/base/translators/documentables/DefaultPageCreator;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Ljava/util/Collection;Lorg/jetbrains/dokka/pages/ContentKind;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- protected fun getContentBuilder ()Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;
- public final fun getCustomTagContentProviders ()Ljava/util/List;
- public final fun getDocumentableAnalyzer ()Lorg/jetbrains/dokka/analysis/kotlin/internal/DocumentableSourceLanguageParser;
- public final fun getLogger ()Lorg/jetbrains/dokka/utilities/DokkaLogger;
- protected final fun getMergeImplicitExpectActualDeclarations ()Z
- protected final fun getSeparateInheritedMembers ()Z
- public fun pageForClasslike (Lorg/jetbrains/dokka/model/Documentable;)Lorg/jetbrains/dokka/pages/ClasslikePageNode;
- public fun pageForClasslikes (Ljava/util/List;)Lorg/jetbrains/dokka/pages/ClasslikePageNode;
- public fun pageForEnumEntries (Ljava/util/List;)Lorg/jetbrains/dokka/pages/ClasslikePageNode;
- public fun pageForEnumEntry (Lorg/jetbrains/dokka/model/DEnumEntry;)Lorg/jetbrains/dokka/pages/ClasslikePageNode;
- public fun pageForFunction (Lorg/jetbrains/dokka/model/DFunction;)Lorg/jetbrains/dokka/pages/MemberPageNode;
- public fun pageForFunctions (Ljava/util/List;)Lorg/jetbrains/dokka/pages/MemberPageNode;
- public fun pageForModule (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/ModulePageNode;
- public fun pageForPackage (Lorg/jetbrains/dokka/model/DPackage;)Lorg/jetbrains/dokka/pages/PackagePageNode;
- public fun pageForProperties (Ljava/util/List;)Lorg/jetbrains/dokka/pages/MemberPageNode;
- public fun pageForProperty (Lorg/jetbrains/dokka/model/DProperty;)Lorg/jetbrains/dokka/pages/MemberPageNode;
- protected fun toHeaderString (Lorg/jetbrains/dokka/model/doc/TagWrapper;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/translators/documentables/DriClashAwareName : org/jetbrains/dokka/model/properties/ExtraProperty {
- public static final field Companion Lorg/jetbrains/dokka/base/translators/documentables/DriClashAwareName$Companion;
- public fun <init> (Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;)Lorg/jetbrains/dokka/base/translators/documentables/DriClashAwareName;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/translators/documentables/DriClashAwareName;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/translators/documentables/DriClashAwareName;
- public fun equals (Ljava/lang/Object;)Z
- public fun getKey ()Lorg/jetbrains/dokka/model/properties/ExtraProperty$Key;
- public final fun getValue ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/base/translators/documentables/DriClashAwareName$Companion : org/jetbrains/dokka/model/properties/ExtraProperty$Key {
- public synthetic fun mergeStrategyFor (Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
- public fun mergeStrategyFor (Lorg/jetbrains/dokka/base/translators/documentables/DriClashAwareName;Lorg/jetbrains/dokka/base/translators/documentables/DriClashAwareName;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/PageContentBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/base/signatures/SignatureProvider;Lorg/jetbrains/dokka/utilities/DokkaLogger;)V
- public final fun contentFor (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public final fun contentFor (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public final fun contentFor (Lorg/jetbrains/dokka/model/Documentable;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public static synthetic fun contentFor$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public static synthetic fun contentFor$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public static synthetic fun contentFor$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Lorg/jetbrains/dokka/model/Documentable;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public final fun getCommentsConverter ()Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;
- public final fun getLogger ()Lorg/jetbrains/dokka/utilities/DokkaLogger;
- public final fun getSignatureProvider ()Lorg/jetbrains/dokka/base/signatures/SignatureProvider;
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun build (Lorg/jetbrains/dokka/pages/ContentDivergentGroup$GroupID;ZLorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentDivergentGroup;
- public static synthetic fun build$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentBuilder;Lorg/jetbrains/dokka/pages/ContentDivergentGroup$GroupID;ZLorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentDivergentGroup;
- public final fun instance (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun instance$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentInstanceBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun after (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun after$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentInstanceBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun before (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun before$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentInstanceBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun build (Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentDivergentInstance;
- public static synthetic fun build$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentInstanceBuilder;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentDivergentInstance;
- public final fun divergent (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun divergent$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DivergentInstanceBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun block (Ljava/lang/String;ILorg/jetbrains/dokka/pages/Kind;Ljava/lang/Iterable;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ZZLjava/util/List;ZLkotlin/jvm/functions/Function2;)V
- public static synthetic fun block$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;ILorg/jetbrains/dokka/pages/Kind;Ljava/lang/Iterable;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ZZLjava/util/List;ZLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
- public final fun booleanLiteral (Z)V
- public final fun breakLine (Ljava/util/Set;)V
- public static synthetic fun breakLine$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/util/Set;ILjava/lang/Object;)V
- public final fun build (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public final fun buildGroup (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public static synthetic fun buildGroup$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentGroup;
- public final fun buildSignature (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/List;
- public final fun codeBlock (Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun codeBlock$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun codeInline (Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun codeInline$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun comment (Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public static synthetic fun comment$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- public final fun constant (Ljava/lang/String;)V
- public final fun cover (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun cover$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- protected final fun createText (Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentText;
- public final fun descriptionList (Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun descriptionList$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun divergentGroup (Lorg/jetbrains/dokka/pages/ContentDivergentGroup$GroupID;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ZLkotlin/jvm/functions/Function1;)V
- public static synthetic fun divergentGroup$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/pages/ContentDivergentGroup$GroupID;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun firstParagraphComment (Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public static synthetic fun firstParagraphComment$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- public final fun firstSentenceComment (Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public static synthetic fun firstSentenceComment$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/doc/DocTag;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- protected final fun getContents ()Ljava/util/List;
- public final fun getMainDRI ()Ljava/util/Set;
- public final fun getMainExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun getMainSourcesetData ()Ljava/util/Set;
- public final fun getMainStyles ()Ljava/util/Set;
- public final fun group (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun group$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun header (ILjava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun header$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;ILjava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun keyword (Ljava/lang/String;)V
- public final fun link (Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun link (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun link (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun link$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- public static synthetic fun link$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- public static synthetic fun link$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun linkNode (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/DCI;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentLink;
- public static synthetic fun linkNode$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/DCI;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentLink;
- public final fun list (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lkotlin/jvm/functions/Function2;)V
- public static synthetic fun list$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
- public final fun multiBlock (Ljava/lang/String;ILorg/jetbrains/dokka/pages/Kind;Ljava/lang/Iterable;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ZZLjava/util/List;ZLkotlin/jvm/functions/Function3;)V
- public static synthetic fun multiBlock$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;ILorg/jetbrains/dokka/pages/Kind;Ljava/lang/Iterable;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ZZLjava/util/List;ZLkotlin/jvm/functions/Function3;ILjava/lang/Object;)V
- public final fun operator (Ljava/lang/String;)V
- public final fun orderedList (Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun orderedList$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun punctuation (Ljava/lang/String;)V
- public final fun sourceSetDependentHint (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public final fun sourceSetDependentHint (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun sourceSetDependentHint$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public static synthetic fun sourceSetDependentHint$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun sourceSetDependentText (Ljava/util/Map;Ljava/util/Set;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun sourceSetDependentText$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/util/Map;Ljava/util/Set;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun stringLiteral (Ljava/lang/String;)V
- public final fun table (Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun table$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun text (Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public static synthetic fun text$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Ljava/lang/String;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)V
- public final fun unaryPlus (Ljava/util/Collection;)V
- public final fun unaryPlus (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public final fun unorderedList (Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun unorderedList$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/PageContentBuilder$ListBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;ZLjava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun build (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentList;
- public static synthetic fun build$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$ListBuilder;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentList;
- public final fun getOrdered ()Z
- public final fun item (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun item$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$ListBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public class org/jetbrains/dokka/base/translators/documentables/PageContentBuilder$TableBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public final fun build (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentTable;
- public static synthetic fun build$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$TableBuilder;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/pages/ContentTable;
- public final fun caption (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun caption$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$TableBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun header (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun header$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$TableBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
- public final fun row (Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun row$default (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$TableBuilder;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public final class org/jetbrains/dokka/base/translators/psi/DefaultPsiToDocumentableTranslator : org/jetbrains/dokka/transformers/sources/AsyncSourceToDocumentableTranslator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
- public fun invokeSuspending (Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/plugability/DokkaContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
-}
-
diff --git a/plugins/base/base-test-utils/api/base-test-utils.api b/plugins/base/base-test-utils/api/base-test-utils.api
deleted file mode 100644
index a6bdc192..00000000
--- a/plugins/base/base-test-utils/api/base-test-utils.api
+++ /dev/null
@@ -1,199 +0,0 @@
-public abstract class org/jetbrains/dokka/base/testApi/testRunner/BaseAbstractTest : org/jetbrains/dokka/testApi/testRunner/AbstractTest {
- public fun <init> ()V
- public fun <init> (Lorg/jetbrains/dokka/testApi/logger/TestLogger;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/testApi/logger/TestLogger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
-}
-
-public final class org/jetbrains/dokka/base/testApi/testRunner/BaseDokkaTestGenerator : org/jetbrains/dokka/testApi/testRunner/DokkaTestGenerator {
- public fun <init> (Lorg/jetbrains/dokka/DokkaConfiguration;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods;Ljava/util/List;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/DokkaConfiguration;Lorg/jetbrains/dokka/utilities/DokkaLogger;Lorg/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun generate ()V
-}
-
-public final class org/jetbrains/dokka/base/testApi/testRunner/BaseTestBuilder : org/jetbrains/dokka/testApi/testRunner/TestBuilder {
- public fun <init> ()V
- public fun build ()Lorg/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods;
- public synthetic fun build ()Lorg/jetbrains/dokka/testApi/testRunner/TestMethods;
- public final fun getDocumentablesCreationStage ()Lkotlin/jvm/functions/Function1;
- public final fun getDocumentablesMergingStage ()Lkotlin/jvm/functions/Function1;
- public final fun getDocumentablesTransformationStage ()Lkotlin/jvm/functions/Function1;
- public final fun getPagesGenerationStage ()Lkotlin/jvm/functions/Function1;
- public final fun getPagesTransformationStage ()Lkotlin/jvm/functions/Function1;
- public final fun getPluginsSetupStage ()Lkotlin/jvm/functions/Function1;
- public final fun getPreMergeDocumentablesTransformationStage ()Lkotlin/jvm/functions/Function1;
- public final fun getRenderingStage ()Lkotlin/jvm/functions/Function2;
- public final fun getVerificationStage ()Lkotlin/jvm/functions/Function1;
- public final fun setDocumentablesCreationStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setDocumentablesMergingStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setDocumentablesTransformationStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setPagesGenerationStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setPagesTransformationStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setPluginsSetupStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setPreMergeDocumentablesTransformationStage (Lkotlin/jvm/functions/Function1;)V
- public final fun setRenderingStage (Lkotlin/jvm/functions/Function2;)V
- public final fun setVerificationStage (Lkotlin/jvm/functions/Function1;)V
-}
-
-public final class org/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods : org/jetbrains/dokka/testApi/testRunner/CoreTestMethods {
- public fun <init> (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V
- public final fun component1 ()Lkotlin/jvm/functions/Function1;
- public final fun component2 ()Lkotlin/jvm/functions/Function1;
- public final fun component3 ()Lkotlin/jvm/functions/Function1;
- public final fun component4 ()Lkotlin/jvm/functions/Function1;
- public final fun component5 ()Lkotlin/jvm/functions/Function1;
- public final fun component6 ()Lkotlin/jvm/functions/Function1;
- public final fun component7 ()Lkotlin/jvm/functions/Function1;
- public final fun component8 ()Lkotlin/jvm/functions/Function1;
- public final fun component9 ()Lkotlin/jvm/functions/Function2;
- public final fun copy (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lorg/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/jetbrains/dokka/base/testApi/testRunner/BaseTestMethods;
- public fun equals (Ljava/lang/Object;)Z
- public fun getDocumentablesCreationStage ()Lkotlin/jvm/functions/Function1;
- public final fun getDocumentablesFirstTransformationStep ()Lkotlin/jvm/functions/Function1;
- public fun getDocumentablesMergingStage ()Lkotlin/jvm/functions/Function1;
- public fun getDocumentablesTransformationStage ()Lkotlin/jvm/functions/Function1;
- public fun getPagesGenerationStage ()Lkotlin/jvm/functions/Function1;
- public fun getPagesTransformationStage ()Lkotlin/jvm/functions/Function1;
- public fun getPluginsSetupStage ()Lkotlin/jvm/functions/Function1;
- public fun getRenderingStage ()Lkotlin/jvm/functions/Function2;
- public fun getVerificationStage ()Lkotlin/jvm/functions/Function1;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class renderers/RawTestPage : org/jetbrains/dokka/pages/RootPageNode, org/jetbrains/dokka/pages/ContentPage {
- public fun <init> (Lorg/jetbrains/dokka/pages/ContentNode;Ljava/lang/String;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/pages/ContentNode;Ljava/lang/String;Ljava/util/Set;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun getChildren ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDri ()Ljava/util/Set;
- public fun getEmbeddedResources ()Ljava/util/List;
- public fun getName ()Ljava/lang/String;
- public synthetic fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
-}
-
-public abstract class renderers/RenderingOnlyTestBase {
- public fun <init> ()V
- public abstract fun getContext ()Lorg/jetbrains/dokka/testApi/context/MockContext;
- public abstract fun getRenderedContent ()Ljava/lang/Object;
-}
-
-public final class renderers/TestPageKt {
- public static final fun testPage (Lkotlin/jvm/functions/Function1;)Lrenderers/RawTestPage;
-}
-
-public final class signatures/Parameter : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class signatures/Parameters : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class signatures/SignatureUtilsKt {
- public static final fun firstSignature (Lorg/jsoup/nodes/Element;)Lorg/jsoup/nodes/Element;
- public static final fun lastSignature (Lorg/jsoup/nodes/Element;)Lorg/jsoup/nodes/Element;
- public static final fun renderedContent (Lutils/TestOutputWriter;Ljava/lang/String;)Lorg/jsoup/nodes/Element;
- public static synthetic fun renderedContent$default (Lutils/TestOutputWriter;Ljava/lang/String;ILjava/lang/Object;)Lorg/jsoup/nodes/Element;
- public static final fun signature (Lorg/jsoup/nodes/Element;)Lorg/jsoup/select/Elements;
- public static final fun tab (Lorg/jsoup/nodes/Element;Ljava/lang/String;)Lorg/jsoup/select/Elements;
-}
-
-public final class utils/A : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/AssertHtmlEqualsIgnoringWhitespaceKt {
- public static final fun assertHtmlEqualsIgnoringWhitespace (Ljava/lang/String;Ljava/lang/String;)V
-}
-
-public final class utils/B : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/BlockQuote : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Br : utils/Tag {
- public static final field INSTANCE Lutils/Br;
-}
-
-public final class utils/Dd : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Div : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Dl : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Dt : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/I : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/JsoupUtilsKt {
- public static final fun match (Lorg/jsoup/nodes/Element;[Ljava/lang/Object;Z)V
- public static synthetic fun match$default (Lorg/jsoup/nodes/Element;[Ljava/lang/Object;ZILjava/lang/Object;)V
- public static final fun withClasses (Lutils/Tag;[Ljava/lang/String;)Lutils/Tag;
-}
-
-public final class utils/P : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/STRIKE : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Span : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public class utils/Tag {
- public fun <init> (Ljava/lang/String;[Ljava/lang/Object;Ljava/util/List;)V
- public synthetic fun <init> (Ljava/lang/String;[Ljava/lang/Object;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun getExpectedClasses ()Ljava/util/List;
- public final fun getMatchers ()[Ljava/lang/Object;
- public final fun getName ()Ljava/lang/String;
-}
-
-public final class utils/TestOutputWriter : org/jetbrains/dokka/base/renderers/OutputWriter {
- public fun <init> ()V
- public fun <init> (Z)V
- public synthetic fun <init> (ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun getContents ()Ljava/util/Map;
- public fun write (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
- public fun writeResources (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
-}
-
-public final class utils/TestOutputWriterPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public fun <init> (Z)V
- public synthetic fun <init> (ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun getTestWriter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getWriter ()Lutils/TestOutputWriter;
-}
-
-public final class utils/U : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Var : utils/Tag {
- public fun <init> ([Ljava/lang/Object;)V
-}
-
-public final class utils/Wbr : utils/Tag {
- public static final field INSTANCE Lutils/Wbr;
-}
-
diff --git a/plugins/base/base-test-utils/build.gradle.kts b/plugins/base/base-test-utils/build.gradle.kts
deleted file mode 100644
index 454deee6..00000000
--- a/plugins/base/base-test-utils/build.gradle.kts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-dependencies {
- compileOnly(projects.core)
- compileOnly(projects.plugins.base)
-
- api(projects.subprojects.analysisKotlinApi)
-
- // TODO [beresnev] analysis switcher
- //runtimeOnly(project(path = ":subprojects:analysis-kotlin-symbols", configuration = "shadow"))
- runtimeOnly(project(path = ":subprojects:analysis-kotlin-descriptors", configuration = "shadow"))
-
- implementation(kotlin("reflect"))
- implementation(libs.jsoup)
-
- implementation(kotlin("test"))
- implementation(projects.core.testApi)
-
- testImplementation(kotlin("test"))
- testImplementation(projects.core.testApi)
-}
-
-registerDokkaArtifactPublication("dokkaBaseTestUtils") {
- artifactId = "dokka-base-test-utils"
-}
diff --git a/plugins/base/base-test-utils/src/main/kotlin/renderers/JsoupUtils.kt b/plugins/base/base-test-utils/src/main/kotlin/renderers/JsoupUtils.kt
deleted file mode 100644
index fcd73ff0..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/renderers/JsoupUtils.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import org.jsoup.nodes.Element
-import org.jsoup.nodes.Node
-import org.jsoup.nodes.TextNode
-
-public fun Element.match(vararg matchers: Any, ignoreSpanWithTokenStyle:Boolean = false): Unit =
- childNodes()
- .let { list ->
- if(ignoreSpanWithTokenStyle) {
- list
- .filterNot { it is Element && it.tagName() == "span" && it.attr("class").startsWith("token ") && it.childNodeSize() == 0}
- .map { if(it is Element && it.tagName() == "span"
- && it.attr("class").startsWith("token ")
- && it.childNodeSize() == 1) it.childNode(0) else it }
- .uniteConsecutiveTextNodes()
- } else list
- }
- .filter { (it !is TextNode || it.text().isNotBlank())}
- .let { it.drop(it.size - matchers.size) }
- .zip(matchers)
- .forEach { (n, m) -> m.accepts(n, ignoreSpan = ignoreSpanWithTokenStyle) }
-
-public open class Tag(
- public val name: String,
- public vararg val matchers: Any,
- public val expectedClasses: List<String> = emptyList()
-)
-public class Div(vararg matchers: Any) : Tag("div", *matchers)
-public class P(vararg matchers: Any) : Tag("p", *matchers)
-public class Span(vararg matchers: Any) : Tag("span", *matchers)
-public class A(vararg matchers: Any) : Tag("a", *matchers)
-public class B(vararg matchers: Any) : Tag("b", *matchers)
-public class I(vararg matchers: Any) : Tag("i", *matchers)
-public class STRIKE(vararg matchers: Any) : Tag("strike", *matchers)
-public class BlockQuote(vararg matchers: Any) : Tag("blockquote", *matchers)
-public class Dl(vararg matchers: Any) : Tag("dl", *matchers)
-public class Dt(vararg matchers: Any) : Tag("dt", *matchers)
-public class Dd(vararg matchers: Any) : Tag("dd", *matchers)
-public class Var(vararg matchers: Any) : Tag("var", *matchers)
-public class U(vararg matchers: Any) : Tag("u", *matchers)
-public object Wbr : Tag("wbr")
-public object Br : Tag("br")
-
-public fun Tag.withClasses(vararg classes: String): Tag = Tag(name, *matchers, expectedClasses = classes.toList())
-
-private fun Any.accepts(n: Node, ignoreSpan:Boolean = true) {
- when (this) {
- is String -> assert(n is TextNode && n.text().trim() == this.trim()) { "\"$this\" expected but found: $n" }
- is Tag -> {
- check(n is Element) { "Expected node to be Element: $n" }
- assert(n.tagName() == name) { "Tag \"$name\" expected but found: \"$n\"" }
- expectedClasses.forEach {
- assert(n.hasClass(it)) { "Expected to find class \"$it\" for tag \"$name\", found: ${n.classNames()}" }
- }
- if (matchers.isNotEmpty()) n.match(*matchers, ignoreSpanWithTokenStyle = ignoreSpan)
- }
- else -> throw IllegalArgumentException("$this is not proper matcher")
- }
-}
-
-private fun List<Node>.uniteConsecutiveTextNodes(): MutableList<Node> {
- val resList = mutableListOf<Node>()
- var acc = StringBuilder()
- forEachIndexed { index, item ->
- if (item is TextNode) {
- acc.append(item.text())
- if (!(index + 1 < size && this[index + 1] is TextNode)) {
- resList.add(TextNode(acc.toString()))
- acc = StringBuilder()
- }
- } else resList.add(item)
- }
- return resList
- }
diff --git a/plugins/base/base-test-utils/src/main/kotlin/renderers/RenderingOnlyTestBase.kt b/plugins/base/base-test-utils/src/main/kotlin/renderers/RenderingOnlyTestBase.kt
deleted file mode 100644
index d2ff3ad4..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/renderers/RenderingOnlyTestBase.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers
-
-import org.jetbrains.dokka.testApi.context.MockContext
-
-public abstract class RenderingOnlyTestBase<T> {
- public abstract val context: MockContext
- public abstract val renderedContent: T
-}
diff --git a/plugins/base/base-test-utils/src/main/kotlin/renderers/SignatureUtils.kt b/plugins/base/base-test-utils/src/main/kotlin/renderers/SignatureUtils.kt
deleted file mode 100644
index ecbe809b..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/renderers/SignatureUtils.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-import utils.Tag
-import utils.TestOutputWriter
-
-public fun TestOutputWriter.renderedContent(path: String = "root/example.html"): Element =
- contents.getValue(path).let { Jsoup.parse(it) }.select("#content")
- .single()
-
-public fun Element.signature(): Elements = select("div.symbol.monospace")
-public fun Element.tab(tabName: String): Elements = select("div[data-togglable=\"$tabName\"]")
-public fun Element.firstSignature(): Element = signature().first() ?: throw NoSuchElementException("No signature found")
-public fun Element.lastSignature(): Element = signature().last() ?: throw NoSuchElementException("No signature found")
-
-public class Parameters(vararg matchers: Any) : Tag("span", *matchers, expectedClasses = listOf("parameters"))
-public class Parameter(vararg matchers: Any) : Tag("span", *matchers, expectedClasses = listOf("parameter"))
diff --git a/plugins/base/base-test-utils/src/main/kotlin/renderers/TestPage.kt b/plugins/base/base-test-utils/src/main/kotlin/renderers/TestPage.kt
deleted file mode 100644
index 6fb484bf..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/renderers/TestPage.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.signatures.KotlinSignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.doc.DocTag
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-
-public fun testPage(callback: PageContentBuilder.DocumentableContentBuilder.() -> Unit): RawTestPage {
- val content = PageContentBuilder(
- EmptyCommentConverter,
- KotlinSignatureProvider(EmptyCommentConverter, DokkaConsoleLogger(LoggingLevel.DEBUG)),
- DokkaConsoleLogger(LoggingLevel.DEBUG)
- ).contentFor(
- DRI.topLevel,
- emptySet(),
- block = callback
- )
-
- return RawTestPage(content)
-}
-
-public class RawTestPage(
- override val content: ContentNode,
- override val name: String = "testPage",
- override val dri: Set<DRI> = setOf(DRI.topLevel),
- override val embeddedResources: List<String> = emptyList(),
- override val children: List<PageNode> = emptyList(),
-): RootPageNode(), ContentPage {
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage = this
-
- override fun modified(name: String, children: List<PageNode>): RootPageNode = this
-
-}
-
-internal object EmptyCommentConverter : CommentsToContentConverter {
- override fun buildContent(
- docTag: DocTag,
- dci: DCI,
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet>,
- styles: Set<Style>,
- extras: PropertyContainer<ContentNode>
- ): List<ContentNode> = emptyList()
-}
diff --git a/plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt b/plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt
deleted file mode 100644
index 3dc0e54b..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.testApi.testRunner
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaGenerator
-import org.jetbrains.dokka.base.generation.SingleModuleGeneration
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.testApi.logger.TestLogger
-import org.jetbrains.dokka.testApi.testRunner.AbstractTest
-import org.jetbrains.dokka.testApi.testRunner.CoreTestMethods
-import org.jetbrains.dokka.testApi.testRunner.DokkaTestGenerator
-import org.jetbrains.dokka.testApi.testRunner.TestBuilder
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-
-public class BaseDokkaTestGenerator(
- configuration: DokkaConfiguration,
- logger: DokkaLogger,
- testMethods: BaseTestMethods,
- additionalPlugins: List<DokkaPlugin> = emptyList()
-) : DokkaTestGenerator<BaseTestMethods>(configuration, logger, testMethods, additionalPlugins) {
-
- override fun generate() {
- with(testMethods) {
- val dokkaGenerator = DokkaGenerator(configuration, logger)
-
- val context =
- dokkaGenerator.initializePlugins(configuration, logger, additionalPlugins)
- pluginsSetupStage(context)
-
- val singleModuleGeneration = context.single(CoreExtensions.generation) as SingleModuleGeneration
-
- val modulesFromPlatforms = singleModuleGeneration.createDocumentationModels()
- documentablesCreationStage(modulesFromPlatforms)
-
- verificationStage { singleModuleGeneration.validityCheck(context) }
-
- val filteredModules = singleModuleGeneration.transformDocumentationModelBeforeMerge(modulesFromPlatforms)
- documentablesFirstTransformationStep(filteredModules)
-
- val documentationModel = singleModuleGeneration.mergeDocumentationModels(filteredModules)
- documentablesMergingStage(documentationModel!!)
-
- val transformedDocumentation = singleModuleGeneration.transformDocumentationModelAfterMerge(documentationModel)
- documentablesTransformationStage(transformedDocumentation)
-
- val pages = singleModuleGeneration.createPages(transformedDocumentation)
- pagesGenerationStage(pages)
-
- val transformedPages = singleModuleGeneration.transformPages(pages)
- pagesTransformationStage(transformedPages)
-
- singleModuleGeneration.render(transformedPages)
- renderingStage(transformedPages, context)
-
- singleModuleGeneration.runPostActions()
-
- singleModuleGeneration.reportAfterRendering()
- }
- }
-}
-
-public data class BaseTestMethods(
- override val pluginsSetupStage: (DokkaContext) -> Unit,
- override val verificationStage: (() -> Unit) -> Unit,
- override val documentablesCreationStage: (List<DModule>) -> Unit,
- val documentablesFirstTransformationStep: (List<DModule>) -> Unit,
- override val documentablesMergingStage: (DModule) -> Unit,
- override val documentablesTransformationStage: (DModule) -> Unit,
- override val pagesGenerationStage: (RootPageNode) -> Unit,
- override val pagesTransformationStage: (RootPageNode) -> Unit,
- override val renderingStage: (RootPageNode, DokkaContext) -> Unit
-) : CoreTestMethods(
- pluginsSetupStage,
- verificationStage,
- documentablesCreationStage,
- documentablesMergingStage,
- documentablesTransformationStage,
- pagesGenerationStage,
- pagesTransformationStage,
- renderingStage,
-)
-
-public class BaseTestBuilder : TestBuilder<BaseTestMethods>() {
- public var pluginsSetupStage: (DokkaContext) -> Unit = {}
- public var verificationStage: (() -> Unit) -> Unit = {}
- public var documentablesCreationStage: (List<DModule>) -> Unit = {}
- public var preMergeDocumentablesTransformationStage: (List<DModule>) -> Unit = {}
- public var documentablesMergingStage: (DModule) -> Unit = {}
- public var documentablesTransformationStage: (DModule) -> Unit = {}
- public var pagesGenerationStage: (RootPageNode) -> Unit = {}
- public var pagesTransformationStage: (RootPageNode) -> Unit = {}
- public var renderingStage: (RootPageNode, DokkaContext) -> Unit = { _, _ -> }
-
- override fun build(): BaseTestMethods {
- return BaseTestMethods(
- pluginsSetupStage,
- verificationStage,
- documentablesCreationStage,
- preMergeDocumentablesTransformationStage,
- documentablesMergingStage,
- documentablesTransformationStage,
- pagesGenerationStage,
- pagesTransformationStage,
- renderingStage
- )
- }
-}
-
-public abstract class BaseAbstractTest(
- logger: TestLogger = TestLogger(DokkaConsoleLogger(LoggingLevel.DEBUG))
-) : AbstractTest<BaseTestMethods, BaseTestBuilder, BaseDokkaTestGenerator>(
- ::BaseTestBuilder,
- ::BaseDokkaTestGenerator,
- logger,
-)
diff --git a/plugins/base/base-test-utils/src/main/kotlin/utils/TestOutputWriter.kt b/plugins/base/base-test-utils/src/main/kotlin/utils/TestOutputWriter.kt
deleted file mode 100644
index 089a94ca..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/utils/TestOutputWriter.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.OutputWriter
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.Extension
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import java.util.*
-
-public class TestOutputWriterPlugin(failOnOverwrite: Boolean = true) : DokkaPlugin() {
- public val writer: TestOutputWriter = TestOutputWriter(failOnOverwrite)
-
- private val dokkaBase by lazy { plugin<DokkaBase>() }
-
- public val testWriter: Extension<OutputWriter, *, *> by extending {
- (dokkaBase.outputWriter
- with writer
- override dokkaBase.fileWriter)
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
-
-public class TestOutputWriter(
- private val failOnOverwrite: Boolean = true
-) : OutputWriter {
- public val contents: Map<String, String> get() = _contents
- private val _contents = Collections.synchronizedMap(mutableMapOf<String, String>())
-
- override suspend fun write(path: String, text: String, ext: String) {
- val fullPath = "$path$ext"
- _contents.putIfAbsent(fullPath, text)?.also {
- if (failOnOverwrite) throw AssertionError("File $fullPath is being overwritten.")
- }
- }
-
- override suspend fun writeResources(pathFrom: String, pathTo: String) {
- write(pathTo, "*** content of $pathFrom ***", "")
- }
-}
diff --git a/plugins/base/base-test-utils/src/main/kotlin/utils/assertHtmlEqualsIgnoringWhitespace.kt b/plugins/base/base-test-utils/src/main/kotlin/utils/assertHtmlEqualsIgnoringWhitespace.kt
deleted file mode 100644
index 207ebb8a..00000000
--- a/plugins/base/base-test-utils/src/main/kotlin/utils/assertHtmlEqualsIgnoringWhitespace.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Document
-import kotlin.test.assertEquals
-
-/**
- * Parses it using JSOUP, trims whitespace at the end of the line and asserts if they are equal
- * parsing is required to unify the formatting
- */
-public fun assertHtmlEqualsIgnoringWhitespace(expected: String, actual: String) {
- val ignoreFormattingSettings = Document.OutputSettings().indentAmount(0).outline(true)
- assertEquals(
- Jsoup.parse(expected).outputSettings(ignoreFormattingSettings).outerHtml().trimSpacesAtTheEndOfLine(),
- Jsoup.parse(actual).outputSettings(ignoreFormattingSettings).outerHtml().trimSpacesAtTheEndOfLine()
- )
-}
-
-private fun String.trimSpacesAtTheEndOfLine(): String =
- replace(" \n", "\n")
diff --git a/plugins/base/build.gradle.kts b/plugins/base/build.gradle.kts
deleted file mode 100644
index cc89832e..00000000
--- a/plugins/base/build.gradle.kts
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
- id("org.jetbrains.conventions.dokka-html-frontend-files")
- id("org.jetbrains.conventions.base-unit-test")
-}
-
-dependencies {
- compileOnly(projects.core)
- compileOnly(projects.subprojects.analysisKotlinApi)
-
- implementation(projects.subprojects.analysisMarkdownJb)
-
- // Other
- implementation(kotlin("reflect"))
- implementation(libs.kotlinx.coroutines.core)
- implementation(libs.jsoup)
- implementation(libs.freemarker)
- implementation(libs.kotlinx.html)
- implementation(libs.jackson.kotlin)
- constraints {
- implementation(libs.jackson.databind) {
- because("CVE-2022-42003")
- }
- }
-
- // Test only
- testImplementation(kotlin("test"))
- testImplementation(libs.junit.jupiterParams)
-
- symbolsTestConfiguration(project(path = ":subprojects:analysis-kotlin-symbols", configuration = "shadow"))
- descriptorsTestConfiguration(project(path = ":subprojects:analysis-kotlin-descriptors", configuration = "shadow"))
- testImplementation(projects.plugins.base.baseTestUtils) {
- exclude(module = "analysis-kotlin-descriptors")
- }
- testImplementation(projects.core.contentMatcherTestUtils)
- testImplementation(projects.core.testApi)
-
- dokkaHtmlFrontendFiles(projects.plugins.base.frontend) {
- because("fetch frontend files from subproject :plugins:base:frontend")
- }
-}
-
-// access the frontend files via the dependency on :plugins:base:frontend
-val dokkaHtmlFrontendFiles: Provider<FileCollection> =
- configurations.dokkaHtmlFrontendFiles.map { frontendFiles ->
- frontendFiles.incoming.artifacts.artifactFiles
- }
-
-val preparedokkaHtmlFrontendFiles by tasks.registering(Sync::class) {
- description = "copy Dokka Base frontend files into the resources directory"
-
- from(dokkaHtmlFrontendFiles) {
- include("*.js")
- into("dokka/scripts")
- }
-
- from(dokkaHtmlFrontendFiles) {
- include("*.css")
- into("dokka/styles")
- }
-
- into(layout.buildDirectory.dir("generated/src/main/resources"))
-}
-
-sourceSets.main {
- resources.srcDir(preparedokkaHtmlFrontendFiles.map { it.destinationDir })
-}
-
-tasks.test {
- maxHeapSize = "4G"
-}
-
-registerDokkaArtifactPublication("dokkaBase") {
- artifactId = "dokka-base"
-}
diff --git a/plugins/base/frontend/.gitignore b/plugins/base/frontend/.gitignore
deleted file mode 100644
index 81ce55f2..00000000
--- a/plugins/base/frontend/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/dist/
-/node_modules/ \ No newline at end of file
diff --git a/plugins/base/frontend/build.gradle.kts b/plugins/base/frontend/build.gradle.kts
deleted file mode 100644
index a4e0bbc0..00000000
--- a/plugins/base/frontend/build.gradle.kts
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import com.github.gradle.node.npm.task.NpmTask
-import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
-
-@Suppress("DSL_SCOPE_VIOLATION") // fixed in Gradle 8.1 https://github.com/gradle/gradle/pull/23639
-plugins {
- id("org.jetbrains.conventions.dokka-html-frontend-files")
- alias(libs.plugins.gradleNode)
-}
-
-node {
- version.set(libs.versions.node)
-
- // https://github.com/node-gradle/gradle-node-plugin/blob/3.5.1/docs/faq.md#is-this-plugin-compatible-with-centralized-repositories-declaration
- download.set(true)
- distBaseUrl.set(null as String?) // Strange cast to avoid overload ambiguity
-}
-
-val distributionDirectory = layout.projectDirectory.dir("dist")
-
-val npmRunBuild by tasks.registering(NpmTask::class) {
- dependsOn(tasks.npmInstall)
-
- npmCommand.set(parseSpaceSeparatedArgs("run build"))
-
- inputs.dir("src/main")
- inputs.files(
- "package.json",
- "webpack.config.js",
- )
-
- outputs.dir(distributionDirectory)
- outputs.cacheIf { true }
-}
-
-configurations.dokkaHtmlFrontendFilesElements.configure {
- outgoing {
- artifact(distributionDirectory) {
- builtBy(npmRunBuild)
- }
- }
-}
-
-tasks.clean {
- delete(
- file("node_modules"),
- file("dist"),
- )
-}
diff --git a/plugins/base/frontend/package-lock.json b/plugins/base/frontend/package-lock.json
deleted file mode 100644
index 998af866..00000000
--- a/plugins/base/frontend/package-lock.json
+++ /dev/null
@@ -1,19352 +0,0 @@
-{
- "name": "search",
- "version": "1.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "search",
- "version": "1.0.0",
- "dependencies": {
- "@babel/core": "^7.16.0",
- "@jetbrains/babel-preset-jetbrains": "^2.3.1",
- "@jetbrains/logos": "1.4.27",
- "@jetbrains/ring-ui": "^4.1.3",
- "@types/node": "^16.11.10",
- "@types/react": "^17.0.37",
- "@types/react-dom": "^17.0.11",
- "babel-loader": "^8.2.3",
- "lodash": "^4.17.21",
- "postcss-import": "^14.0.2",
- "postcss-preset-env": "^7.0.1",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
- "ts-loader": "^9.2.6",
- "typescript": "^4.5.2",
- "webpack": "^5.76.0",
- "webpack-cli": "^4.9.1",
- "webpack-dev-server": "^4.6.0"
- },
- "devDependencies": {
- "@babel/eslint-parser": "^7.16.3",
- "@jetbrains/stylelint-config": "^3.0.2",
- "@types/lodash": "^4.14.177",
- "eslint": "^8.3.0",
- "mini-css-extract-plugin": "^2.4.5",
- "react-svg-loader": "^3.0.3",
- "sass": "^1.43.5",
- "sass-loader": "^12.3.0",
- "stylelint": "^14.1.0",
- "svg-inline-loader": "^0.8.2",
- "terser-webpack-plugin": "^5.2.5"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
- "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
- "dependencies": {
- "@babel/highlight": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
- "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz",
- "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==",
- "dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helpers": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
- "semver": "^6.3.0",
- "source-map": "^0.5.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/eslint-parser": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz",
- "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==",
- "dev": true,
- "dependencies": {
- "eslint-scope": "^5.1.1",
- "eslint-visitor-keys": "^2.1.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
- },
- "peerDependencies": {
- "@babel/core": ">=7.11.0",
- "eslint": "^7.5.0 || ^8.0.0"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz",
- "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==",
- "dependencies": {
- "@babel/types": "^7.16.0",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
- "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz",
- "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==",
- "dependencies": {
- "@babel/helper-explode-assignable-expression": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
- "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
- "dependencies": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-validator-option": "^7.14.5",
- "browserslist": "^4.17.5",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz",
- "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-member-expression-to-functions": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz",
- "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "regexpu-core": "^4.7.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz",
- "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.13.0",
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/traverse": "^7.13.0",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2",
- "semver": "^6.1.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0-0"
- }
- },
- "node_modules/@babel/helper-explode-assignable-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz",
- "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
- "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
- "dependencies": {
- "@babel/helper-get-function-arity": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-get-function-arity": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
- "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
- "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz",
- "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
- "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz",
- "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-simple-access": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/helper-validator-identifier": "^7.15.7",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
- "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
- "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz",
- "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-wrap-function": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz",
- "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==",
- "dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
- "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
- "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
- "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
- "dependencies": {
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.15.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
- "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
- "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz",
- "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==",
- "dependencies": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz",
- "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==",
- "dependencies": {
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.3",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
- "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz",
- "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==",
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.16.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz",
- "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
- }
- },
- "node_modules/@babel/plugin-proposal-async-generator-functions": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz",
- "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.4",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-class-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz",
- "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-class-static-block": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz",
- "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-class-static-block": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0"
- }
- },
- "node_modules/@babel/plugin-proposal-dynamic-import": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz",
- "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-export-namespace-from": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz",
- "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-json-strings": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz",
- "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz",
- "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz",
- "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-numeric-separator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz",
- "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-object-rest-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz",
- "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==",
- "dependencies": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz",
- "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-methods": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz",
- "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz",
- "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz",
- "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz",
- "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz",
- "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz",
- "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz",
- "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz",
- "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz",
- "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz",
- "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz",
- "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz",
- "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz",
- "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz",
- "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz",
- "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==",
- "dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz",
- "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz",
- "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==",
- "dependencies": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz",
- "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz",
- "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz",
- "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz",
- "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-simple-access": "^7.16.0",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz",
- "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==",
- "dependencies": {
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-identifier": "^7.15.7",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz",
- "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz",
- "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz",
- "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz",
- "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz",
- "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz",
- "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz",
- "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz",
- "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-jsx": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz",
- "integrity": "sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz",
- "integrity": "sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz",
- "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==",
- "dependencies": {
- "regenerator-transform": "^0.14.2"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz",
- "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz",
- "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "babel-plugin-polyfill-corejs2": "^0.3.0",
- "babel-plugin-polyfill-corejs3": "^0.4.0",
- "babel-plugin-polyfill-regenerator": "^0.3.0",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz",
- "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz",
- "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz",
- "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-strict-mode": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.16.0.tgz",
- "integrity": "sha512-lcLX2TEX4EI5fRQDV7dIWNJdLnyhVE7K5oHZkKpo/lnOP+7LdkrV9v/enjBxts+xLn56TGf6zbyB2rvYl1zbYQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz",
- "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz",
- "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typescript": {
- "version": "7.16.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz",
- "integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-typescript": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz",
- "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz",
- "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-env": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz",
- "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==",
- "dependencies": {
- "@babel/compat-data": "^7.16.4",
- "@babel/helper-compilation-targets": "^7.16.3",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.16.4",
- "@babel/plugin-proposal-class-properties": "^7.16.0",
- "@babel/plugin-proposal-class-static-block": "^7.16.0",
- "@babel/plugin-proposal-dynamic-import": "^7.16.0",
- "@babel/plugin-proposal-export-namespace-from": "^7.16.0",
- "@babel/plugin-proposal-json-strings": "^7.16.0",
- "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
- "@babel/plugin-proposal-numeric-separator": "^7.16.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.16.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-private-methods": "^7.16.0",
- "@babel/plugin-proposal-private-property-in-object": "^7.16.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.16.0",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-transform-arrow-functions": "^7.16.0",
- "@babel/plugin-transform-async-to-generator": "^7.16.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.16.0",
- "@babel/plugin-transform-block-scoping": "^7.16.0",
- "@babel/plugin-transform-classes": "^7.16.0",
- "@babel/plugin-transform-computed-properties": "^7.16.0",
- "@babel/plugin-transform-destructuring": "^7.16.0",
- "@babel/plugin-transform-dotall-regex": "^7.16.0",
- "@babel/plugin-transform-duplicate-keys": "^7.16.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.16.0",
- "@babel/plugin-transform-for-of": "^7.16.0",
- "@babel/plugin-transform-function-name": "^7.16.0",
- "@babel/plugin-transform-literals": "^7.16.0",
- "@babel/plugin-transform-member-expression-literals": "^7.16.0",
- "@babel/plugin-transform-modules-amd": "^7.16.0",
- "@babel/plugin-transform-modules-commonjs": "^7.16.0",
- "@babel/plugin-transform-modules-systemjs": "^7.16.0",
- "@babel/plugin-transform-modules-umd": "^7.16.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0",
- "@babel/plugin-transform-new-target": "^7.16.0",
- "@babel/plugin-transform-object-super": "^7.16.0",
- "@babel/plugin-transform-parameters": "^7.16.3",
- "@babel/plugin-transform-property-literals": "^7.16.0",
- "@babel/plugin-transform-regenerator": "^7.16.0",
- "@babel/plugin-transform-reserved-words": "^7.16.0",
- "@babel/plugin-transform-shorthand-properties": "^7.16.0",
- "@babel/plugin-transform-spread": "^7.16.0",
- "@babel/plugin-transform-sticky-regex": "^7.16.0",
- "@babel/plugin-transform-template-literals": "^7.16.0",
- "@babel/plugin-transform-typeof-symbol": "^7.16.0",
- "@babel/plugin-transform-unicode-escapes": "^7.16.0",
- "@babel/plugin-transform-unicode-regex": "^7.16.0",
- "@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.16.0",
- "babel-plugin-polyfill-corejs2": "^0.3.0",
- "babel-plugin-polyfill-corejs3": "^0.4.0",
- "babel-plugin-polyfill-regenerator": "^0.3.0",
- "core-js-compat": "^3.19.1",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-modules": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
- "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-react": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz",
- "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-transform-react-display-name": "^7.16.0",
- "@babel/plugin-transform-react-jsx": "^7.16.0",
- "@babel/plugin-transform-react-jsx-development": "^7.16.0",
- "@babel/plugin-transform-react-pure-annotations": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-typescript": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz",
- "integrity": "sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-transform-typescript": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz",
- "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==",
- "dependencies": {
- "regenerator-runtime": "^0.13.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
- "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
- "dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/types": "^7.16.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz",
- "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==",
- "dependencies": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/parser": "^7.16.3",
- "@babel/types": "^7.16.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
- "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@csstools/convert-colors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-2.0.0.tgz",
- "integrity": "sha512-P7BVvddsP2Wl5v3drJ3ArzpdfXMqoZ/oHOV/yFiGFb3JQr9Z9UXZ9tnHAKJsO89lfprR1F9ExW3Yij21EjEBIA==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz",
- "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
- "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.0.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
- "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
- "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
- "dependencies": {
- "@humanwhocodes/object-schema": "^1.2.0",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
- },
- "node_modules/@jetbrains/angular-elastic": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/@jetbrains/angular-elastic/-/angular-elastic-2.5.1.tgz",
- "integrity": "sha512-/XU38+J5c3vKKoiwGmqze0UaKt7mnrR0mQJg1WxuZFBSTf6e1co8rN8bgxik0jAX5s8yXUMWhPhmrIYKaR140Q==",
- "dependencies": {
- "angular": ">=1.0.6"
- }
- },
- "node_modules/@jetbrains/babel-preset-jetbrains": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@jetbrains/babel-preset-jetbrains/-/babel-preset-jetbrains-2.3.1.tgz",
- "integrity": "sha512-Vca81kSeBSlG7Pke07X2PyJk+kNBxxAEs8XZwDDQiPopVzx+A0fVixKqdHYuBSadJbvkl0LNLizrph+pqbcfQg==",
- "dependencies": {
- "@babel/plugin-transform-runtime": "^7.14.3",
- "@babel/plugin-transform-strict-mode": "^7.12.13",
- "@babel/preset-env": "^7.14.4",
- "@babel/preset-react": "^7.13.13",
- "@babel/preset-typescript": "^7.14.5",
- "@babel/runtime": "^7.14.0",
- "babel-plugin-angularjs-annotate": "^0.10.0"
- },
- "engines": {
- "node": ">8.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.14.0",
- "core-js": ">=2.0.0"
- }
- },
- "node_modules/@jetbrains/icons": {
- "version": "3.18.0",
- "resolved": "https://registry.npmjs.org/@jetbrains/icons/-/icons-3.18.0.tgz",
- "integrity": "sha512-aaKe4KVwjbnnbXEdWCVWMNwHrE1WCdwpVZYt468NXHukPX8KfnE8pGGuUcyEC/j4lXm+V8N24yGZ3GGMfq/wFA=="
- },
- "node_modules/@jetbrains/logos": {
- "version": "1.4.27",
- "resolved": "https://registry.npmjs.org/@jetbrains/logos/-/logos-1.4.27.tgz",
- "integrity": "sha512-1+S4mjh7Z9HliTlgJeemr+my4mD6HeEY0GH/qc8FKsY7jprFPsbJnfgiVdrhRFMtx7Rb4AKRjiM4CIqqweF+zA=="
- },
- "node_modules/@jetbrains/postcss-require-hover": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@jetbrains/postcss-require-hover/-/postcss-require-hover-0.1.2.tgz",
- "integrity": "sha512-U094mXSp0KOfqZLTlkPLz4vHdIZYm1gJFRFJP7nMrGA1OI4Nigwl0TUwFt/7YDNAff57Eo9Zttu9Ln5QoXguAw==",
- "dependencies": {
- "postcss": "^6.0.1"
- }
- },
- "node_modules/@jetbrains/postcss-require-hover/node_modules/postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "dependencies": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/@jetbrains/postcss-require-hover/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@jetbrains/ring-ui": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/@jetbrains/ring-ui/-/ring-ui-4.1.3.tgz",
- "integrity": "sha512-fjtzJ/bB/8/mGksTdYVQ7u6zZWqV4mN7z+0THmYal6JQaAx9yemR5oJ65NgD7Orb+LUsKU/S2eaLQLoXL4vDoQ==",
- "dependencies": {
- "@babel/core": "^7.16.0",
- "@jetbrains/angular-elastic": "^2.5.1",
- "@jetbrains/babel-preset-jetbrains": "^2.3.1",
- "@jetbrains/icons": "^3.18.0",
- "@jetbrains/logos": "^1.4.27",
- "@jetbrains/postcss-require-hover": "^0.1.2",
- "@ungap/url-search-params": "^0.2.2",
- "babel-loader": "^8.2.3",
- "babel-plugin-transform-define": "^2.0.1",
- "browserslist": "^4.16.6",
- "change-case": "^4.1.1",
- "classnames": "^2.3.1",
- "combokeys": "^3.0.1",
- "compile-code-loader": "^1.0.0",
- "conic-gradient": "^1.0.0",
- "css-loader": "^6.5.1",
- "date-fns": "^2.26.0",
- "deep-equal": "^2.0.4",
- "element-resize-detector": "^1.2.3",
- "es6-error": "^4.1.1",
- "eslint-plugin-react-hooks": "^4.3.0",
- "extricate-loader": "^3.0.0",
- "fastdom": "^1.0.10",
- "file-loader": "^6.2.0",
- "focus-trap": "^6.7.1",
- "focus-visible": "^5.2.0",
- "highlight.js": "^10.7.2",
- "html-loader": "^3.0.1",
- "interpolate-loader": "^2.0.1",
- "just-debounce-it": "^3.0.1",
- "memoize-one": "^6.0.0",
- "postcss": "^8.3.11",
- "postcss-calc": "^8.0.0",
- "postcss-flexbugs-fixes": "^5.0.2",
- "postcss-font-family-system-ui": "^5.0.0",
- "postcss-loader": "^6.2.0",
- "postcss-modules-values-replace": "^3.4.0",
- "postcss-preset-env": "^7.0.1",
- "prop-types": "^15.7.2",
- "react-markdown": "^5.0.3",
- "react-movable": "^3.0.2",
- "react-virtualized": "^9.22.3",
- "react-waypoint": "^10.1.0",
- "remark-breaks": "^3.0.2",
- "remark-gfm": "^1.0.0",
- "scrollbar-width": "^3.1.1",
- "simply-uuid": "^1.0.1",
- "sniffr": "^1.2.0",
- "style-inject": "^0.3.0",
- "style-loader": "~3.3.1",
- "url-loader": "^4.1.1",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=7.4",
- "npm": ">=6.0.0"
- },
- "peerDependencies": {
- "core-js": ">=3.0.0",
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0",
- "webpack": "^5.64.2"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- }
- }
- },
- "node_modules/@jetbrains/ring-ui/node_modules/extricate-loader": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/extricate-loader/-/extricate-loader-3.0.0.tgz",
- "integrity": "sha512-Ts6BIh25xhFpeGaG0La345bYQdRXWv3ZvUwmJB6/QsXRywWrZmM1hGz8eZfQaBwy/HsmGOZevzGLesVtsrrmyg==",
- "dependencies": {
- "loader-utils": "^1.1.0"
- },
- "peerDependencies": {
- "webpack": "^4.0.0"
- }
- },
- "node_modules/@jetbrains/ring-ui/node_modules/react-virtualized": {
- "version": "9.22.3",
- "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz",
- "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==",
- "dependencies": {
- "@babel/runtime": "^7.7.2",
- "clsx": "^1.0.4",
- "dom-helpers": "^5.1.3",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.7.2",
- "react-lifecycles-compat": "^3.0.4"
- },
- "peerDependencies": {
- "react": "^15.3.0 || ^16.0.0-alpha",
- "react-dom": "^15.3.0 || ^16.0.0-alpha"
- }
- },
- "node_modules/@jetbrains/stylelint-config": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@jetbrains/stylelint-config/-/stylelint-config-3.0.2.tgz",
- "integrity": "sha512-cYDZTNlVsCQxFfTURHD0y5BAm2gmVl7J8qN2Q5xQPtj7Cn/u8lXnB+8u8/sdTSuqne52UDeDK/FtdtyP395geA==",
- "dev": true,
- "dependencies": {
- "stylelint-config-css-modules": "^2.2.0",
- "stylelint-config-standard": "^23.0.0",
- "stylelint-order": "^5.0.0"
- },
- "peerDependencies": {
- "stylelint": ">=14.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
- "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/bonjour": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
- "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect-history-api-fallback": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
- "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
- "dependencies": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.21.2",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.2.tgz",
- "integrity": "sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
- "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
- },
- "node_modules/@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "node_modules/@types/http-proxy": {
- "version": "1.17.7",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz",
- "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.9",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
- "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
- },
- "node_modules/@types/lodash": {
- "version": "4.14.177",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz",
- "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==",
- "dev": true
- },
- "node_modules/@types/mdast": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
- "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
- },
- "node_modules/@types/minimist": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
- "dev": true
- },
- "node_modules/@types/node": {
- "version": "16.11.10",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz",
- "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA=="
- },
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
- "dev": true
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.4",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
- "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
- },
- "node_modules/@types/q": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
- "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
- "dev": true
- },
- "node_modules/@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
- },
- "node_modules/@types/react": {
- "version": "17.0.37",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz",
- "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==",
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "17.0.11",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
- "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/retry": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
- "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g=="
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
- },
- "node_modules/@types/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/sockjs": {
- "version": "0.3.33",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
- "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/unist": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
- "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
- },
- "node_modules/@types/ws": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
- "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@ungap/url-search-params": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.2.tgz",
- "integrity": "sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw=="
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/helper-wasm-section": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-opt": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "@webassemblyjs/wast-printer": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webpack-cli/configtest": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz",
- "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==",
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x",
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/info": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz",
- "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==",
- "dependencies": {
- "envinfo": "^7.7.3"
- },
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- }
- },
- "node_modules/@webpack-cli/serve": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz",
- "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==",
- "peerDependencies": {
- "webpack-cli": "4.x.x"
- },
- "peerDependenciesMeta": {
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-assertions": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
- "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "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"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/ajv-formats/node_modules/ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/angular": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
- "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==",
- "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward."
- },
- "node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "engines": [
- "node >= 0.8.0"
- ],
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "node_modules/array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "dependencies": {
- "lodash": "^4.17.14"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz",
- "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==",
- "dependencies": {
- "browserslist": "^4.17.5",
- "caniuse-lite": "^1.0.30001272",
- "fraction.js": "^4.1.1",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.1.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/babel-loader": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
- "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
- "dependencies": {
- "find-cache-dir": "^3.3.1",
- "loader-utils": "^1.4.0",
- "make-dir": "^3.1.0",
- "schema-utils": "^2.6.5"
- },
- "engines": {
- "node": ">= 8.9"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0",
- "webpack": ">=2"
- }
- },
- "node_modules/babel-plugin-angularjs-annotate": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz",
- "integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "@babel/types": "^7.2.0",
- "simple-is": "~0.2.0"
- }
- },
- "node_modules/babel-plugin-dynamic-import-node": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
- "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
- "dependencies": {
- "object.assign": "^4.1.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz",
- "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==",
- "dependencies": {
- "@babel/compat-data": "^7.13.11",
- "@babel/helper-define-polyfill-provider": "^0.3.0",
- "semver": "^6.1.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
- "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.3.0",
- "core-js-compat": "^3.18.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz",
- "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.3.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-react-svg": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-react-svg/-/babel-plugin-react-svg-3.0.3.tgz",
- "integrity": "sha512-Pst1RWjUIiV0Ykv1ODSeceCBsFOP2Y4dusjq7/XkjuzJdvS9CjpkPMUIoO4MLlvp5PiLCeMlsOC7faEUA0gm3Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "peerDependencies": {
- "@babel/plugin-syntax-jsx": "^7.2.0"
- }
- },
- "node_modules/babel-plugin-transform-define": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.1.tgz",
- "integrity": "sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw==",
- "dependencies": {
- "lodash": "^4.17.11",
- "traverse": "0.6.6"
- },
- "engines": {
- "node": ">= 8.x.x"
- }
- },
- "node_modules/bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "node_modules/batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
- },
- "node_modules/batch-processor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz",
- "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg="
- },
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "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.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/body-parser/node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/bonjour": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
- "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
- "dependencies": {
- "array-flatten": "^2.1.0",
- "deep-equal": "^1.0.1",
- "dns-equal": "^1.0.0",
- "dns-txt": "^2.0.2",
- "multicast-dns": "^6.0.1",
- "multicast-dns-service-types": "^1.1.0"
- }
- },
- "node_modules/bonjour/node_modules/deep-equal": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
- "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
- "dependencies": {
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.1",
- "is-regex": "^1.0.4",
- "object-is": "^1.0.1",
- "object-keys": "^1.1.1",
- "regexp.prototype.flags": "^1.2.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz",
- "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==",
- "dependencies": {
- "caniuse-lite": "^1.0.30001280",
- "electron-to-chromium": "^1.3.896",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "node_modules/buffer-indexof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
- "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
- },
- "node_modules/bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dependencies": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "dependencies": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001283",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
- "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- }
- },
- "node_modules/capital-case": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
- "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case-first": "^2.0.2"
- }
- },
- "node_modules/ccount": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
- "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/change-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
- "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
- "dependencies": {
- "camel-case": "^4.1.2",
- "capital-case": "^1.0.4",
- "constant-case": "^3.0.4",
- "dot-case": "^3.0.4",
- "header-case": "^2.0.4",
- "no-case": "^3.0.4",
- "param-case": "^3.0.4",
- "pascal-case": "^3.1.2",
- "path-case": "^3.0.4",
- "sentence-case": "^3.0.4",
- "snake-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "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"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/classnames": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
- "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
- },
- "node_modules/clean-css": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz",
- "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==",
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "engines": {
- "node": ">= 10.0"
- }
- },
- "node_modules/clean-css/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-deep/node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/clone-regexp": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
- "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
- "dev": true,
- "dependencies": {
- "is-regexp": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clsx": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
- "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "dev": true,
- "dependencies": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "node_modules/colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
- },
- "node_modules/combokeys": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/combokeys/-/combokeys-3.0.1.tgz",
- "integrity": "sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw=="
- },
- "node_modules/commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
- },
- "node_modules/compile-code-loader": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/compile-code-loader/-/compile-code-loader-1.0.0.tgz",
- "integrity": "sha512-MFE1K+xC3f28urqFQ/7LGAzl/MZXzrFz5n3Tp83n6DwiucAVPkbB+z18D7Z0BqvmcuFiYy6hgm9sGrF/mbyZUw==",
- "dependencies": {
- "loader-utils": "^2.0.0"
- }
- },
- "node_modules/compile-code-loader/node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dependencies": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/compression/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/compression/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "node_modules/conic-gradient": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/conic-gradient/-/conic-gradient-1.0.0.tgz",
- "integrity": "sha512-TEmM3Ondx8nid2AN0Rsw6eQG7PgTUkL6gs90UqX1cNqO/bpt/H/Rw6DwbzoylQ9SSxqLG1SsteAr9/yBsAzdtw==",
- "dependencies": {
- "prefixfree": "^1.0.0"
- }
- },
- "node_modules/connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/consolidated-events": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz",
- "integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ=="
- },
- "node_modules/constant-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
- "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case": "^2.0.2"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-disposition/node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "node_modules/core-js": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.1.tgz",
- "integrity": "sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==",
- "hasInstallScript": true,
- "peer": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-js-compat": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz",
- "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==",
- "dependencies": {
- "browserslist": "^4.17.6",
- "semver": "7.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-js-compat/node_modules/semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
- },
- "node_modules/cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-blank-pseudo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-2.0.0.tgz",
- "integrity": "sha512-n7fxEOyuvAVPLPb9kL4XTIK/gnp2fKQ7KFQ+9lj60W9pDn/jTr5LjS/kHHm+rES/YJ3m0S6+uJgYSuAJg9zOyA==",
- "bin": {
- "css-blank-pseudo": "cli.js"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/css-has-pseudo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-2.0.0.tgz",
- "integrity": "sha512-URYSGI0ggED1W1/xOAH0Zn1bf+YL6tYh1PQzAPlWddEAyyO37mPqMbwCzSjTTNmeCR8BMNXSFLaT5xb6MERdAA==",
- "dependencies": {
- "postcss-selector-parser": "^6"
- },
- "bin": {
- "css-has-pseudo": "cli.js"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": ">=8.3"
- }
- },
- "node_modules/css-loader": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz",
- "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==",
- "dependencies": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.2.15",
- "postcss-modules-extract-imports": "^3.0.0",
- "postcss-modules-local-by-default": "^4.0.0",
- "postcss-modules-scope": "^3.0.0",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.1.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/css-loader/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/css-prefers-color-scheme": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-5.0.0.tgz",
- "integrity": "sha512-XpzVrdwbppHm+Nnrzcb/hQb8eq1aKv4U8Oh59LsLfTsbIZZ6Fvn9razb66ihH2aTJ0VhO9n9sVm8piyKXJAZMA==",
- "bin": {
- "css-prefers-color-scheme": "cli.js"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "dev": true,
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "node_modules/css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "dev": true
- },
- "node_modules/css-select/node_modules/dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "dev": true,
- "dependencies": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- }
- },
- "node_modules/css-select/node_modules/domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "node_modules/css-select/node_modules/domutils/node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "node_modules/css-select/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true,
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/css-tree/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/cssdb": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.0.0.tgz",
- "integrity": "sha512-Q7982SynYCtcLUBCPgUPFy2TZmDiFyimpdln8K2v4w2c07W4rXL7q5F1ksVAqOAQfxKyyUGCKSsioezKT5bU1Q=="
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/csso": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
- "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
- "dev": true,
- "dependencies": {
- "css-tree": "^1.1.2"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
- "dev": true
- },
- "node_modules/csso/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/csstype": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
- "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
- },
- "node_modules/date-fns": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.26.0.tgz",
- "integrity": "sha512-VQI812dRi3cusdY/fhoBKvc6l2W8BPWU1FNVnFH9Nttjx4AFBRzfSVb/Eyc7jBT6e9sg1XtAGsYpBQ6c/jygbg==",
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
- "node_modules/debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "dev": true,
- "dependencies": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys/node_modules/map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/deep-equal": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
- "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "es-get-iterator": "^1.1.1",
- "get-intrinsic": "^1.0.1",
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.2",
- "is-regex": "^1.1.1",
- "isarray": "^2.0.5",
- "object-is": "^1.1.4",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "regexp.prototype.flags": "^1.3.0",
- "side-channel": "^1.0.3",
- "which-boxed-primitive": "^1.0.1",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
- },
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dependencies": {
- "object-keys": "^1.0.12"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/del": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
- "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
- "dependencies": {
- "globby": "^11.0.1",
- "graceful-fs": "^4.2.4",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.2",
- "p-map": "^4.0.0",
- "rimraf": "^3.0.2",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
- },
- "node_modules/dns-packet": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
- "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
- "dependencies": {
- "ip": "^1.1.0",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/dns-txt": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
- "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
- "dependencies": {
- "buffer-indexof": "^1.0.0"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/dom-serializer": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
- "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/dom-serializer/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/domelementtype": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
- "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ]
- },
- "node_modules/domhandler": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz",
- "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==",
- "dependencies": {
- "domelementtype": "^2.2.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "dependencies": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz",
- "integrity": "sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg=="
- },
- "node_modules/element-resize-detector": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.3.tgz",
- "integrity": "sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ==",
- "dependencies": {
- "batch-processor": "1.0.0"
- }
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
- "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
- "object-assign": "^4.0.1",
- "tapable": "^0.2.7"
- },
- "engines": {
- "node": ">=4.3.0 <5.0.0 || >=5.10"
- }
- },
- "node_modules/enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dependencies": {
- "ansi-colors": "^4.1.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/entities": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
- "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/errno": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
- "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
- "dependencies": {
- "prr": "~1.0.1"
- },
- "bin": {
- "errno": "cli.js"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
- "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.1.1",
- "get-symbol-description": "^1.0.0",
- "has": "^1.0.3",
- "has-symbols": "^1.0.2",
- "internal-slot": "^1.0.3",
- "is-callable": "^1.2.4",
- "is-negative-zero": "^2.0.1",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.1",
- "is-string": "^1.0.7",
- "is-weakref": "^1.0.1",
- "object-inspect": "^1.11.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "string.prototype.trimend": "^1.0.4",
- "string.prototype.trimstart": "^1.0.4",
- "unbox-primitive": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-get-iterator": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
- "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.0",
- "has-symbols": "^1.0.1",
- "is-arguments": "^1.1.0",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.5",
- "isarray": "^2.0.5"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="
- },
- "node_modules/es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
- },
- "node_modules/es6-promisify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
- "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
- "dependencies": {
- "es6-promise": "^4.0.3"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/eslint": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
- "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
- "dependencies": {
- "@eslint/eslintrc": "^1.0.4",
- "@humanwhocodes/config-array": "^0.6.0",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.1.0",
- "eslint-utils": "^3.0.0",
- "eslint-visitor-keys": "^3.1.0",
- "espree": "^9.1.0",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^6.0.1",
- "globals": "^13.6.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.2.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz",
- "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dependencies": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=5"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/eslint-scope": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
- "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
- "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/eslint/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/eslint/node_modules/globals": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
- "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/espree": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
- "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
- "dependencies": {
- "acorn": "^8.6.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^3.1.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/espree/node_modules/eslint-visitor-keys": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
- "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esquery/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/execall": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
- "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
- "dev": true,
- "dependencies": {
- "clone-regexp": "^2.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express/node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/express/node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/express/node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/express/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "node_modules/fast-glob": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
- "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "node_modules/fastdom": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/fastdom/-/fastdom-1.0.10.tgz",
- "integrity": "sha512-sbL4h358IlZn8VsTvA5TYnKVLYif46XhPEll+HTSxVtDSpqZEO/17D/QqlxE9V2K7AQ82GXeYeQLU2HWwKgk1A==",
- "dependencies": {
- "strictdom": "^1.0.1"
- }
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
- "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow=="
- },
- "node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dependencies": {
- "websocket-driver": ">=0.5.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/file-loader": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
- "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/file-loader/node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/file-loader/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/finalhandler/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dependencies": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
- "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw=="
- },
- "node_modules/flatten": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
- "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==",
- "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash."
- },
- "node_modules/focus-trap": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.7.1.tgz",
- "integrity": "sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg==",
- "dependencies": {
- "tabbable": "^5.2.1"
- }
- },
- "node_modules/focus-visible": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz",
- "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ=="
- },
- "node_modules/follow-redirects": {
- "version": "1.14.8",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
- "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz",
- "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://www.patreon.com/infusion"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q=="
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-stdin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
- "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "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"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
- },
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globby": {
- "version": "11.0.4",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
- "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globby/node_modules/ignore": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
- "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
- "dev": true
- },
- "node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
- },
- "node_modules/hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
- "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/header-case": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
- "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
- "dependencies": {
- "capital-case": "^1.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/highlight.js": {
- "version": "10.7.3",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
- "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
- "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "node_modules/html-entities": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
- "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ=="
- },
- "node_modules/html-loader": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.0.1.tgz",
- "integrity": "sha512-90Sxg9FhTkQEzmmHT2KOAQniTZgC72aifcfR0fZsuo1PJz0K4EXiTwxejTUombF8XShLj5RaZKYsUJhxR6G2dA==",
- "dependencies": {
- "html-minifier-terser": "^6.0.2",
- "parse5": "^6.0.1"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
- "dependencies": {
- "camel-case": "^4.1.2",
- "clean-css": "^5.2.2",
- "commander": "^8.3.0",
- "he": "^1.2.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.10.0"
- },
- "bin": {
- "html-minifier-terser": "cli.js"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/html-tags": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
- "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/html-to-react": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.7.tgz",
- "integrity": "sha512-adtKiee5AtnuUhdB8bxbASRP2bW/A0OrlwysEuqZxXdURb0/1XR0m/woE1V5cJA1U5nyzAvk/PdFNO9S73DE/g==",
- "dependencies": {
- "domhandler": "^4.0",
- "htmlparser2": "^7.0",
- "lodash.camelcase": "^4.3.0",
- "ramda": "^0.27.1"
- },
- "peerDependencies": {
- "react": "^16.0 || ^17.0"
- }
- },
- "node_modules/htmlparser2": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
- "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.2",
- "domutils": "^2.8.0",
- "entities": "^3.0.1"
- }
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-errors/node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-errors/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-parser-js": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
- "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA=="
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/http-proxy-middleware": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz",
- "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==",
- "dependencies": {
- "@types/http-proxy": "^1.17.5",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/icss-utils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/import-local": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
- "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "node_modules/internal-slot": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
- "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
- "dependencies": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/interpolate-loader": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/interpolate-loader/-/interpolate-loader-2.0.1.tgz",
- "integrity": "sha512-X5/cKHUnAS5gV/oK9Z6pEjg2xVH5EGgnC5QmaOPwK/o7qMOMyyafwFL1mtH3yAK+COCjyaH56MOs9G8uXG12yA==",
- "dependencies": {
- "escape-string-regexp": "^2.0.0",
- "loader-utils": "^1.1.0"
- },
- "peerDependencies": {
- "webpack": ">=3.0.0"
- }
- },
- "node_modules/interpolate-loader/node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
- },
- "node_modules/ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "dependencies": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-buffer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
- "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
- "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
- "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-regexp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
- "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
- "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
- "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "node_modules/is-url-superb": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz",
- "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
- "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
- "dependencies": {
- "call-bind": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakset": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
- "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "27.3.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz",
- "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/jest-worker/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/just-debounce-it": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.0.1.tgz",
- "integrity": "sha512-6EQWOpRV8fm/ame6XvGBSxvsjoMbqj7JS9TV/4Q9aOXt9DQw22GBfTGP6gTAqcBNN/PbzlwtwH7jtM0k9oe9pg=="
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/klona": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
- "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/known-css-properties": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.23.0.tgz",
- "integrity": "sha512-h9ivI88e1lFNmTT4HovBN33Ysn0OIJG7IPG2mkpx2uniQXFWqo35QdiX7w0TovlUFXfW8aPFblP5/q0jlOr2sA==",
- "dev": true
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "node_modules/loader-runner": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
- "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/loader-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
- "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/loader-utils/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
- },
- "node_modules/lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
- "dev": true
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
- "dev": true
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "node_modules/lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
- "dev": true
- },
- "node_modules/longest-streak": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
- "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/markdown-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "dependencies": {
- "repeat-string": "^1.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true,
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mdast-add-list-metadata": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz",
- "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==",
- "dependencies": {
- "unist-util-visit-parents": "1.1.2"
- }
- },
- "node_modules/mdast-util-find-and-replace": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
- "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
- "dependencies": {
- "escape-string-regexp": "^4.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-from-markdown": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
- "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "mdast-util-to-string": "^2.0.0",
- "micromark": "~2.11.0",
- "parse-entities": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
- "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
- "dependencies": {
- "mdast-util-gfm-autolink-literal": "^0.1.0",
- "mdast-util-gfm-strikethrough": "^0.2.0",
- "mdast-util-gfm-table": "^0.1.0",
- "mdast-util-gfm-task-list-item": "^0.1.0",
- "mdast-util-to-markdown": "^0.6.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
- "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
- "dependencies": {
- "ccount": "^1.0.0",
- "mdast-util-find-and-replace": "^1.1.0",
- "micromark": "^2.11.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-strikethrough": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
- "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
- "dependencies": {
- "mdast-util-to-markdown": "^0.6.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-table": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
- "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
- "dependencies": {
- "markdown-table": "^2.0.0",
- "mdast-util-to-markdown": "~0.6.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-task-list-item": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
- "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
- "dependencies": {
- "mdast-util-to-markdown": "~0.6.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-markdown": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
- "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "longest-streak": "^2.0.0",
- "mdast-util-to-string": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.0.0",
- "zwitch": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
- "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "dev": true
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
- "dependencies": {
- "fs-monkey": "1.0.3"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/memoize-one": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
- "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
- },
- "node_modules/memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "dependencies": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
- "node_modules/meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
- "dev": true,
- "dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromark": {
- "version": "2.11.4",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
- "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "debug": "^4.0.0",
- "parse-entities": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
- "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
- "dependencies": {
- "micromark": "~2.11.0",
- "micromark-extension-gfm-autolink-literal": "~0.5.0",
- "micromark-extension-gfm-strikethrough": "~0.6.5",
- "micromark-extension-gfm-table": "~0.4.0",
- "micromark-extension-gfm-tagfilter": "~0.3.0",
- "micromark-extension-gfm-task-list-item": "~0.3.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
- "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
- "dependencies": {
- "micromark": "~2.11.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-strikethrough": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
- "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
- "dependencies": {
- "micromark": "~2.11.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-table": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
- "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
- "dependencies": {
- "micromark": "~2.11.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-tagfilter": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
- "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
- "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
- "dependencies": {
- "micromark": "~2.11.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dependencies": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "dependencies": {
- "mime-db": "1.51.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mini-css-extract-plugin": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz",
- "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==",
- "dev": true,
- "dependencies": {
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/mini-css-extract-plugin/node_modules/ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
- },
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dependencies": {
- "minimist": "^1.2.5"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/multicast-dns": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
- "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
- "dependencies": {
- "dns-packet": "^1.3.1",
- "thunky": "^1.0.2"
- },
- "bin": {
- "multicast-dns": "cli.js"
- }
- },
- "node_modules/multicast-dns-service-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
- "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
- },
- "node_modules/nanoid": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
- "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
- },
- "node_modules/no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/node-forge": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
- "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==",
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
- "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
- },
- "node_modules/normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/normalize-package-data/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-selector": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
- "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
- "dev": true
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "dev": true,
- "dependencies": {
- "boolbase": "~1.0.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
- "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-is": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
- "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.getownpropertydescriptors": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
- "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
- "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
- "dependencies": {
- "@types/retry": "^0.12.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
- "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
- "dependencies": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parse5": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/path-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
- "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- },
- "node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/portfinder": {
- "version": "1.0.28",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
- "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
- "dependencies": {
- "async": "^2.6.2",
- "debug": "^3.1.1",
- "mkdirp": "^0.5.5"
- },
- "engines": {
- "node": ">= 0.12.0"
- }
- },
- "node_modules/portfinder/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.4",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz",
- "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==",
- "dependencies": {
- "nanoid": "^3.1.30",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- }
- },
- "node_modules/postcss-attribute-case-insensitive": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz",
- "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.2"
- },
- "peerDependencies": {
- "postcss": "^8.0.2"
- }
- },
- "node_modules/postcss-calc": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz",
- "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.0.2"
- },
- "peerDependencies": {
- "postcss": "^8.2.2"
- }
- },
- "node_modules/postcss-color-functional-notation": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.0.1.tgz",
- "integrity": "sha512-qxD/7Q2rdmqJLSYxlJFJM9gVdyVLTBVrOUc+B6+KbOe4t2G2KnoI3HdimdK4PerGLqAqKnEVGgal7YKImm0g+w==",
- "dependencies": {
- "postcss-values-parser": "6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-color-functional-notation/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-color-functional-notation/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-color-hex-alpha": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.0.tgz",
- "integrity": "sha512-Z0xiE0j+hbefUj0LWOMkzmTIS7k+dqJKzLwoKww0KJhju/sWXr+84Yk7rmvFoML/4LjGpJgefZvDwExrsWfHZw==",
- "dependencies": {
- "postcss-values-parser": "^6.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.3.7"
- }
- },
- "node_modules/postcss-color-hex-alpha/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-color-hex-alpha/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-color-rebeccapurple": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.0.tgz",
- "integrity": "sha512-+Ogw3SA0ESjjO87S8Dn+aAEHK6hFAWAVbTVnyXnmbV6Xh0TKi0vXpzhlKG/yrxujxtlgQcMQNQjg75uWWv28xA==",
- "dependencies": {
- "postcss-values-parser": "^6"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-color-rebeccapurple/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-color-rebeccapurple/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-custom-media": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz",
- "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-custom-properties": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.0.0.tgz",
- "integrity": "sha512-eAyX3rMjZKxdne6tWKjkWbNWfw6bbv4xTsrjNJ7C3uGDODrzbQXR+ueshRkw7Lhlhc3qyTmYH/sFfD0AbhgdSQ==",
- "dependencies": {
- "postcss-values-parser": "^6"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-custom-properties/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-custom-properties/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-custom-selectors": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz",
- "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.4"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.1.2"
- }
- },
- "node_modules/postcss-dir-pseudo-class": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz",
- "integrity": "sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA==",
- "dependencies": {
- "postcss-selector-parser": "6.0.6"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-double-position-gradients": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.1.tgz",
- "integrity": "sha512-L18N4Y1gpKQPEnZ6JOxO3H5gswZzTNR+ZqruZG7cOtOF/GR6J1YBRKn5hdTn3Vs4Y9XuDqaBD8vIXFIEft9Jqw==",
- "dependencies": {
- "postcss-values-parser": "6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-double-position-gradients/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-double-position-gradients/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-env-function": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.2.tgz",
- "integrity": "sha512-VXKv0Vskq7olS3Q2zj38G4au4PkW+YWBRgng2Czx0pP9PyqU6uzjS6uVU1VkJN8i0OTPM7g82YFUdiz/7pEvpg==",
- "dependencies": {
- "postcss-values-parser": "6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-env-function/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-env-function/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-flexbugs-fixes": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
- "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
- "peerDependencies": {
- "postcss": "^8.1.4"
- }
- },
- "node_modules/postcss-focus-visible": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.1.tgz",
- "integrity": "sha512-UddLlBmJ78Nu7OrKME70EKxCPBdxTx7pKIyD3GDNRM8Tnq19zmscT9QzsvR8gygz0i0nNUjMtSz4N3AEWZ5R/Q==",
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-focus-within": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz",
- "integrity": "sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg==",
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-font-family-system-ui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-family-system-ui/-/postcss-font-family-system-ui-5.0.0.tgz",
- "integrity": "sha512-3ndzyyMPhSbZekEPTuvKZz17jQXftAGMcVxNV4rTKNXsOsl23ZKlHcccEPB9tpB/SmGtDszdPvajdJrjZeKBfQ==",
- "dependencies": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.30000655"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-font-variant": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
- "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-gap-properties": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.0.tgz",
- "integrity": "sha512-QJOkz1epC/iCuOdhQPm3n9T+F25+P+MYJEEcs5xz/Q+020mc9c6ZRGJkzPJd8FS9hFmT9eEKFEx9PEDl+lH5og==",
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-image-set-function": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.2.tgz",
- "integrity": "sha512-NbTOc3xOq/YjIJS8/UVnhI16NxRuCiEWjem0eYt87sKvjdpk00niQ9oVo3eSR+kmMKWIO979x3j5i1GYJNxe1A==",
- "dependencies": {
- "postcss-values-parser": "6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-image-set-function/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-image-set-function/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-import": {
- "version": "14.0.2",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz",
- "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==",
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-initial": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
- "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-lab-function": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.1.tgz",
- "integrity": "sha512-8F2keZUlUiX/tznbCZ5y3Bmx6pnc19kvL4oq+x+uoK0ZYQjUWmHDdVHBG6iMq2T0Fteu+AgGAo94UcIsL4ay2w==",
- "dependencies": {
- "@csstools/convert-colors": "2.0.0",
- "postcss-values-parser": "6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-lab-function/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-lab-function/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-loader": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
- "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
- "dependencies": {
- "cosmiconfig": "^7.0.0",
- "klona": "^2.0.5",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "postcss": "^7.0.0 || ^8.0.1",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/postcss-loader/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/postcss-logical": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.0.tgz",
- "integrity": "sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA==",
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-media-minmax": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
- "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
- "dev": true
- },
- "node_modules/postcss-modules-extract-imports": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-local-by-default": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
- "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
- "dependencies": {
- "icss-utils": "^5.0.0",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.1.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-scope": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
- "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.4"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-values": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
- "dependencies": {
- "icss-utils": "^5.0.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-values-replace": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values-replace/-/postcss-modules-values-replace-3.4.0.tgz",
- "integrity": "sha512-pY8iCSKxdt25uE+N4dO1PUUDOl8FIuvtZfT5964TuFJVhq+CEG8uqDpOCpCnqda/3K9ZFCNo4prn84H9SgP4Rw==",
- "dependencies": {
- "enhanced-resolve": "^3.1.0",
- "es6-promisify": "^5.0.0",
- "icss-utils": "^4.0.0",
- "loader-utils": "^2.0.0",
- "postcss": "^7.0.0",
- "postcss-values-parser": "^1.3.1"
- }
- },
- "node_modules/postcss-modules-values-replace/node_modules/icss-utils": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
- "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
- "dependencies": {
- "postcss": "^7.0.14"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/postcss-modules-values-replace/node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/postcss-modules-values-replace/node_modules/picocolors": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
- "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
- },
- "node_modules/postcss-modules-values-replace/node_modules/postcss": {
- "version": "7.0.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
- "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
- "dependencies": {
- "picocolors": "^0.2.1",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- }
- },
- "node_modules/postcss-modules-values-replace/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postcss-nesting": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.0.2.tgz",
- "integrity": "sha512-FdecapAKIe+kp6uLNW7icw1g1B2HRhAAfsNv/TPzopeM08gpUbnBpqKSVqxrCqLDwzQG854ZJn5I0BiJ35WvmA==",
- "dependencies": {
- "postcss-selector-parser": "6.0.6"
- },
- "engines": {
- "node": ">= 12"
- },
- "peerDependencies": {
- "postcss": "^8.2"
- }
- },
- "node_modules/postcss-overflow-shorthand": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.0.tgz",
- "integrity": "sha512-4fTapLT68wUoIr4m3Z0sKn1NbXX0lJYvj4aDA2++KpNx8wMSVf55UuLPz0nSjXa7dV1p0xQHlJ0iFJRNrSY2mw==",
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-page-break": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
- "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
- "peerDependencies": {
- "postcss": "^8"
- }
- },
- "node_modules/postcss-place": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.1.tgz",
- "integrity": "sha512-X+vHHzqZjI4JbSoj3uYpL6rGRUHE1O9F8g+jBFn5U94U0t6GjJuL/xSN7tU6Pnm9tpfXioHfxwt9E8+JrCB9OQ==",
- "dependencies": {
- "postcss-values-parser": "6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-place/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/postcss-place/node_modules/postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "dependencies": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "postcss": "^8.2.9"
- }
- },
- "node_modules/postcss-preset-env": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.0.1.tgz",
- "integrity": "sha512-oB7IJGwLBEwnao823mS2b9hqbp5Brm0EZKWRVROayjGwyPQVjY9gZpPZk/ItFakdx7GAPgv3ya+9R3KrUqCwYA==",
- "dependencies": {
- "autoprefixer": "^10.4.0",
- "browserslist": "^4.17.5",
- "caniuse-lite": "^1.0.30001272",
- "css-blank-pseudo": "^2.0.0",
- "css-has-pseudo": "^2.0.0",
- "css-prefers-color-scheme": "^5.0.0",
- "cssdb": "^5.0.0",
- "postcss": "^8.3",
- "postcss-attribute-case-insensitive": "^5.0.0",
- "postcss-color-functional-notation": "^4.0.1",
- "postcss-color-hex-alpha": "^8.0.0",
- "postcss-color-rebeccapurple": "^7.0.0",
- "postcss-custom-media": "^8.0.0",
- "postcss-custom-properties": "^12.0.0",
- "postcss-custom-selectors": "^6.0.0",
- "postcss-dir-pseudo-class": "^6.0.0",
- "postcss-double-position-gradients": "^3.0.1",
- "postcss-env-function": "^4.0.2",
- "postcss-focus-visible": "^6.0.1",
- "postcss-focus-within": "^5.0.1",
- "postcss-font-variant": "^5.0.0",
- "postcss-gap-properties": "^3.0.0",
- "postcss-image-set-function": "^4.0.2",
- "postcss-initial": "^4.0.1",
- "postcss-lab-function": "^4.0.1",
- "postcss-logical": "^5.0.0",
- "postcss-media-minmax": "^5.0.0",
- "postcss-nesting": "^10.0.2",
- "postcss-overflow-shorthand": "^3.0.0",
- "postcss-page-break": "^3.0.4",
- "postcss-place": "^7.0.1",
- "postcss-pseudo-class-any-link": "^7.0.0",
- "postcss-replace-overflow-wrap": "^4.0.0",
- "postcss-selector-not": "^5.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-pseudo-class-any-link": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.0.tgz",
- "integrity": "sha512-Q4KjHlyBo91nvW+wTDZHGYcjtlSSkYwxweMuq1g8+dx1S8qAnedItvHLnbdAAdqJCZP1is5dLqiI8TvfJ+cjVQ==",
- "dependencies": {
- "postcss-selector-parser": "^6"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3"
- }
- },
- "node_modules/postcss-replace-overflow-wrap": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
- "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
- "peerDependencies": {
- "postcss": "^8.0.3"
- }
- },
- "node_modules/postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
- "dev": true
- },
- "node_modules/postcss-safe-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
- "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
- "dev": true,
- "engines": {
- "node": ">=12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.3.3"
- }
- },
- "node_modules/postcss-selector-not": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz",
- "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==",
- "dependencies": {
- "balanced-match": "^1.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
- "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-sorting": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-7.0.1.tgz",
- "integrity": "sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==",
- "dev": true,
- "peerDependencies": {
- "postcss": "^8.3.9"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
- "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
- },
- "node_modules/postcss-values-parser": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz",
- "integrity": "sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ==",
- "dependencies": {
- "flatten": "^1.0.2",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/prefixfree": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prefixfree/-/prefixfree-1.0.0.tgz",
- "integrity": "sha1-grDtu6wQfyo+LcVp1sPfQDXNeRA="
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.8.1"
- }
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-addr/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
- },
- "node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
- "dev": true,
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/quote-unquote": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz",
- "integrity": "sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs="
- },
- "node_modules/ramda": {
- "version": "0.27.1",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
- "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw=="
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/raw-body/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/react": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "scheduler": "^0.20.2"
- },
- "peerDependencies": {
- "react": "17.0.2"
- }
- },
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/react-lifecycles-compat": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
- },
- "node_modules/react-markdown": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-5.0.3.tgz",
- "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==",
- "dependencies": {
- "@types/mdast": "^3.0.3",
- "@types/unist": "^2.0.3",
- "html-to-react": "^1.3.4",
- "mdast-add-list-metadata": "1.0.1",
- "prop-types": "^15.7.2",
- "react-is": "^16.8.6",
- "remark-parse": "^9.0.0",
- "unified": "^9.0.0",
- "unist-util-visit": "^2.0.0",
- "xtend": "^4.0.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- },
- "peerDependencies": {
- "@types/react": ">=16",
- "react": ">=16"
- }
- },
- "node_modules/react-movable": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/react-movable/-/react-movable-3.0.2.tgz",
- "integrity": "sha512-dDDYm3CRnDy8YLXMyyaR2MbcQiTwhPOP+dfl3fZukiI6mN1flVatcjSozT7HXjVk2yHwBC67ZOWGVAmjY6F/dA==",
- "peerDependencies": {
- "react": ">=16.3",
- "react-dom": ">=16.3"
- }
- },
- "node_modules/react-svg-core": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/react-svg-core/-/react-svg-core-3.0.3.tgz",
- "integrity": "sha512-Ws3eM3xCAwcaYeqm4Ajcz3zxBYNI6BeTWWhFR0cpOT+pWuVtozgHYK9xUM0S/ilapZgYMQDe49XgOxpvooFq4w==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.4.5",
- "@babel/plugin-syntax-jsx": "^7.2.0",
- "@babel/preset-react": "^7.0.0",
- "babel-plugin-react-svg": "^3.0.3",
- "lodash.clonedeep": "^4.5.0",
- "lodash.isplainobject": "^4.0.6",
- "svgo": "^1.2.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-svg-loader": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/react-svg-loader/-/react-svg-loader-3.0.3.tgz",
- "integrity": "sha512-V1KnIUtvWVvc4xCig34n+f+/74ylMMugB2FbuAF/yq+QRi+WLi2hUYp9Ze3VylhA1D7ZgRygBh3Ojj8S3TPhJA==",
- "dev": true,
- "dependencies": {
- "loader-utils": "^1.2.3",
- "react-svg-core": "^3.0.3"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-waypoint": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.1.0.tgz",
- "integrity": "sha512-wiVF0lTslVm27xHbnvUUADUrcDjrQxAp9lEYGExvcoEBScYbXu3Kt++pLrfj6CqOeeRAL4HcX8aANVLSn6bK0Q==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "consolidated-events": "^1.1.0 || ^2.0.0",
- "prop-types": "^15.0.0",
- "react-is": "^17.0.1"
- },
- "peerDependencies": {
- "react": "^15.3.0 || ^16.0.0 || ^17.0.0"
- }
- },
- "node_modules/react-waypoint/node_modules/react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/readable-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "dependencies": {
- "resolve": "^1.9.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
- },
- "node_modules/regenerate-unicode-properties": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
- "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
- "dependencies": {
- "regenerate": "^1.4.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
- },
- "node_modules/regenerator-transform": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
- "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
- "dependencies": {
- "@babel/runtime": "^7.8.4"
- }
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
- "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- }
- },
- "node_modules/regexpu-core": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
- "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
- "dependencies": {
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^9.0.0",
- "regjsgen": "^0.5.2",
- "regjsparser": "^0.7.0",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regjsgen": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
- "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
- },
- "node_modules/regjsparser": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
- "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
- "dependencies": {
- "jsesc": "~0.5.0"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "bin": {
- "jsesc": "bin/jsesc"
- }
- },
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/remark-breaks": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.2.tgz",
- "integrity": "sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw==",
- "dependencies": {
- "@types/mdast": "^3.0.0",
- "unified": "^10.0.0",
- "unist-util-visit": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/remark-breaks/node_modules/is-plain-obj": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz",
- "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/remark-breaks/node_modules/trough": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz",
- "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/remark-breaks/node_modules/unified": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz",
- "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "bail": "^2.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^4.0.0",
- "trough": "^2.0.0",
- "vfile": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/unist-util-is": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz",
- "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/unist-util-stringify-position": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz",
- "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==",
- "dependencies": {
- "@types/unist": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/unist-util-visit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz",
- "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^5.0.0",
- "unist-util-visit-parents": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/unist-util-visit-parents": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz",
- "integrity": "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/vfile": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz",
- "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "unist-util-stringify-position": "^3.0.0",
- "vfile-message": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-breaks/node_modules/vfile-message": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz",
- "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-gfm": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
- "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
- "dependencies": {
- "mdast-util-gfm": "^0.1.0",
- "micromark-extension-gfm": "^0.3.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-parse": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
- "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
- "dependencies": {
- "mdast-util-from-markdown": "^0.8.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
- },
- "node_modules/resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dependencies": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-cwd/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/sass": {
- "version": "1.43.5",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz",
- "integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==",
- "dev": true,
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/sass-loader": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.3.0.tgz",
- "integrity": "sha512-6l9qwhdOb7qSrtOu96QQ81LVl8v6Dp9j1w3akOm0aWHyrTYtagDt5+kS32N4yq4hHk3M+rdqoRMH+lIdqvW6HA==",
- "dev": true,
- "dependencies": {
- "klona": "^2.0.4",
- "neo-async": "^2.6.2"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "fibers": ">= 3.1.0",
- "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0",
- "sass": "^1.3.0",
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "fibers": {
- "optional": true
- },
- "node-sass": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
- "node_modules/scheduler": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "node_modules/schema-utils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
- "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
- "dependencies": {
- "@types/json-schema": "^7.0.5",
- "ajv": "^6.12.4",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/scrollbar-width": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/scrollbar-width/-/scrollbar-width-3.1.1.tgz",
- "integrity": "sha1-xi5j76WTTaw3tD2jT3VQysqERKI="
- },
- "node_modules/select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
- },
- "node_modules/selfsigned": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
- "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
- "dependencies": {
- "node-forge": "^1.2.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/send/node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/send/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/sentence-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
- "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case-first": "^2.0.2"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dependencies": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-index/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "node_modules/serve-index/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- },
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
- },
- "node_modules/simple-html-tokenizer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz",
- "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=",
- "dev": true
- },
- "node_modules/simple-is": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
- "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA="
- },
- "node_modules/simply-uuid": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simply-uuid/-/simply-uuid-1.0.1.tgz",
- "integrity": "sha1-U5JB2BUolpzvI4kvr0WIAF+pmrg="
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/snake-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
- "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/sniffr": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/sniffr/-/sniffr-1.2.0.tgz",
- "integrity": "sha512-k7C0ZcHBU330LcSkKyc2cOOB0uHosME8b2t9qFJqdqB1cKwGmZWd7BVwBz5mWOMJ5dggK1dy2qv+DSwteKLBzQ=="
- },
- "node_modules/sockjs": {
- "version": "0.3.21",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
- "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
- "dependencies": {
- "faye-websocket": "^0.11.3",
- "uuid": "^3.4.0",
- "websocket-driver": "^0.7.4"
- }
- },
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
- "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
- "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
- "dev": true
- },
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "node_modules/spdy-transport/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/specificity": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
- "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
- "dev": true,
- "bin": {
- "specificity": "bin/specificity"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "node_modules/stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "dev": true
- },
- "node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/strictdom": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strictdom/-/strictdom-1.0.1.tgz",
- "integrity": "sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA="
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
- "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
- "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/style-inject": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
- "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw=="
- },
- "node_modules/style-loader": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz",
- "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==",
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
- "dev": true
- },
- "node_modules/stylelint": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.1.0.tgz",
- "integrity": "sha512-IedkssuNVA11+v++2PIV2OHOU5A3SfRcXVi56vZVSsMhGrgtwmmit69jeM+08/Tun5DTBe7BuH1Zp1mMLmtKLA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^2.0.0",
- "cosmiconfig": "^7.0.1",
- "debug": "^4.3.2",
- "execall": "^2.0.0",
- "fast-glob": "^3.2.7",
- "fastest-levenshtein": "^1.0.12",
- "file-entry-cache": "^6.0.1",
- "get-stdin": "^8.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.0.4",
- "globjoin": "^0.1.4",
- "html-tags": "^3.1.0",
- "ignore": "^5.1.9",
- "import-lazy": "^4.0.0",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.23.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^9.0.0",
- "micromatch": "^4.0.4",
- "normalize-path": "^3.0.0",
- "normalize-selector": "^0.2.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.3.11",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^6.0.0",
- "postcss-selector-parser": "^6.0.6",
- "postcss-value-parser": "^4.1.0",
- "resolve-from": "^5.0.0",
- "specificity": "^0.4.1",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "style-search": "^0.1.0",
- "svg-tags": "^1.0.0",
- "table": "^6.7.3",
- "v8-compile-cache": "^2.3.0",
- "write-file-atomic": "^3.0.3"
- },
- "bin": {
- "stylelint": "bin/stylelint.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/stylelint"
- }
- },
- "node_modules/stylelint-config-css-modules": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-css-modules/-/stylelint-config-css-modules-2.3.0.tgz",
- "integrity": "sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==",
- "dev": true,
- "peerDependencies": {
- "stylelint": "11.x - 14.x"
- }
- },
- "node_modules/stylelint-config-recommended": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz",
- "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==",
- "dev": true,
- "peerDependencies": {
- "stylelint": "^14.0.0"
- }
- },
- "node_modules/stylelint-config-standard": {
- "version": "23.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-23.0.0.tgz",
- "integrity": "sha512-8PDlk+nWuc1T66nVaODTdVodN0pjuE5TBlopi39Lt9EM36YJsRhqttMyUhnS78oc/59Q6n8iw2GJB4QcoFqtRg==",
- "dev": true,
- "dependencies": {
- "stylelint-config-recommended": "^6.0.0"
- },
- "peerDependencies": {
- "stylelint": "^14.0.0"
- }
- },
- "node_modules/stylelint-order": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-5.0.0.tgz",
- "integrity": "sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==",
- "dev": true,
- "dependencies": {
- "postcss": "^8.3.11",
- "postcss-sorting": "^7.0.1"
- },
- "peerDependencies": {
- "stylelint": "^14.0.0"
- }
- },
- "node_modules/stylelint/node_modules/balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
- },
- "node_modules/stylelint/node_modules/ignore": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
- "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/stylelint/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/svg-inline-loader": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz",
- "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==",
- "dev": true,
- "dependencies": {
- "loader-utils": "^1.1.0",
- "object-assign": "^4.0.1",
- "simple-html-tokenizer": "^0.1.1"
- }
- },
- "node_modules/svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
- "dev": true
- },
- "node_modules/svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "bin": {
- "svgo": "bin/svgo"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/svgo/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/svgo/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/tabbable": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.2.1.tgz",
- "integrity": "sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ=="
- },
- "node_modules/table": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz",
- "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==",
- "dev": true,
- "dependencies": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/table/node_modules/ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/table/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/tapable": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz",
- "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/terser": {
- "version": "5.14.2",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
- "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.2.5",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz",
- "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==",
- "dependencies": {
- "jest-worker": "^27.0.6",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "node_modules/thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/traverse": {
- "version": "0.6.6",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
- "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
- },
- "node_modules/trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/trough": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
- "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/ts-loader": {
- "version": "9.2.6",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz",
- "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==",
- "dependencies": {
- "chalk": "^4.1.0",
- "enhanced-resolve": "^5.0.0",
- "micromatch": "^4.0.0",
- "semver": "^7.3.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "typescript": "*",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/ts-loader/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/ts-loader/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/ts-loader/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/ts-loader/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/ts-loader/node_modules/enhanced-resolve": {
- "version": "5.8.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz",
- "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/ts-loader/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ts-loader/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ts-loader/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ts-loader/node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
- "node_modules/typescript": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
- "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
- "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has-bigints": "^1.0.1",
- "has-symbols": "^1.0.2",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "dependencies": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
- "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unified": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
- "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
- "dependencies": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^2.0.0",
- "trough": "^1.0.0",
- "vfile": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unified/node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
- },
- "node_modules/unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-stringify-position": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
- "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
- "dependencies": {
- "@types/unist": "^2.0.2"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit-parents": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
- "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
- },
- "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
- "dev": true
- },
- "node_modules/upper-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
- "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/upper-case-first": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
- "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/url-loader": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "mime-types": "^2.1.27",
- "schema-utils": "^3.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "file-loader": "*",
- "webpack": "^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "file-loader": {
- "optional": true
- }
- }
- },
- "node_modules/url-loader/node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/url-loader/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "node_modules/util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/vfile": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
- "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0",
- "vfile-message": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-message": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
- "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dependencies": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/webpack": {
- "version": "5.76.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
- "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^0.0.51",
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/wasm-edit": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.7.6",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.10.0",
- "es-module-lexer": "^0.9.0",
- "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.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
- "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
- "dependencies": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.1.0",
- "@webpack-cli/info": "^1.4.0",
- "@webpack-cli/serve": "^1.6.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "execa": "^5.0.0",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "peerDependencies": {
- "webpack": "4.x.x || 5.x.x"
- },
- "peerDependenciesMeta": {
- "@webpack-cli/generators": {
- "optional": true
- },
- "@webpack-cli/migrate": {
- "optional": true
- },
- "webpack-bundle-analyzer": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/webpack-dev-middleware": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
- "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.2.2",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/ajv": {
- "version": "8.9.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
- "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpack-dev-server": {
- "version": "4.7.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
- "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
- "dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/serve-index": "^1.9.1",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.2.2",
- "ansi-html-community": "^0.0.8",
- "bonjour": "^3.5.0",
- "chokidar": "^3.5.2",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^1.6.0",
- "default-gateway": "^6.0.3",
- "del": "^6.0.0",
- "express": "^4.17.1",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.0",
- "ipaddr.js": "^2.0.1",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "portfinder": "^1.0.28",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.0.0",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.21",
- "spdy": "^4.0.2",
- "strip-ansi": "^7.0.0",
- "webpack-dev-middleware": "^5.3.0",
- "ws": "^8.1.0"
- },
- "bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-dev-server/node_modules/ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack-dev-server/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/webpack-dev-server/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "node_modules/webpack-dev-server/node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpack-dev-server/node_modules/strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
- "dependencies": {
- "clone-deep": "^4.0.1",
- "wildcard": "^2.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/enhanced-resolve": {
- "version": "5.12.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
- "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpack/node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dependencies": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
- "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw=="
- },
- "node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "node_modules/ws": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
- "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/zwitch": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
- "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- }
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
- "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
- "requires": {
- "@babel/highlight": "^7.16.0"
- }
- },
- "@babel/compat-data": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
- "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q=="
- },
- "@babel/core": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz",
- "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==",
- "requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helpers": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
- "semver": "^6.3.0",
- "source-map": "^0.5.0"
- }
- },
- "@babel/eslint-parser": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz",
- "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==",
- "dev": true,
- "requires": {
- "eslint-scope": "^5.1.1",
- "eslint-visitor-keys": "^2.1.0",
- "semver": "^6.3.0"
- }
- },
- "@babel/generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz",
- "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==",
- "requires": {
- "@babel/types": "^7.16.0",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
- "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz",
- "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==",
- "requires": {
- "@babel/helper-explode-assignable-expression": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
- "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
- "requires": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-validator-option": "^7.14.5",
- "browserslist": "^4.17.5",
- "semver": "^6.3.0"
- }
- },
- "@babel/helper-create-class-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz",
- "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-member-expression-to-functions": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0"
- }
- },
- "@babel/helper-create-regexp-features-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz",
- "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "regexpu-core": "^4.7.1"
- }
- },
- "@babel/helper-define-polyfill-provider": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz",
- "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==",
- "requires": {
- "@babel/helper-compilation-targets": "^7.13.0",
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/traverse": "^7.13.0",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2",
- "semver": "^6.1.2"
- }
- },
- "@babel/helper-explode-assignable-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz",
- "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
- "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
- "requires": {
- "@babel/helper-get-function-arity": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
- "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
- "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz",
- "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
- "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz",
- "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==",
- "requires": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-simple-access": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/helper-validator-identifier": "^7.15.7",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
- "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
- "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ=="
- },
- "@babel/helper-remap-async-to-generator": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz",
- "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-wrap-function": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz",
- "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==",
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
- "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
- "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
- "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
- "requires": {
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.15.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
- "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
- },
- "@babel/helper-validator-option": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
- "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow=="
- },
- "@babel/helper-wrap-function": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz",
- "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==",
- "requires": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/helpers": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz",
- "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==",
- "requires": {
- "@babel/template": "^7.16.0",
- "@babel/traverse": "^7.16.3",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/highlight": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
- "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz",
- "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng=="
- },
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.16.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz",
- "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0"
- }
- },
- "@babel/plugin-proposal-async-generator-functions": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz",
- "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.4",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
- }
- },
- "@babel/plugin-proposal-class-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz",
- "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-proposal-class-static-block": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz",
- "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-class-static-block": "^7.14.5"
- }
- },
- "@babel/plugin-proposal-dynamic-import": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz",
- "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-export-namespace-from": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz",
- "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-json-strings": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz",
- "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz",
- "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
- }
- },
- "@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz",
- "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-numeric-separator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz",
- "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- }
- },
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz",
- "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==",
- "requires": {
- "@babel/compat-data": "^7.16.0",
- "@babel/helper-compilation-targets": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.16.0"
- }
- },
- "@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz",
- "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-optional-chaining": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz",
- "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-private-methods": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz",
- "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-proposal-private-property-in-object": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz",
- "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
- }
- },
- "@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz",
- "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.12.13"
- }
- },
- "@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz",
- "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-typescript": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz",
- "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-arrow-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz",
- "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-async-to-generator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz",
- "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==",
- "requires": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-remap-async-to-generator": "^7.16.0"
- }
- },
- "@babel/plugin-transform-block-scoped-functions": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz",
- "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-block-scoping": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz",
- "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz",
- "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-optimise-call-expression": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/plugin-transform-computed-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz",
- "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz",
- "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-dotall-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz",
- "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-duplicate-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz",
- "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-exponentiation-operator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz",
- "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==",
- "requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-for-of": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz",
- "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-function-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz",
- "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==",
- "requires": {
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz",
- "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-member-expression-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz",
- "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-modules-amd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz",
- "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==",
- "requires": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- }
- },
- "@babel/plugin-transform-modules-commonjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz",
- "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==",
- "requires": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-simple-access": "^7.16.0",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- }
- },
- "@babel/plugin-transform-modules-systemjs": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz",
- "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==",
- "requires": {
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-identifier": "^7.15.7",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- }
- },
- "@babel/plugin-transform-modules-umd": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz",
- "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==",
- "requires": {
- "@babel/helper-module-transforms": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz",
- "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0"
- }
- },
- "@babel/plugin-transform-new-target": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz",
- "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-object-super": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz",
- "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-replace-supers": "^7.16.0"
- }
- },
- "@babel/plugin-transform-parameters": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz",
- "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-property-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz",
- "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-react-display-name": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz",
- "integrity": "sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-react-jsx": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz",
- "integrity": "sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-jsx": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/plugin-transform-react-jsx-development": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz",
- "integrity": "sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==",
- "requires": {
- "@babel/plugin-transform-react-jsx": "^7.16.0"
- }
- },
- "@babel/plugin-transform-react-pure-annotations": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz",
- "integrity": "sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-regenerator": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz",
- "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==",
- "requires": {
- "regenerator-transform": "^0.14.2"
- }
- },
- "@babel/plugin-transform-reserved-words": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz",
- "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-runtime": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz",
- "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==",
- "requires": {
- "@babel/helper-module-imports": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "babel-plugin-polyfill-corejs2": "^0.3.0",
- "babel-plugin-polyfill-corejs3": "^0.4.0",
- "babel-plugin-polyfill-regenerator": "^0.3.0",
- "semver": "^6.3.0"
- }
- },
- "@babel/plugin-transform-shorthand-properties": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz",
- "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-spread": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz",
- "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
- }
- },
- "@babel/plugin-transform-sticky-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz",
- "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-strict-mode": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.16.0.tgz",
- "integrity": "sha512-lcLX2TEX4EI5fRQDV7dIWNJdLnyhVE7K5oHZkKpo/lnOP+7LdkrV9v/enjBxts+xLn56TGf6zbyB2rvYl1zbYQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-template-literals": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz",
- "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-typeof-symbol": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz",
- "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-typescript": {
- "version": "7.16.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz",
- "integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/plugin-syntax-typescript": "^7.16.0"
- }
- },
- "@babel/plugin-transform-unicode-escapes": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz",
- "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-transform-unicode-regex": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz",
- "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.0",
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/preset-env": {
- "version": "7.16.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz",
- "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==",
- "requires": {
- "@babel/compat-data": "^7.16.4",
- "@babel/helper-compilation-targets": "^7.16.3",
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.16.4",
- "@babel/plugin-proposal-class-properties": "^7.16.0",
- "@babel/plugin-proposal-class-static-block": "^7.16.0",
- "@babel/plugin-proposal-dynamic-import": "^7.16.0",
- "@babel/plugin-proposal-export-namespace-from": "^7.16.0",
- "@babel/plugin-proposal-json-strings": "^7.16.0",
- "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
- "@babel/plugin-proposal-numeric-separator": "^7.16.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.16.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.16.0",
- "@babel/plugin-proposal-private-methods": "^7.16.0",
- "@babel/plugin-proposal-private-property-in-object": "^7.16.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.16.0",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-transform-arrow-functions": "^7.16.0",
- "@babel/plugin-transform-async-to-generator": "^7.16.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.16.0",
- "@babel/plugin-transform-block-scoping": "^7.16.0",
- "@babel/plugin-transform-classes": "^7.16.0",
- "@babel/plugin-transform-computed-properties": "^7.16.0",
- "@babel/plugin-transform-destructuring": "^7.16.0",
- "@babel/plugin-transform-dotall-regex": "^7.16.0",
- "@babel/plugin-transform-duplicate-keys": "^7.16.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.16.0",
- "@babel/plugin-transform-for-of": "^7.16.0",
- "@babel/plugin-transform-function-name": "^7.16.0",
- "@babel/plugin-transform-literals": "^7.16.0",
- "@babel/plugin-transform-member-expression-literals": "^7.16.0",
- "@babel/plugin-transform-modules-amd": "^7.16.0",
- "@babel/plugin-transform-modules-commonjs": "^7.16.0",
- "@babel/plugin-transform-modules-systemjs": "^7.16.0",
- "@babel/plugin-transform-modules-umd": "^7.16.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0",
- "@babel/plugin-transform-new-target": "^7.16.0",
- "@babel/plugin-transform-object-super": "^7.16.0",
- "@babel/plugin-transform-parameters": "^7.16.3",
- "@babel/plugin-transform-property-literals": "^7.16.0",
- "@babel/plugin-transform-regenerator": "^7.16.0",
- "@babel/plugin-transform-reserved-words": "^7.16.0",
- "@babel/plugin-transform-shorthand-properties": "^7.16.0",
- "@babel/plugin-transform-spread": "^7.16.0",
- "@babel/plugin-transform-sticky-regex": "^7.16.0",
- "@babel/plugin-transform-template-literals": "^7.16.0",
- "@babel/plugin-transform-typeof-symbol": "^7.16.0",
- "@babel/plugin-transform-unicode-escapes": "^7.16.0",
- "@babel/plugin-transform-unicode-regex": "^7.16.0",
- "@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.16.0",
- "babel-plugin-polyfill-corejs2": "^0.3.0",
- "babel-plugin-polyfill-corejs3": "^0.4.0",
- "babel-plugin-polyfill-regenerator": "^0.3.0",
- "core-js-compat": "^3.19.1",
- "semver": "^6.3.0"
- }
- },
- "@babel/preset-modules": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
- "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- }
- },
- "@babel/preset-react": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz",
- "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-transform-react-display-name": "^7.16.0",
- "@babel/plugin-transform-react-jsx": "^7.16.0",
- "@babel/plugin-transform-react-jsx-development": "^7.16.0",
- "@babel/plugin-transform-react-pure-annotations": "^7.16.0"
- }
- },
- "@babel/preset-typescript": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz",
- "integrity": "sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-validator-option": "^7.14.5",
- "@babel/plugin-transform-typescript": "^7.16.0"
- }
- },
- "@babel/runtime": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz",
- "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
- "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
- "requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/parser": "^7.16.0",
- "@babel/types": "^7.16.0"
- }
- },
- "@babel/traverse": {
- "version": "7.16.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz",
- "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==",
- "requires": {
- "@babel/code-frame": "^7.16.0",
- "@babel/generator": "^7.16.0",
- "@babel/helper-function-name": "^7.16.0",
- "@babel/helper-hoist-variables": "^7.16.0",
- "@babel/helper-split-export-declaration": "^7.16.0",
- "@babel/parser": "^7.16.3",
- "@babel/types": "^7.16.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
- "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.15.7",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@csstools/convert-colors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-2.0.0.tgz",
- "integrity": "sha512-P7BVvddsP2Wl5v3drJ3ArzpdfXMqoZ/oHOV/yFiGFb3JQr9Z9UXZ9tnHAKJsO89lfprR1F9ExW3Yij21EjEBIA=="
- },
- "@discoveryjs/json-ext": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz",
- "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA=="
- },
- "@eslint/eslintrc": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
- "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.0.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- },
- "dependencies": {
- "globals": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
- "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
- }
- }
- },
- "@humanwhocodes/config-array": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
- "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
- "requires": {
- "@humanwhocodes/object-schema": "^1.2.0",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
- }
- },
- "@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
- },
- "@jetbrains/angular-elastic": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/@jetbrains/angular-elastic/-/angular-elastic-2.5.1.tgz",
- "integrity": "sha512-/XU38+J5c3vKKoiwGmqze0UaKt7mnrR0mQJg1WxuZFBSTf6e1co8rN8bgxik0jAX5s8yXUMWhPhmrIYKaR140Q==",
- "requires": {
- "angular": ">=1.0.6"
- }
- },
- "@jetbrains/babel-preset-jetbrains": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@jetbrains/babel-preset-jetbrains/-/babel-preset-jetbrains-2.3.1.tgz",
- "integrity": "sha512-Vca81kSeBSlG7Pke07X2PyJk+kNBxxAEs8XZwDDQiPopVzx+A0fVixKqdHYuBSadJbvkl0LNLizrph+pqbcfQg==",
- "requires": {
- "@babel/plugin-transform-runtime": "^7.14.3",
- "@babel/plugin-transform-strict-mode": "^7.12.13",
- "@babel/preset-env": "^7.14.4",
- "@babel/preset-react": "^7.13.13",
- "@babel/preset-typescript": "^7.14.5",
- "@babel/runtime": "^7.14.0",
- "babel-plugin-angularjs-annotate": "^0.10.0"
- }
- },
- "@jetbrains/icons": {
- "version": "3.18.0",
- "resolved": "https://registry.npmjs.org/@jetbrains/icons/-/icons-3.18.0.tgz",
- "integrity": "sha512-aaKe4KVwjbnnbXEdWCVWMNwHrE1WCdwpVZYt468NXHukPX8KfnE8pGGuUcyEC/j4lXm+V8N24yGZ3GGMfq/wFA=="
- },
- "@jetbrains/logos": {
- "version": "1.4.27",
- "resolved": "https://registry.npmjs.org/@jetbrains/logos/-/logos-1.4.27.tgz",
- "integrity": "sha512-1+S4mjh7Z9HliTlgJeemr+my4mD6HeEY0GH/qc8FKsY7jprFPsbJnfgiVdrhRFMtx7Rb4AKRjiM4CIqqweF+zA=="
- },
- "@jetbrains/postcss-require-hover": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@jetbrains/postcss-require-hover/-/postcss-require-hover-0.1.2.tgz",
- "integrity": "sha512-U094mXSp0KOfqZLTlkPLz4vHdIZYm1gJFRFJP7nMrGA1OI4Nigwl0TUwFt/7YDNAff57Eo9Zttu9Ln5QoXguAw==",
- "requires": {
- "postcss": "^6.0.1"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "@jetbrains/ring-ui": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/@jetbrains/ring-ui/-/ring-ui-4.1.3.tgz",
- "integrity": "sha512-fjtzJ/bB/8/mGksTdYVQ7u6zZWqV4mN7z+0THmYal6JQaAx9yemR5oJ65NgD7Orb+LUsKU/S2eaLQLoXL4vDoQ==",
- "requires": {
- "@babel/core": "^7.16.0",
- "@jetbrains/angular-elastic": "^2.5.1",
- "@jetbrains/babel-preset-jetbrains": "^2.3.1",
- "@jetbrains/icons": "^3.18.0",
- "@jetbrains/logos": "^1.4.27",
- "@jetbrains/postcss-require-hover": "^0.1.2",
- "@ungap/url-search-params": "^0.2.2",
- "babel-loader": "^8.2.3",
- "babel-plugin-transform-define": "^2.0.1",
- "browserslist": "^4.16.6",
- "change-case": "^4.1.1",
- "classnames": "^2.3.1",
- "combokeys": "^3.0.1",
- "compile-code-loader": "^1.0.0",
- "conic-gradient": "^1.0.0",
- "css-loader": "^6.5.1",
- "date-fns": "^2.26.0",
- "deep-equal": "^2.0.4",
- "element-resize-detector": "^1.2.3",
- "es6-error": "^4.1.1",
- "eslint-plugin-react-hooks": "^4.3.0",
- "extricate-loader": "^3.0.0",
- "fastdom": "^1.0.10",
- "file-loader": "^6.2.0",
- "focus-trap": "^6.7.1",
- "focus-visible": "^5.2.0",
- "highlight.js": "^10.7.2",
- "html-loader": "^3.0.1",
- "interpolate-loader": "^2.0.1",
- "just-debounce-it": "^3.0.1",
- "memoize-one": "^6.0.0",
- "postcss": "^8.3.11",
- "postcss-calc": "^8.0.0",
- "postcss-flexbugs-fixes": "^5.0.2",
- "postcss-font-family-system-ui": "^5.0.0",
- "postcss-loader": "^6.2.0",
- "postcss-modules-values-replace": "^3.4.0",
- "postcss-preset-env": "^7.0.1",
- "prop-types": "^15.7.2",
- "react-markdown": "^5.0.3",
- "react-movable": "^3.0.2",
- "react-virtualized": "^9.22.3",
- "react-waypoint": "^10.1.0",
- "remark-breaks": "^3.0.2",
- "remark-gfm": "^1.0.0",
- "scrollbar-width": "^3.1.1",
- "simply-uuid": "^1.0.1",
- "sniffr": "^1.2.0",
- "style-inject": "^0.3.0",
- "style-loader": "~3.3.1",
- "url-loader": "^4.1.1",
- "util-deprecate": "^1.0.2"
- },
- "dependencies": {
- "extricate-loader": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/extricate-loader/-/extricate-loader-3.0.0.tgz",
- "integrity": "sha512-Ts6BIh25xhFpeGaG0La345bYQdRXWv3ZvUwmJB6/QsXRywWrZmM1hGz8eZfQaBwy/HsmGOZevzGLesVtsrrmyg==",
- "requires": {
- "loader-utils": "^1.1.0"
- }
- },
- "react-virtualized": {
- "version": "9.22.3",
- "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz",
- "integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "clsx": "^1.0.4",
- "dom-helpers": "^5.1.3",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.7.2",
- "react-lifecycles-compat": "^3.0.4"
- }
- }
- }
- },
- "@jetbrains/stylelint-config": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@jetbrains/stylelint-config/-/stylelint-config-3.0.2.tgz",
- "integrity": "sha512-cYDZTNlVsCQxFfTURHD0y5BAm2gmVl7J8qN2Q5xQPtj7Cn/u8lXnB+8u8/sdTSuqne52UDeDK/FtdtyP395geA==",
- "dev": true,
- "requires": {
- "stylelint-config-css-modules": "^2.2.0",
- "stylelint-config-standard": "^23.0.0",
- "stylelint-order": "^5.0.0"
- }
- },
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
- },
- "@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
- },
- "@jridgewell/source-map": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
- "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
- "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
- "requires": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "@types/bonjour": {
- "version": "3.5.10",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
- "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect-history-api-fallback": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
- "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
- "requires": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "@types/eslint": {
- "version": "8.21.2",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.2.tgz",
- "integrity": "sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==",
- "requires": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "@types/eslint-scope": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
- "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
- "requires": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
- },
- "@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
- "requires": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "@types/http-proxy": {
- "version": "1.17.7",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz",
- "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/json-schema": {
- "version": "7.0.9",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
- "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
- },
- "@types/lodash": {
- "version": "4.14.177",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.177.tgz",
- "integrity": "sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==",
- "dev": true
- },
- "@types/mdast": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
- "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
- "requires": {
- "@types/unist": "*"
- }
- },
- "@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
- },
- "@types/minimist": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
- "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
- "dev": true
- },
- "@types/node": {
- "version": "16.11.10",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz",
- "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA=="
- },
- "@types/normalize-package-data": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
- "dev": true
- },
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
- },
- "@types/prop-types": {
- "version": "15.7.4",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
- "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
- },
- "@types/q": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
- "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
- "dev": true
- },
- "@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
- },
- "@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
- },
- "@types/react": {
- "version": "17.0.37",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.37.tgz",
- "integrity": "sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==",
- "requires": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "@types/react-dom": {
- "version": "17.0.11",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
- "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==",
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/retry": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
- "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g=="
- },
- "@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
- },
- "@types/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
- "requires": {
- "@types/express": "*"
- }
- },
- "@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "requires": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "@types/sockjs": {
- "version": "0.3.33",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
- "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/unist": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
- "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
- },
- "@types/ws": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
- "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@ungap/url-search-params": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.2.tgz",
- "integrity": "sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw=="
- },
- "@webassemblyjs/ast": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
- "requires": {
- "@webassemblyjs/helper-numbers": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
- },
- "@webassemblyjs/helper-numbers": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
- "requires": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/helper-wasm-section": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-opt": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "@webassemblyjs/wast-printer": "1.11.1"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-buffer": "1.11.1",
- "@webassemblyjs/wasm-gen": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/helper-api-error": "1.11.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
- "@webassemblyjs/ieee754": "1.11.1",
- "@webassemblyjs/leb128": "1.11.1",
- "@webassemblyjs/utf8": "1.11.1"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
- "requires": {
- "@webassemblyjs/ast": "1.11.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webpack-cli/configtest": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz",
- "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==",
- "requires": {}
- },
- "@webpack-cli/info": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz",
- "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==",
- "requires": {
- "envinfo": "^7.7.3"
- }
- },
- "@webpack-cli/serve": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz",
- "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==",
- "requires": {}
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
- },
- "accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "requires": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- }
- },
- "acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
- },
- "acorn-import-assertions": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
- "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
- "requires": {}
- },
- "acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "requires": {}
- },
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "requires": {
- "ajv": "^8.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- }
- }
- },
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "requires": {}
- },
- "angular": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
- "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw=="
- },
- "ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
- },
- "ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
- },
- "async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "autoprefixer": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz",
- "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==",
- "requires": {
- "browserslist": "^4.17.5",
- "caniuse-lite": "^1.0.30001272",
- "fraction.js": "^4.1.1",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.1.0"
- }
- },
- "available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
- },
- "babel-loader": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
- "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
- "requires": {
- "find-cache-dir": "^3.3.1",
- "loader-utils": "^1.4.0",
- "make-dir": "^3.1.0",
- "schema-utils": "^2.6.5"
- }
- },
- "babel-plugin-angularjs-annotate": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz",
- "integrity": "sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/types": "^7.2.0",
- "simple-is": "~0.2.0"
- }
- },
- "babel-plugin-dynamic-import-node": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
- "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
- "requires": {
- "object.assign": "^4.1.0"
- }
- },
- "babel-plugin-polyfill-corejs2": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz",
- "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==",
- "requires": {
- "@babel/compat-data": "^7.13.11",
- "@babel/helper-define-polyfill-provider": "^0.3.0",
- "semver": "^6.1.1"
- }
- },
- "babel-plugin-polyfill-corejs3": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
- "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==",
- "requires": {
- "@babel/helper-define-polyfill-provider": "^0.3.0",
- "core-js-compat": "^3.18.0"
- }
- },
- "babel-plugin-polyfill-regenerator": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz",
- "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==",
- "requires": {
- "@babel/helper-define-polyfill-provider": "^0.3.0"
- }
- },
- "babel-plugin-react-svg": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-react-svg/-/babel-plugin-react-svg-3.0.3.tgz",
- "integrity": "sha512-Pst1RWjUIiV0Ykv1ODSeceCBsFOP2Y4dusjq7/XkjuzJdvS9CjpkPMUIoO4MLlvp5PiLCeMlsOC7faEUA0gm3Q==",
- "dev": true,
- "requires": {}
- },
- "babel-plugin-transform-define": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.1.tgz",
- "integrity": "sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw==",
- "requires": {
- "lodash": "^4.17.11",
- "traverse": "0.6.6"
- }
- },
- "bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
- },
- "batch-processor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz",
- "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg="
- },
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
- },
- "body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "requires": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "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.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- }
- }
- },
- "bonjour": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
- "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
- "requires": {
- "array-flatten": "^2.1.0",
- "deep-equal": "^1.0.1",
- "dns-equal": "^1.0.0",
- "dns-txt": "^2.0.2",
- "multicast-dns": "^6.0.1",
- "multicast-dns-service-types": "^1.1.0"
- },
- "dependencies": {
- "deep-equal": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
- "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
- "requires": {
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.1",
- "is-regex": "^1.0.4",
- "object-is": "^1.0.1",
- "object-keys": "^1.1.1",
- "regexp.prototype.flags": "^1.2.0"
- }
- }
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "browserslist": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz",
- "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==",
- "requires": {
- "caniuse-lite": "^1.0.30001280",
- "electron-to-chromium": "^1.3.896",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.1",
- "picocolors": "^1.0.0"
- }
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "buffer-indexof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
- "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- },
- "camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "requires": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001283",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
- "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg=="
- },
- "capital-case": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
- "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case-first": "^2.0.2"
- }
- },
- "ccount": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
- "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg=="
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "change-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
- "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
- "requires": {
- "camel-case": "^4.1.2",
- "capital-case": "^1.0.4",
- "constant-case": "^3.0.4",
- "dot-case": "^3.0.4",
- "header-case": "^2.0.4",
- "no-case": "^3.0.4",
- "param-case": "^3.0.4",
- "pascal-case": "^3.1.2",
- "path-case": "^3.0.4",
- "sentence-case": "^3.0.4",
- "snake-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
- },
- "character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
- },
- "character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
- },
- "chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.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"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="
- },
- "classnames": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
- "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
- },
- "clean-css": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz",
- "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==",
- "requires": {
- "source-map": "~0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
- },
- "clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "requires": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "dependencies": {
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "requires": {
- "isobject": "^3.0.1"
- }
- }
- }
- },
- "clone-regexp": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
- "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
- "dev": true,
- "requires": {
- "is-regexp": "^2.0.0"
- }
- },
- "clsx": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
- "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
- },
- "coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "dev": true,
- "requires": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
- },
- "combokeys": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/combokeys/-/combokeys-3.0.1.tgz",
- "integrity": "sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw=="
- },
- "commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
- },
- "compile-code-loader": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/compile-code-loader/-/compile-code-loader-1.0.0.tgz",
- "integrity": "sha512-MFE1K+xC3f28urqFQ/7LGAzl/MZXzrFz5n3Tp83n6DwiucAVPkbB+z18D7Z0BqvmcuFiYy6hgm9sGrF/mbyZUw==",
- "requires": {
- "loader-utils": "^2.0.0"
- },
- "dependencies": {
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- }
- }
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "conic-gradient": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/conic-gradient/-/conic-gradient-1.0.0.tgz",
- "integrity": "sha512-TEmM3Ondx8nid2AN0Rsw6eQG7PgTUkL6gs90UqX1cNqO/bpt/H/Rw6DwbzoylQ9SSxqLG1SsteAr9/yBsAzdtw==",
- "requires": {
- "prefixfree": "^1.0.0"
- }
- },
- "connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
- },
- "consolidated-events": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz",
- "integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ=="
- },
- "constant-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
- "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case": "^2.0.2"
- }
- },
- "content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "requires": {
- "safe-buffer": "5.2.1"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- },
- "convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "core-js": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.1.tgz",
- "integrity": "sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==",
- "peer": true
- },
- "core-js-compat": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz",
- "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==",
- "requires": {
- "browserslist": "^4.17.6",
- "semver": "7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
- }
- }
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
- },
- "cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- }
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "css-blank-pseudo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-2.0.0.tgz",
- "integrity": "sha512-n7fxEOyuvAVPLPb9kL4XTIK/gnp2fKQ7KFQ+9lj60W9pDn/jTr5LjS/kHHm+rES/YJ3m0S6+uJgYSuAJg9zOyA==",
- "requires": {}
- },
- "css-has-pseudo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-2.0.0.tgz",
- "integrity": "sha512-URYSGI0ggED1W1/xOAH0Zn1bf+YL6tYh1PQzAPlWddEAyyO37mPqMbwCzSjTTNmeCR8BMNXSFLaT5xb6MERdAA==",
- "requires": {
- "postcss-selector-parser": "^6"
- }
- },
- "css-loader": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz",
- "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==",
- "requires": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.2.15",
- "postcss-modules-extract-imports": "^3.0.0",
- "postcss-modules-local-by-default": "^4.0.0",
- "postcss-modules-scope": "^3.0.0",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.1.0",
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "css-prefers-color-scheme": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-5.0.0.tgz",
- "integrity": "sha512-XpzVrdwbppHm+Nnrzcb/hQb8eq1aKv4U8Oh59LsLfTsbIZZ6Fvn9razb66ihH2aTJ0VhO9n9sVm8piyKXJAZMA==",
- "requires": {}
- },
- "css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "dev": true,
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- },
- "dependencies": {
- "dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- }
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- },
- "dependencies": {
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- }
- }
- },
- "entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true
- }
- }
- },
- "css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "dev": true
- },
- "css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
- "dev": true
- },
- "cssdb": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.0.0.tgz",
- "integrity": "sha512-Q7982SynYCtcLUBCPgUPFy2TZmDiFyimpdln8K2v4w2c07W4rXL7q5F1ksVAqOAQfxKyyUGCKSsioezKT5bU1Q=="
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
- },
- "csso": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
- "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
- "dev": true,
- "requires": {
- "css-tree": "^1.1.2"
- },
- "dependencies": {
- "css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- }
- },
- "mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "csstype": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
- "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
- },
- "date-fns": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.26.0.tgz",
- "integrity": "sha512-VQI812dRi3cusdY/fhoBKvc6l2W8BPWU1FNVnFH9Nttjx4AFBRzfSVb/Eyc7jBT6e9sg1XtAGsYpBQ6c/jygbg=="
- },
- "debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "dev": true,
- "requires": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "dependencies": {
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- }
- }
- },
- "deep-equal": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
- "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
- "requires": {
- "call-bind": "^1.0.0",
- "es-get-iterator": "^1.1.1",
- "get-intrinsic": "^1.0.1",
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.2",
- "is-regex": "^1.1.1",
- "isarray": "^2.0.5",
- "object-is": "^1.1.4",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "regexp.prototype.flags": "^1.3.0",
- "side-channel": "^1.0.3",
- "which-boxed-primitive": "^1.0.1",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.2"
- }
- },
- "deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
- },
- "default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "requires": {
- "execa": "^5.0.0"
- }
- },
- "define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "del": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
- "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
- "requires": {
- "globby": "^11.0.1",
- "graceful-fs": "^4.2.4",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.2",
- "p-map": "^4.0.0",
- "rimraf": "^3.0.2",
- "slash": "^3.0.0"
- }
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
- },
- "detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
- },
- "dns-packet": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
- "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
- "requires": {
- "ip": "^1.1.0",
- "safe-buffer": "^5.0.1"
- }
- },
- "dns-txt": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
- "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
- "requires": {
- "buffer-indexof": "^1.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "dom-serializer": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
- "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
- "requires": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "dependencies": {
- "entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
- }
- }
- },
- "domelementtype": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
- "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
- },
- "domhandler": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz",
- "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==",
- "requires": {
- "domelementtype": "^2.2.0"
- }
- },
- "domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "requires": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- }
- },
- "dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "electron-to-chromium": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.4.tgz",
- "integrity": "sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg=="
- },
- "element-resize-detector": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.3.tgz",
- "integrity": "sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ==",
- "requires": {
- "batch-processor": "1.0.0"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
- },
- "enhanced-resolve": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
- "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
- "object-assign": "^4.0.1",
- "tapable": "^0.2.7"
- }
- },
- "enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "requires": {
- "ansi-colors": "^4.1.1"
- }
- },
- "entities": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
- "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="
- },
- "envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw=="
- },
- "errno": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
- "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
- "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
- "requires": {
- "call-bind": "^1.0.2",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.1.1",
- "get-symbol-description": "^1.0.0",
- "has": "^1.0.3",
- "has-symbols": "^1.0.2",
- "internal-slot": "^1.0.3",
- "is-callable": "^1.2.4",
- "is-negative-zero": "^2.0.1",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.1",
- "is-string": "^1.0.7",
- "is-weakref": "^1.0.1",
- "object-inspect": "^1.11.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "string.prototype.trimend": "^1.0.4",
- "string.prototype.trimstart": "^1.0.4",
- "unbox-primitive": "^1.0.1"
- }
- },
- "es-get-iterator": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
- "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.0",
- "has-symbols": "^1.0.1",
- "is-arguments": "^1.1.0",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.5",
- "isarray": "^2.0.5"
- }
- },
- "es-module-lexer": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="
- },
- "es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
- },
- "es6-promisify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
- "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
- "requires": {
- "es6-promise": "^4.0.3"
- }
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "eslint": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
- "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
- "requires": {
- "@eslint/eslintrc": "^1.0.4",
- "@humanwhocodes/config-array": "^0.6.0",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.1.0",
- "eslint-utils": "^3.0.0",
- "eslint-visitor-keys": "^3.1.0",
- "espree": "^9.1.0",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^6.0.1",
- "globals": "^13.6.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.2.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
- },
- "eslint-scope": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
- "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
- "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA=="
- },
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
- },
- "globals": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
- "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
- }
- }
- },
- "eslint-plugin-react-hooks": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz",
- "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==",
- "requires": {}
- },
- "eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "requires": {
- "eslint-visitor-keys": "^2.0.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
- },
- "espree": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
- "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
- "requires": {
- "acorn": "^8.6.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^3.1.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
- "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA=="
- }
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "requires": {
- "estraverse": "^5.1.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
- }
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "requires": {
- "estraverse": "^5.2.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
- }
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
- },
- "eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
- },
- "events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
- },
- "execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- }
- },
- "execall": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
- "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
- "dev": true,
- "requires": {
- "clone-regexp": "^2.1.0"
- }
- },
- "express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "requires": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "fast-glob": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
- "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "fastdom": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/fastdom/-/fastdom-1.0.10.tgz",
- "integrity": "sha512-sbL4h358IlZn8VsTvA5TYnKVLYif46XhPEll+HTSxVtDSpqZEO/17D/QqlxE9V2K7AQ82GXeYeQLU2HWwKgk1A==",
- "requires": {
- "strictdom": "^1.0.1"
- }
- },
- "fastest-levenshtein": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
- "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow=="
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "requires": {
- "flat-cache": "^3.0.4"
- }
- },
- "file-loader": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
- "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
- "requires": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
- },
- "dependencies": {
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "requires": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- }
- },
- "flatted": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
- "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw=="
- },
- "flatten": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
- "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
- },
- "focus-trap": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.7.1.tgz",
- "integrity": "sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg==",
- "requires": {
- "tabbable": "^5.2.1"
- }
- },
- "focus-visible": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz",
- "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ=="
- },
- "follow-redirects": {
- "version": "1.14.8",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
- "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA=="
- },
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fraction.js": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz",
- "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA=="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
- },
- "fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q=="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
- },
- "get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- }
- },
- "get-stdin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
- "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
- "dev": true
- },
- "get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
- },
- "get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- }
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "requires": {
- "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-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
- "glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "dependencies": {
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
- },
- "globby": {
- "version": "11.0.4",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
- "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- },
- "dependencies": {
- "ignore": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
- "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ=="
- }
- }
- },
- "globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
- "dev": true
- },
- "graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
- },
- "handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
- },
- "hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-bigints": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
- "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
- },
- "has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
- },
- "header-case": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
- "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
- "requires": {
- "capital-case": "^1.0.4",
- "tslib": "^2.0.3"
- }
- },
- "highlight.js": {
- "version": "10.7.3",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
- "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="
- },
- "hosted-git-info": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
- "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "html-entities": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
- "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ=="
- },
- "html-loader": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.0.1.tgz",
- "integrity": "sha512-90Sxg9FhTkQEzmmHT2KOAQniTZgC72aifcfR0fZsuo1PJz0K4EXiTwxejTUombF8XShLj5RaZKYsUJhxR6G2dA==",
- "requires": {
- "html-minifier-terser": "^6.0.2",
- "parse5": "^6.0.1"
- }
- },
- "html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
- "requires": {
- "camel-case": "^4.1.2",
- "clean-css": "^5.2.2",
- "commander": "^8.3.0",
- "he": "^1.2.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.10.0"
- }
- },
- "html-tags": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
- "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
- "dev": true
- },
- "html-to-react": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.7.tgz",
- "integrity": "sha512-adtKiee5AtnuUhdB8bxbASRP2bW/A0OrlwysEuqZxXdURb0/1XR0m/woE1V5cJA1U5nyzAvk/PdFNO9S73DE/g==",
- "requires": {
- "domhandler": "^4.0",
- "htmlparser2": "^7.0",
- "lodash.camelcase": "^4.3.0",
- "ramda": "^0.27.1"
- }
- },
- "htmlparser2": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
- "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
- "requires": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.2",
- "domutils": "^2.8.0",
- "entities": "^3.0.1"
- }
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
- },
- "http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "dependencies": {
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "http-parser-js": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
- "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA=="
- },
- "http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-middleware": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz",
- "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==",
- "requires": {
- "@types/http-proxy": "^1.17.5",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "dependencies": {
- "is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="
- }
- }
- },
- "human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "icss-utils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "requires": {}
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
- },
- "import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true
- },
- "import-local": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz",
- "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==",
- "requires": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
- },
- "indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "internal-slot": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
- "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
- "requires": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- }
- },
- "interpolate-loader": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/interpolate-loader/-/interpolate-loader-2.0.1.tgz",
- "integrity": "sha512-X5/cKHUnAS5gV/oK9Z6pEjg2xVH5EGgnC5QmaOPwK/o7qMOMyyafwFL1mtH3yAK+COCjyaH56MOs9G8uXG12yA==",
- "requires": {
- "escape-string-regexp": "^2.0.0",
- "loader-utils": "^1.1.0"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
- }
- }
- },
- "interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
- },
- "ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng=="
- },
- "is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
- },
- "is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "requires": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- }
- },
- "is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "requires": {
- "has-bigints": "^1.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
- },
- "is-callable": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
- "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
- },
- "is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
- },
- "is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
- },
- "is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg=="
- },
- "is-negative-zero": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
- "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- },
- "is-number-object": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
- "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
- },
- "is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
- "dev": true
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true
- },
- "is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-regexp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
- "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
- "dev": true
- },
- "is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g=="
- },
- "is-shared-array-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
- "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
- },
- "is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "is-typed-array": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
- "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
- "requires": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-url-superb": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz",
- "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA=="
- },
- "is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA=="
- },
- "is-weakref": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
- "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
- "requires": {
- "call-bind": "^1.0.0"
- }
- },
- "is-weakset": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
- "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw=="
- },
- "is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "requires": {
- "is-docker": "^2.0.0"
- }
- },
- "isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
- },
- "jest-worker": {
- "version": "27.3.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz",
- "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==",
- "requires": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "dependencies": {
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
- },
- "json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
- },
- "just-debounce-it": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.0.1.tgz",
- "integrity": "sha512-6EQWOpRV8fm/ame6XvGBSxvsjoMbqj7JS9TV/4Q9aOXt9DQw22GBfTGP6gTAqcBNN/PbzlwtwH7jtM0k9oe9pg=="
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
- },
- "klona": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
- "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ=="
- },
- "known-css-properties": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.23.0.tgz",
- "integrity": "sha512-h9ivI88e1lFNmTT4HovBN33Ysn0OIJG7IPG2mkpx2uniQXFWqo35QdiX7w0TovlUFXfW8aPFblP5/q0jlOr2sA==",
- "dev": true
- },
- "levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "requires": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- }
- },
- "lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "loader-runner": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
- "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw=="
- },
- "loader-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
- "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
- },
- "lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
- "dev": true
- },
- "lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
- "dev": true
- },
- "lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
- "dev": true
- },
- "longest-streak": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
- "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg=="
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "requires": {
- "tslib": "^2.0.3"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "requires": {
- "semver": "^6.0.0"
- }
- },
- "map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true
- },
- "markdown-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "requires": {
- "repeat-string": "^1.0.0"
- }
- },
- "mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true
- },
- "mdast-add-list-metadata": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz",
- "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==",
- "requires": {
- "unist-util-visit-parents": "1.1.2"
- }
- },
- "mdast-util-find-and-replace": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
- "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
- "requires": {
- "escape-string-regexp": "^4.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
- },
- "unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- }
- }
- },
- "mdast-util-from-markdown": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
- "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
- "requires": {
- "@types/mdast": "^3.0.0",
- "mdast-util-to-string": "^2.0.0",
- "micromark": "~2.11.0",
- "parse-entities": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "mdast-util-gfm": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
- "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
- "requires": {
- "mdast-util-gfm-autolink-literal": "^0.1.0",
- "mdast-util-gfm-strikethrough": "^0.2.0",
- "mdast-util-gfm-table": "^0.1.0",
- "mdast-util-gfm-task-list-item": "^0.1.0",
- "mdast-util-to-markdown": "^0.6.1"
- }
- },
- "mdast-util-gfm-autolink-literal": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
- "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
- "requires": {
- "ccount": "^1.0.0",
- "mdast-util-find-and-replace": "^1.1.0",
- "micromark": "^2.11.3"
- }
- },
- "mdast-util-gfm-strikethrough": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
- "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
- "requires": {
- "mdast-util-to-markdown": "^0.6.0"
- }
- },
- "mdast-util-gfm-table": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
- "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
- "requires": {
- "markdown-table": "^2.0.0",
- "mdast-util-to-markdown": "~0.6.0"
- }
- },
- "mdast-util-gfm-task-list-item": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
- "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
- "requires": {
- "mdast-util-to-markdown": "~0.6.0"
- }
- },
- "mdast-util-to-markdown": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
- "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
- "requires": {
- "@types/unist": "^2.0.0",
- "longest-streak": "^2.0.0",
- "mdast-util-to-string": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.0.0",
- "zwitch": "^1.0.0"
- }
- },
- "mdast-util-to-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
- "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w=="
- },
- "mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "dev": true
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
- },
- "memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
- "requires": {
- "fs-monkey": "1.0.3"
- }
- },
- "memoize-one": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
- "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
- },
- "memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
- "meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
- "dev": true,
- "requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "micromark": {
- "version": "2.11.4",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
- "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
- "requires": {
- "debug": "^4.0.0",
- "parse-entities": "^2.0.0"
- }
- },
- "micromark-extension-gfm": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
- "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
- "requires": {
- "micromark": "~2.11.0",
- "micromark-extension-gfm-autolink-literal": "~0.5.0",
- "micromark-extension-gfm-strikethrough": "~0.6.5",
- "micromark-extension-gfm-table": "~0.4.0",
- "micromark-extension-gfm-tagfilter": "~0.3.0",
- "micromark-extension-gfm-task-list-item": "~0.3.0"
- }
- },
- "micromark-extension-gfm-autolink-literal": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
- "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
- "requires": {
- "micromark": "~2.11.3"
- }
- },
- "micromark-extension-gfm-strikethrough": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
- "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
- "requires": {
- "micromark": "~2.11.0"
- }
- },
- "micromark-extension-gfm-table": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
- "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
- "requires": {
- "micromark": "~2.11.0"
- }
- },
- "micromark-extension-gfm-tagfilter": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
- "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q=="
- },
- "micromark-extension-gfm-task-list-item": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
- "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
- "requires": {
- "micromark": "~2.11.0"
- }
- },
- "micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
- },
- "mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "requires": {
- "mime-db": "1.51.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- },
- "min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true
- },
- "mini-css-extract-plugin": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz",
- "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==",
- "dev": true,
- "requires": {
- "schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
- }
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
- },
- "minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "multicast-dns": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
- "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
- "requires": {
- "dns-packet": "^1.3.1",
- "thunky": "^1.0.2"
- }
- },
- "multicast-dns-service-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
- "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
- },
- "nanoid": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
- "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA=="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
- },
- "neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
- },
- "no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "requires": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node-forge": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
- "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA=="
- },
- "node-releases": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
- "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
- },
- "normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- },
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
- },
- "normalize-selector": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
- "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
- "dev": true
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "dev": true,
- "requires": {
- "boolbase": "~1.0.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-inspect": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
- "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
- },
- "object-is": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
- "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
- "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- }
- },
- "object.values": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
- "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- }
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "requires": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- }
- },
- "optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "requires": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
- "requires": {
- "@types/retry": "^0.12.0",
- "retry": "^0.13.1"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
- },
- "param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "requires": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
- "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
- "requires": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- }
- },
- "parse5": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "path-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
- "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
- "requires": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- },
- "picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "requires": {
- "find-up": "^4.0.0"
- }
- },
- "portfinder": {
- "version": "1.0.28",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
- "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
- "requires": {
- "async": "^2.6.2",
- "debug": "^3.1.1",
- "mkdirp": "^0.5.5"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "postcss": {
- "version": "8.4.4",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz",
- "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==",
- "requires": {
- "nanoid": "^3.1.30",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.1"
- }
- },
- "postcss-attribute-case-insensitive": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz",
- "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==",
- "requires": {
- "postcss-selector-parser": "^6.0.2"
- }
- },
- "postcss-calc": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz",
- "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==",
- "requires": {
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.0.2"
- }
- },
- "postcss-color-functional-notation": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.0.1.tgz",
- "integrity": "sha512-qxD/7Q2rdmqJLSYxlJFJM9gVdyVLTBVrOUc+B6+KbOe4t2G2KnoI3HdimdK4PerGLqAqKnEVGgal7YKImm0g+w==",
- "requires": {
- "postcss-values-parser": "6.0.1"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-color-hex-alpha": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.0.tgz",
- "integrity": "sha512-Z0xiE0j+hbefUj0LWOMkzmTIS7k+dqJKzLwoKww0KJhju/sWXr+84Yk7rmvFoML/4LjGpJgefZvDwExrsWfHZw==",
- "requires": {
- "postcss-values-parser": "^6.0.0"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-color-rebeccapurple": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.0.tgz",
- "integrity": "sha512-+Ogw3SA0ESjjO87S8Dn+aAEHK6hFAWAVbTVnyXnmbV6Xh0TKi0vXpzhlKG/yrxujxtlgQcMQNQjg75uWWv28xA==",
- "requires": {
- "postcss-values-parser": "^6"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-custom-media": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz",
- "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==",
- "requires": {}
- },
- "postcss-custom-properties": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.0.0.tgz",
- "integrity": "sha512-eAyX3rMjZKxdne6tWKjkWbNWfw6bbv4xTsrjNJ7C3uGDODrzbQXR+ueshRkw7Lhlhc3qyTmYH/sFfD0AbhgdSQ==",
- "requires": {
- "postcss-values-parser": "^6"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-custom-selectors": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz",
- "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==",
- "requires": {
- "postcss-selector-parser": "^6.0.4"
- }
- },
- "postcss-dir-pseudo-class": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz",
- "integrity": "sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA==",
- "requires": {
- "postcss-selector-parser": "6.0.6"
- }
- },
- "postcss-double-position-gradients": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.1.tgz",
- "integrity": "sha512-L18N4Y1gpKQPEnZ6JOxO3H5gswZzTNR+ZqruZG7cOtOF/GR6J1YBRKn5hdTn3Vs4Y9XuDqaBD8vIXFIEft9Jqw==",
- "requires": {
- "postcss-values-parser": "6.0.1"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-env-function": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.2.tgz",
- "integrity": "sha512-VXKv0Vskq7olS3Q2zj38G4au4PkW+YWBRgng2Czx0pP9PyqU6uzjS6uVU1VkJN8i0OTPM7g82YFUdiz/7pEvpg==",
- "requires": {
- "postcss-values-parser": "6.0.1"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-flexbugs-fixes": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
- "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
- "requires": {}
- },
- "postcss-focus-visible": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.1.tgz",
- "integrity": "sha512-UddLlBmJ78Nu7OrKME70EKxCPBdxTx7pKIyD3GDNRM8Tnq19zmscT9QzsvR8gygz0i0nNUjMtSz4N3AEWZ5R/Q==",
- "requires": {}
- },
- "postcss-focus-within": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz",
- "integrity": "sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg==",
- "requires": {}
- },
- "postcss-font-family-system-ui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-family-system-ui/-/postcss-font-family-system-ui-5.0.0.tgz",
- "integrity": "sha512-3ndzyyMPhSbZekEPTuvKZz17jQXftAGMcVxNV4rTKNXsOsl23ZKlHcccEPB9tpB/SmGtDszdPvajdJrjZeKBfQ==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.30000655"
- }
- },
- "postcss-font-variant": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
- "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
- "requires": {}
- },
- "postcss-gap-properties": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.0.tgz",
- "integrity": "sha512-QJOkz1epC/iCuOdhQPm3n9T+F25+P+MYJEEcs5xz/Q+020mc9c6ZRGJkzPJd8FS9hFmT9eEKFEx9PEDl+lH5og==",
- "requires": {}
- },
- "postcss-image-set-function": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.2.tgz",
- "integrity": "sha512-NbTOc3xOq/YjIJS8/UVnhI16NxRuCiEWjem0eYt87sKvjdpk00niQ9oVo3eSR+kmMKWIO979x3j5i1GYJNxe1A==",
- "requires": {
- "postcss-values-parser": "6.0.1"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-import": {
- "version": "14.0.2",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz",
- "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==",
- "requires": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- }
- },
- "postcss-initial": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
- "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
- "requires": {}
- },
- "postcss-lab-function": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.1.tgz",
- "integrity": "sha512-8F2keZUlUiX/tznbCZ5y3Bmx6pnc19kvL4oq+x+uoK0ZYQjUWmHDdVHBG6iMq2T0Fteu+AgGAo94UcIsL4ay2w==",
- "requires": {
- "@csstools/convert-colors": "2.0.0",
- "postcss-values-parser": "6.0.1"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-loader": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
- "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
- "requires": {
- "cosmiconfig": "^7.0.0",
- "klona": "^2.0.5",
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "postcss-logical": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.0.tgz",
- "integrity": "sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA==",
- "requires": {}
- },
- "postcss-media-minmax": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
- "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
- "requires": {}
- },
- "postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
- "dev": true
- },
- "postcss-modules-extract-imports": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "requires": {}
- },
- "postcss-modules-local-by-default": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
- "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
- "requires": {
- "icss-utils": "^5.0.0",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.1.0"
- }
- },
- "postcss-modules-scope": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
- "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
- "requires": {
- "postcss-selector-parser": "^6.0.4"
- }
- },
- "postcss-modules-values": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
- "requires": {
- "icss-utils": "^5.0.0"
- }
- },
- "postcss-modules-values-replace": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values-replace/-/postcss-modules-values-replace-3.4.0.tgz",
- "integrity": "sha512-pY8iCSKxdt25uE+N4dO1PUUDOl8FIuvtZfT5964TuFJVhq+CEG8uqDpOCpCnqda/3K9ZFCNo4prn84H9SgP4Rw==",
- "requires": {
- "enhanced-resolve": "^3.1.0",
- "es6-promisify": "^5.0.0",
- "icss-utils": "^4.0.0",
- "loader-utils": "^2.0.0",
- "postcss": "^7.0.0",
- "postcss-values-parser": "^1.3.1"
- },
- "dependencies": {
- "icss-utils": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
- "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
- "requires": {
- "postcss": "^7.0.14"
- }
- },
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "picocolors": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
- "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
- },
- "postcss": {
- "version": "7.0.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
- "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
- "requires": {
- "picocolors": "^0.2.1",
- "source-map": "^0.6.1"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "postcss-nesting": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.0.2.tgz",
- "integrity": "sha512-FdecapAKIe+kp6uLNW7icw1g1B2HRhAAfsNv/TPzopeM08gpUbnBpqKSVqxrCqLDwzQG854ZJn5I0BiJ35WvmA==",
- "requires": {
- "postcss-selector-parser": "6.0.6"
- }
- },
- "postcss-overflow-shorthand": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.0.tgz",
- "integrity": "sha512-4fTapLT68wUoIr4m3Z0sKn1NbXX0lJYvj4aDA2++KpNx8wMSVf55UuLPz0nSjXa7dV1p0xQHlJ0iFJRNrSY2mw==",
- "requires": {}
- },
- "postcss-page-break": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
- "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
- "requires": {}
- },
- "postcss-place": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.1.tgz",
- "integrity": "sha512-X+vHHzqZjI4JbSoj3uYpL6rGRUHE1O9F8g+jBFn5U94U0t6GjJuL/xSN7tU6Pnm9tpfXioHfxwt9E8+JrCB9OQ==",
- "requires": {
- "postcss-values-parser": "6.0.1"
- },
- "dependencies": {
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "postcss-values-parser": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz",
- "integrity": "sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q==",
- "requires": {
- "color-name": "^1.1.4",
- "is-url-superb": "^4.0.0",
- "quote-unquote": "^1.0.0"
- }
- }
- }
- },
- "postcss-preset-env": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.0.1.tgz",
- "integrity": "sha512-oB7IJGwLBEwnao823mS2b9hqbp5Brm0EZKWRVROayjGwyPQVjY9gZpPZk/ItFakdx7GAPgv3ya+9R3KrUqCwYA==",
- "requires": {
- "autoprefixer": "^10.4.0",
- "browserslist": "^4.17.5",
- "caniuse-lite": "^1.0.30001272",
- "css-blank-pseudo": "^2.0.0",
- "css-has-pseudo": "^2.0.0",
- "css-prefers-color-scheme": "^5.0.0",
- "cssdb": "^5.0.0",
- "postcss": "^8.3",
- "postcss-attribute-case-insensitive": "^5.0.0",
- "postcss-color-functional-notation": "^4.0.1",
- "postcss-color-hex-alpha": "^8.0.0",
- "postcss-color-rebeccapurple": "^7.0.0",
- "postcss-custom-media": "^8.0.0",
- "postcss-custom-properties": "^12.0.0",
- "postcss-custom-selectors": "^6.0.0",
- "postcss-dir-pseudo-class": "^6.0.0",
- "postcss-double-position-gradients": "^3.0.1",
- "postcss-env-function": "^4.0.2",
- "postcss-focus-visible": "^6.0.1",
- "postcss-focus-within": "^5.0.1",
- "postcss-font-variant": "^5.0.0",
- "postcss-gap-properties": "^3.0.0",
- "postcss-image-set-function": "^4.0.2",
- "postcss-initial": "^4.0.1",
- "postcss-lab-function": "^4.0.1",
- "postcss-logical": "^5.0.0",
- "postcss-media-minmax": "^5.0.0",
- "postcss-nesting": "^10.0.2",
- "postcss-overflow-shorthand": "^3.0.0",
- "postcss-page-break": "^3.0.4",
- "postcss-place": "^7.0.1",
- "postcss-pseudo-class-any-link": "^7.0.0",
- "postcss-replace-overflow-wrap": "^4.0.0",
- "postcss-selector-not": "^5.0.0"
- }
- },
- "postcss-pseudo-class-any-link": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.0.tgz",
- "integrity": "sha512-Q4KjHlyBo91nvW+wTDZHGYcjtlSSkYwxweMuq1g8+dx1S8qAnedItvHLnbdAAdqJCZP1is5dLqiI8TvfJ+cjVQ==",
- "requires": {
- "postcss-selector-parser": "^6"
- }
- },
- "postcss-replace-overflow-wrap": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
- "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
- "requires": {}
- },
- "postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
- "dev": true
- },
- "postcss-safe-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
- "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-selector-not": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz",
- "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "postcss-selector-parser": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
- "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
- "requires": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- }
- },
- "postcss-sorting": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-7.0.1.tgz",
- "integrity": "sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==",
- "dev": true,
- "requires": {}
- },
- "postcss-value-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
- "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
- },
- "postcss-values-parser": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz",
- "integrity": "sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ==",
- "requires": {
- "flatten": "^1.0.2",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "prefixfree": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prefixfree/-/prefixfree-1.0.0.tgz",
- "integrity": "sha1-grDtu6wQfyo+LcVp1sPfQDXNeRA="
- },
- "prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
- },
- "prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
- "requires": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.8.1"
- }
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "dependencies": {
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- }
- }
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
- },
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
- "dev": true
- },
- "qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "requires": {
- "side-channel": "^1.0.4"
- }
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
- },
- "quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true
- },
- "quote-unquote": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz",
- "integrity": "sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs="
- },
- "ramda": {
- "version": "0.27.1",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
- "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw=="
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- }
- }
- },
- "react": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "react-dom": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "scheduler": "^0.20.2"
- }
- },
- "react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "react-lifecycles-compat": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
- },
- "react-markdown": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-5.0.3.tgz",
- "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==",
- "requires": {
- "@types/mdast": "^3.0.3",
- "@types/unist": "^2.0.3",
- "html-to-react": "^1.3.4",
- "mdast-add-list-metadata": "1.0.1",
- "prop-types": "^15.7.2",
- "react-is": "^16.8.6",
- "remark-parse": "^9.0.0",
- "unified": "^9.0.0",
- "unist-util-visit": "^2.0.0",
- "xtend": "^4.0.1"
- }
- },
- "react-movable": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/react-movable/-/react-movable-3.0.2.tgz",
- "integrity": "sha512-dDDYm3CRnDy8YLXMyyaR2MbcQiTwhPOP+dfl3fZukiI6mN1flVatcjSozT7HXjVk2yHwBC67ZOWGVAmjY6F/dA==",
- "requires": {}
- },
- "react-svg-core": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/react-svg-core/-/react-svg-core-3.0.3.tgz",
- "integrity": "sha512-Ws3eM3xCAwcaYeqm4Ajcz3zxBYNI6BeTWWhFR0cpOT+pWuVtozgHYK9xUM0S/ilapZgYMQDe49XgOxpvooFq4w==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.4.5",
- "@babel/plugin-syntax-jsx": "^7.2.0",
- "@babel/preset-react": "^7.0.0",
- "babel-plugin-react-svg": "^3.0.3",
- "lodash.clonedeep": "^4.5.0",
- "lodash.isplainobject": "^4.0.6",
- "svgo": "^1.2.2"
- }
- },
- "react-svg-loader": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/react-svg-loader/-/react-svg-loader-3.0.3.tgz",
- "integrity": "sha512-V1KnIUtvWVvc4xCig34n+f+/74ylMMugB2FbuAF/yq+QRi+WLi2hUYp9Ze3VylhA1D7ZgRygBh3Ojj8S3TPhJA==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.2.3",
- "react-svg-core": "^3.0.3"
- }
- },
- "react-waypoint": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.1.0.tgz",
- "integrity": "sha512-wiVF0lTslVm27xHbnvUUADUrcDjrQxAp9lEYGExvcoEBScYbXu3Kt++pLrfj6CqOeeRAL4HcX8aANVLSn6bK0Q==",
- "requires": {
- "@babel/runtime": "^7.12.5",
- "consolidated-events": "^1.1.0 || ^2.0.0",
- "prop-types": "^15.0.0",
- "react-is": "^17.0.1"
- },
- "dependencies": {
- "react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
- }
- }
- },
- "read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
- "requires": {
- "pify": "^2.3.0"
- }
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- }
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "rechoir": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
- "requires": {
- "resolve": "^1.9.0"
- }
- },
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- }
- },
- "regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
- },
- "regenerate-unicode-properties": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
- "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
- "requires": {
- "regenerate": "^1.4.2"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
- },
- "regenerator-transform": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
- "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
- "requires": {
- "@babel/runtime": "^7.8.4"
- }
- },
- "regexp.prototype.flags": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
- "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="
- },
- "regexpu-core": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
- "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
- "requires": {
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^9.0.0",
- "regjsgen": "^0.5.2",
- "regjsparser": "^0.7.0",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.0.0"
- }
- },
- "regjsgen": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
- "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
- },
- "regjsparser": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
- "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
- }
- }
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
- },
- "remark-breaks": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.2.tgz",
- "integrity": "sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw==",
- "requires": {
- "@types/mdast": "^3.0.0",
- "unified": "^10.0.0",
- "unist-util-visit": "^4.0.0"
- },
- "dependencies": {
- "bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="
- },
- "is-plain-obj": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz",
- "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw=="
- },
- "trough": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz",
- "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w=="
- },
- "unified": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz",
- "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==",
- "requires": {
- "@types/unist": "^2.0.0",
- "bail": "^2.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^4.0.0",
- "trough": "^2.0.0",
- "vfile": "^5.0.0"
- }
- },
- "unist-util-is": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz",
- "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ=="
- },
- "unist-util-stringify-position": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz",
- "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==",
- "requires": {
- "@types/unist": "^2.0.0"
- }
- },
- "unist-util-visit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz",
- "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^5.0.0",
- "unist-util-visit-parents": "^5.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz",
- "integrity": "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^5.0.0"
- }
- },
- "vfile": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz",
- "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==",
- "requires": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "unist-util-stringify-position": "^3.0.0",
- "vfile-message": "^3.0.0"
- }
- },
- "vfile-message": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz",
- "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^3.0.0"
- }
- }
- }
- },
- "remark-gfm": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
- "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
- "requires": {
- "mdast-util-gfm": "^0.1.0",
- "micromark-extension-gfm": "^0.3.0"
- }
- },
- "remark-parse": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
- "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
- "requires": {
- "mdast-util-from-markdown": "^0.8.0"
- }
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- },
- "resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "requires": {
- "resolve-from": "^5.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
- }
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
- },
- "retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "sass": {
- "version": "1.43.5",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz",
- "integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==",
- "dev": true,
- "requires": {
- "chokidar": ">=3.0.0 <4.0.0"
- }
- },
- "sass-loader": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.3.0.tgz",
- "integrity": "sha512-6l9qwhdOb7qSrtOu96QQ81LVl8v6Dp9j1w3akOm0aWHyrTYtagDt5+kS32N4yq4hHk3M+rdqoRMH+lIdqvW6HA==",
- "dev": true,
- "requires": {
- "klona": "^2.0.4",
- "neo-async": "^2.6.2"
- }
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
- "scheduler": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "schema-utils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
- "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
- "requires": {
- "@types/json-schema": "^7.0.5",
- "ajv": "^6.12.4",
- "ajv-keywords": "^3.5.2"
- }
- },
- "scrollbar-width": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/scrollbar-width/-/scrollbar-width-3.1.1.tgz",
- "integrity": "sha1-xi5j76WTTaw3tD2jT3VQysqERKI="
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
- },
- "selfsigned": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
- "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
- "requires": {
- "node-forge": "^1.2.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- },
- "send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "requires": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- }
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "sentence-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
- "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3",
- "upper-case-first": "^2.0.2"
- }
- },
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- }
- }
- },
- "serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- }
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
- },
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- }
- },
- "signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
- },
- "simple-html-tokenizer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz",
- "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=",
- "dev": true
- },
- "simple-is": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz",
- "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA="
- },
- "simply-uuid": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simply-uuid/-/simply-uuid-1.0.1.tgz",
- "integrity": "sha1-U5JB2BUolpzvI4kvr0WIAF+pmrg="
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- }
- }
- },
- "snake-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
- "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "requires": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "sniffr": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/sniffr/-/sniffr-1.2.0.tgz",
- "integrity": "sha512-k7C0ZcHBU330LcSkKyc2cOOB0uHosME8b2t9qFJqdqB1cKwGmZWd7BVwBz5mWOMJ5dggK1dy2qv+DSwteKLBzQ=="
- },
- "sockjs": {
- "version": "0.3.21",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
- "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
- "requires": {
- "faye-websocket": "^0.11.3",
- "uuid": "^3.4.0",
- "websocket-driver": "^0.7.4"
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
- "source-map-js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
- "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA=="
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
- "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
- "dev": true
- },
- "spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "specificity": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
- "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
- "dev": true
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "dev": true
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "strictdom": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strictdom/-/strictdom-1.0.1.tgz",
- "integrity": "sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA="
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "string.prototype.trimend": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
- "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "string.prototype.trimstart": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
- "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
- },
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- },
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
- },
- "style-inject": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
- "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw=="
- },
- "style-loader": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz",
- "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==",
- "requires": {}
- },
- "style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
- "dev": true
- },
- "stylelint": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.1.0.tgz",
- "integrity": "sha512-IedkssuNVA11+v++2PIV2OHOU5A3SfRcXVi56vZVSsMhGrgtwmmit69jeM+08/Tun5DTBe7BuH1Zp1mMLmtKLA==",
- "dev": true,
- "requires": {
- "balanced-match": "^2.0.0",
- "cosmiconfig": "^7.0.1",
- "debug": "^4.3.2",
- "execall": "^2.0.0",
- "fast-glob": "^3.2.7",
- "fastest-levenshtein": "^1.0.12",
- "file-entry-cache": "^6.0.1",
- "get-stdin": "^8.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.0.4",
- "globjoin": "^0.1.4",
- "html-tags": "^3.1.0",
- "ignore": "^5.1.9",
- "import-lazy": "^4.0.0",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.23.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^9.0.0",
- "micromatch": "^4.0.4",
- "normalize-path": "^3.0.0",
- "normalize-selector": "^0.2.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.3.11",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^6.0.0",
- "postcss-selector-parser": "^6.0.6",
- "postcss-value-parser": "^4.1.0",
- "resolve-from": "^5.0.0",
- "specificity": "^0.4.1",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "style-search": "^0.1.0",
- "svg-tags": "^1.0.0",
- "table": "^6.7.3",
- "v8-compile-cache": "^2.3.0",
- "write-file-atomic": "^3.0.3"
- },
- "dependencies": {
- "balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
- },
- "ignore": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
- "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
- "dev": true
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- }
- }
- },
- "stylelint-config-css-modules": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-css-modules/-/stylelint-config-css-modules-2.3.0.tgz",
- "integrity": "sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==",
- "dev": true,
- "requires": {}
- },
- "stylelint-config-recommended": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz",
- "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==",
- "dev": true,
- "requires": {}
- },
- "stylelint-config-standard": {
- "version": "23.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-23.0.0.tgz",
- "integrity": "sha512-8PDlk+nWuc1T66nVaODTdVodN0pjuE5TBlopi39Lt9EM36YJsRhqttMyUhnS78oc/59Q6n8iw2GJB4QcoFqtRg==",
- "dev": true,
- "requires": {
- "stylelint-config-recommended": "^6.0.0"
- }
- },
- "stylelint-order": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-5.0.0.tgz",
- "integrity": "sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==",
- "dev": true,
- "requires": {
- "postcss": "^8.3.11",
- "postcss-sorting": "^7.0.1"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "svg-inline-loader": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz",
- "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.1.0",
- "object-assign": "^4.0.1",
- "simple-html-tokenizer": "^0.1.1"
- }
- },
- "svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
- "dev": true
- },
- "svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- }
- }
- },
- "tabbable": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.2.1.tgz",
- "integrity": "sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ=="
- },
- "table": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz",
- "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==",
- "dev": true,
- "requires": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "dependencies": {
- "ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- }
- }
- },
- "tapable": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz",
- "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A=="
- },
- "terser": {
- "version": "5.14.2",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
- "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
- "requires": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- }
- }
- },
- "terser-webpack-plugin": {
- "version": "5.2.5",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz",
- "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==",
- "requires": {
- "jest-worker": "^27.0.6",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
- },
- "dependencies": {
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- },
- "traverse": {
- "version": "0.6.6",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
- "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
- },
- "trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true
- },
- "trough": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
- "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
- },
- "ts-loader": {
- "version": "9.2.6",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz",
- "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==",
- "requires": {
- "chalk": "^4.1.0",
- "enhanced-resolve": "^5.0.0",
- "micromatch": "^4.0.0",
- "semver": "^7.3.4"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "enhanced-resolve": {
- "version": "5.8.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz",
- "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==",
- "requires": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
- }
- }
- },
- "tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- },
- "type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "requires": {
- "prelude-ls": "^1.2.1"
- }
- },
- "type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "typescript": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
- "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw=="
- },
- "unbox-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
- "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
- "requires": {
- "function-bind": "^1.1.1",
- "has-bigints": "^1.0.1",
- "has-symbols": "^1.0.2",
- "which-boxed-primitive": "^1.0.2"
- }
- },
- "unicode-canonical-property-names-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
- },
- "unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "requires": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- }
- },
- "unicode-match-property-value-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
- "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw=="
- },
- "unicode-property-aliases-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ=="
- },
- "unified": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
- "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
- "requires": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^2.0.0",
- "trough": "^1.0.0",
- "vfile": "^4.0.0"
- },
- "dependencies": {
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
- }
- }
- },
- "uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
- },
- "unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg=="
- },
- "unist-util-stringify-position": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
- "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
- "requires": {
- "@types/unist": "^2.0.2"
- }
- },
- "unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "dependencies": {
- "unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- }
- }
- },
- "unist-util-visit-parents": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
- "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
- },
- "unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
- "dev": true
- },
- "upper-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
- "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
- "requires": {
- "tslib": "^2.0.3"
- }
- },
- "upper-case-first": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
- "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
- "requires": {
- "tslib": "^2.0.3"
- }
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "url-loader": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
- "requires": {
- "loader-utils": "^2.0.0",
- "mime-types": "^2.1.27",
- "schema-utils": "^3.0.0"
- },
- "dependencies": {
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- }
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- },
- "v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "vfile": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
- "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
- "requires": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0",
- "vfile-message": "^2.0.0"
- }
- },
- "vfile-message": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
- "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "requires": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "webpack": {
- "version": "5.76.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
- "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
- "requires": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^0.0.51",
- "@webassemblyjs/ast": "1.11.1",
- "@webassemblyjs/wasm-edit": "1.11.1",
- "@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.7.6",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.10.0",
- "es-module-lexer": "^0.9.0",
- "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.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "dependencies": {
- "enhanced-resolve": {
- "version": "5.12.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
- "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
- "requires": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- }
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- },
- "tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
- }
- }
- },
- "webpack-cli": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
- "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
- "requires": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.1.0",
- "@webpack-cli/info": "^1.4.0",
- "@webpack-cli/serve": "^1.6.0",
- "colorette": "^2.0.14",
- "commander": "^7.0.0",
- "execa": "^5.0.0",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^2.2.0",
- "rechoir": "^0.7.0",
- "webpack-merge": "^5.7.3"
- },
- "dependencies": {
- "commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
- }
- }
- },
- "webpack-dev-middleware": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
- "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^3.2.2",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.9.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
- "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
- }
- },
- "webpack-dev-server": {
- "version": "4.7.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
- "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
- "requires": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/serve-index": "^1.9.1",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.2.2",
- "ansi-html-community": "^0.0.8",
- "bonjour": "^3.5.0",
- "chokidar": "^3.5.2",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^1.6.0",
- "default-gateway": "^6.0.3",
- "del": "^6.0.0",
- "express": "^4.17.1",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.0",
- "ipaddr.js": "^2.0.1",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "portfinder": "^1.0.28",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.0.0",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.21",
- "spdy": "^4.0.2",
- "strip-ansi": "^7.0.0",
- "webpack-dev-middleware": "^5.3.0",
- "ws": "^8.1.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
- "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- },
- "strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- }
- }
- },
- "webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
- "requires": {
- "clone-deep": "^4.0.1",
- "wildcard": "^2.0.0"
- }
- },
- "webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="
- },
- "websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "requires": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "requires": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- }
- },
- "which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "requires": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
- }
- },
- "which-typed-array": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
- "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
- "requires": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.7"
- }
- },
- "wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw=="
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "ws": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
- "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
- "requires": {}
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
- },
- "yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true
- },
- "zwitch": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
- "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw=="
- }
- }
-}
diff --git a/plugins/base/frontend/package.json b/plugins/base/frontend/package.json
deleted file mode 100644
index 4e07ae6c..00000000
--- a/plugins/base/frontend/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "name": "search",
- "version": "1.0.0",
- "private": true,
- "config": {
- "components": "./src/main/components",
- "dist": "./dist"
- },
- "scripts": {
- "build": "webpack --mode=production --devtool source-map",
- "lint": "eslint . && npm run stylelint",
- "stylelint": "stylelint --ignore-path .gitignore ./src/main/**/*.scss",
- "start": "webpack-dev-server -d --history-api-fallback --inline --hot --colors --port 9010"
- },
- "babel": {
- "presets": [
- [
- "@jetbrains/jetbrains",
- {
- "useBuiltIns": "usage"
- }
- ]
- ]
- },
- "dependencies": {
- "@babel/core": "^7.16.0",
- "@jetbrains/babel-preset-jetbrains": "^2.3.1",
- "@jetbrains/logos": "1.4.27",
- "@jetbrains/ring-ui": "^4.1.3",
- "@types/node": "^16.11.10",
- "@types/react": "^17.0.37",
- "@types/react-dom": "^17.0.11",
- "babel-loader": "^8.2.3",
- "lodash": "^4.17.21",
- "postcss-import": "^14.0.2",
- "postcss-preset-env": "^7.0.1",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
- "ts-loader": "^9.2.6",
- "typescript": "^4.5.2",
- "webpack": "^5.76.0",
- "webpack-cli": "^4.9.1",
- "webpack-dev-server": "^4.6.0"
- },
- "devDependencies": {
- "@babel/eslint-parser": "^7.16.3",
- "@jetbrains/stylelint-config": "^3.0.2",
- "@types/lodash": "^4.14.177",
- "eslint": "^8.3.0",
- "mini-css-extract-plugin": "^2.4.5",
- "react-svg-loader": "^3.0.3",
- "sass": "^1.43.5",
- "sass-loader": "^12.3.0",
- "stylelint": "^14.1.0",
- "svg-inline-loader": "^0.8.2",
- "terser-webpack-plugin": "^5.2.5"
- },
- "engines": {
- "node": ">=16.0.0"
- }
-}
diff --git a/plugins/base/frontend/postcss.config.js b/plugins/base/frontend/postcss.config.js
deleted file mode 100644
index 6e081d88..00000000
--- a/plugins/base/frontend/postcss.config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-module.exports = () => ({
- plugins: [
- require('postcss-import'),
- require('postcss-preset-env')({
- features: {
- stage: 3, // See https://cssdb.org/#staging-process
- features: {
- 'nesting-rules': true,
- 'custom-properties': {
- preserve: true
- }
- }
- }
- })
- ]
-});
diff --git a/plugins/base/frontend/src/main/components/app/index.scss b/plugins/base/frontend/src/main/components/app/index.scss
deleted file mode 100644
index 9bb25de9..00000000
--- a/plugins/base/frontend/src/main/components/app/index.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-/*!
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@import "src/main/scss/index.scss";
-
-html,
-.app-root {
- height: 100%;
-}
-
-.search-root {
- margin: 0;
- padding: 0;
-
- background: var(--ring-content-background-color);
-
- font-family: var(--ring-font-family);
- font-size: var(--ring-font-size);
- line-height: var(--ring-line-height);
-}
-
-.search-content {
- z-index: 8;
-}
-
-@media screen and (max-width: 759px) {
- .search-content {
- }
-}
diff --git a/plugins/base/frontend/src/main/components/app/index.tsx b/plugins/base/frontend/src/main/components/app/index.tsx
deleted file mode 100644
index ea2a2e42..00000000
--- a/plugins/base/frontend/src/main/components/app/index.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import React from 'react';
-import {WithFuzzySearchFilter} from '../search/search';
-import './index.scss';
-
-const App: React.FC = () => {
- return <div className="search-content">
- <WithFuzzySearchFilter/>
- </div>
-}
-
-export default App
diff --git a/plugins/base/frontend/src/main/components/assets/clear.svg b/plugins/base/frontend/src/main/components/assets/clear.svg
deleted file mode 100644
index 5c652c7f..00000000
--- a/plugins/base/frontend/src/main/components/assets/clear.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M11.1374 1.80464L6.94205 5.99996L11.1374 10.1953L10.1947 11.138L5.99935 6.94267L1.80403 11.138L0.861328 10.1953L5.05664 5.99996L0.861328 1.80464L1.80403 0.861938L5.99935 5.05725L10.1947 0.861938L11.1374 1.80464Z" fill="#637282"/>
-</svg>
diff --git a/plugins/base/frontend/src/main/components/assets/searchIcon.svg b/plugins/base/frontend/src/main/components/assets/searchIcon.svg
deleted file mode 100644
index ef5f9c4f..00000000
--- a/plugins/base/frontend/src/main/components/assets/searchIcon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd" clip-rule="evenodd" d="M23.8469 14.8611C22.6607 12.4913 20.2362 10.9961 17.5861 11C14.5427 10.9989 11.8476 12.965 10.9197 15.8634C9.99166 18.7619 11.0436 21.9277 13.5217 23.6944C15.9998 25.4611 19.3356 25.4233 21.7731 23.601L27.8791 29.707L29.2931 28.293L23.1861 22.187C24.7773 20.0677 25.0332 17.2309 23.8469 14.8611ZM22.5861 18C22.5861 20.7614 20.3475 23 17.5861 23C16.26 23 14.9882 22.4732 14.0506 21.5355C13.1129 20.5979 12.5861 19.3261 12.5861 18C12.5861 15.2386 14.8247 13 17.5861 13C20.3475 13 22.5861 15.2386 22.5861 18Z" fill="white"/>
-</svg>
diff --git a/plugins/base/frontend/src/main/components/root.tsx b/plugins/base/frontend/src/main/components/root.tsx
deleted file mode 100644
index 93d070ce..00000000
--- a/plugins/base/frontend/src/main/components/root.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import React from 'react';
-import {render} from 'react-dom';
-
-import App from "./app";
-import './app/index.scss';
-
-
-const renderMainSearch = () => {
- render(<App/>, document.getElementById('searchBar'));
-}
-
-let renderApp = () => {
- renderMainSearch();
-
- document.removeEventListener('DOMContentLoaded', renderApp);
-};
-
-document.addEventListener('DOMContentLoaded', renderApp);
diff --git a/plugins/base/frontend/src/main/components/search/dokkaFuzzyFilter.tsx b/plugins/base/frontend/src/main/components/search/dokkaFuzzyFilter.tsx
deleted file mode 100644
index 0a7edcb3..00000000
--- a/plugins/base/frontend/src/main/components/search/dokkaFuzzyFilter.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import Select from '@jetbrains/ring-ui/components/select/select';
-import {Option, OptionWithHighlightComponent, OptionWithSearchResult} from "./types";
-import fuzzyHighlight from '@jetbrains/ring-ui/components/global/fuzzy-highlight.js'
-import React from "react";
-import {SearchResultRow} from "./searchResultRow";
-import _ from "lodash";
-
-const orderRecords = (records: OptionWithSearchResult[], searchPhrase: string): OptionWithSearchResult[] => {
- return records.sort((a: OptionWithSearchResult, b: OptionWithSearchResult) => {
- //Prefer higher rank
- const byRank = a.rank - b.rank
- if(byRank !== 0){
- return byRank
- }
- //Prefer exact matches
- const aIncludes = a.name.toLowerCase().includes(searchPhrase.toLowerCase()) ? 1 : 0
- const bIncludes = b.name.toLowerCase().includes(searchPhrase.toLowerCase()) ? 1 : 0
- const byIncludes = bIncludes - aIncludes
- if(byIncludes != 0){
- return byIncludes
- }
-
- //Prefer matches that are closer
- const byFirstMatchedPosition = a.highlight.indexOf("**") - b.highlight.indexOf("**")
- if(byFirstMatchedPosition == 0) {
- return a.name.toLowerCase().localeCompare(b.name.toLowerCase())
- }
- return byFirstMatchedPosition
- })
-}
-
-const highlightMatchedPhrases = (records: OptionWithSearchResult[]): OptionWithHighlightComponent[] => {
- // @ts-ignore
- return records.map(record => {
- return {
- ...record,
- template: <SearchResultRow searchResult={record}/>
- }
- })
-}
-export class DokkaFuzzyFilterComponent extends Select {
- componentDidUpdate(prevProps, prevState) {
- super.componentDidUpdate(prevProps, prevState)
- if(this.props.filter && this.state.filterValue != this.props.filter.value){
- this.setState({
- filterValue: this.props.filter.value,
- })
- }
- }
-
- _showPopup(){
- if(this.props.shouldShowPopup){
- if (!this.node) {
- return;
- }
-
- const shownData = this.getListItems(this.filterValue());
- this.setState({
- showPopup: this.props.shouldShowPopup(this.filterValue()),
- shownData
- })
- } else {
- super._showPopup()
- }
- }
-
- getListItems(rawFilterString: string, e: Option[]) {
- const filterPhrase = (rawFilterString ? rawFilterString : '').trim()
- const matchedRecords = this.props.data
- .map((record: Option) => {
- const searched = record.searchKeys.map((value, index) => {
- return {
- ...fuzzyHighlight(filterPhrase, value, false),
- ...record,
- rank: index
- }
- }).filter((e) => e.matched)
-
- const first = _.head(searched)
-
- if(first){
- return first
- }
-
- return {
- matched: false,
- ...record,
- }
-
- })
- .filter((record: OptionWithSearchResult) => record.matched)
-
- this.props.onFilter(filterPhrase)
-
- return highlightMatchedPhrases(orderRecords(matchedRecords, filterPhrase))
- }
-}
diff --git a/plugins/base/frontend/src/main/components/search/dokkaSearchAnchor.tsx b/plugins/base/frontend/src/main/components/search/dokkaSearchAnchor.tsx
deleted file mode 100644
index f7c6cf46..00000000
--- a/plugins/base/frontend/src/main/components/search/dokkaSearchAnchor.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import React from "react";
-import Tooltip from '@jetbrains/ring-ui/components/tooltip/tooltip';
-import SearchIcon from 'react-svg-loader!../assets/searchIcon.svg';
-import {CustomAnchorProps} from "./types";
-import {Hotkey} from "../utils/hotkey";
-
-const HOTKEY_LETTER = 'k'
-const HOTKEY_TOOLTIP_DISPLAY_DELAY = 0.5 * 1000 // seconds
-
-export const DokkaSearchAnchor = ({wrapperProps, buttonProps, popup}: CustomAnchorProps) => {
- const hotkeys = new Hotkey()
- hotkeys.registerHotkeyWithAccel(buttonProps.onClick, HOTKEY_LETTER)
-
- return (
- <span {...wrapperProps}>
- <Tooltip
- title={`${hotkeys.getOsAccelKeyName()} + ${HOTKEY_LETTER.toUpperCase()}`}
- delay={HOTKEY_TOOLTIP_DISPLAY_DELAY}
- popupProps={{className: "search-hotkey-popup"}}
- >
- <button type="button" {...buttonProps}>
- <SearchIcon/>
- </button>
- </Tooltip>
- {popup}
- </span>
- )
-}
diff --git a/plugins/base/frontend/src/main/components/search/search.scss b/plugins/base/frontend/src/main/components/search/search.scss
deleted file mode 100644
index 6dd07d5b..00000000
--- a/plugins/base/frontend/src/main/components/search/search.scss
+++ /dev/null
@@ -1,118 +0,0 @@
-/*!
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-$font-color: hsla(0, 0%, 100%, 0.8);
-$secondary-font-color: hsla(0, 0%, 100%, 0.6);
-
-#pages-search {
- cursor: pointer;
- border: none;
- border-radius: 50%;
- background: transparent;
- fill: #fff;
- fill: var(--dark-mode-and-search-icon-color);
-
- &:focus {
- outline: none;
- }
-
- &:hover {
- background: var(--white-10);
- }
-}
-
-.search {
- &, [data-test="ring-select"], [data-test="ring-tooltip"], [data-test="ring-select_focus"], #pages-search {
- display: inline-block;
- padding: 0;
- margin: 0;
- font-size: 0;
- line-height: 0;
- }
-}
-
-.search-hotkey-popup {
- background-color: var(--background-color) !important;
- padding: 4px;
-}
-
-.popup-wrapper {
- min-width: calc(100% - 322px) !important;
-
- border: 1px solid hsla(0, 0%, 100%, 0.2) !important;
-
- background-color: #27282c !important;
-
- [class^="filterWrapper"] {
- border-bottom: 1px solid hsla(0, 0%, 100%, 0.2);
- }
-
- input {
- color: $font-color !important;
-
- font-weight: normal !important;
- }
-
- span[data-test-custom="ring-select-popup-filter-icon"] {
- color: #fff;
- }
-
- button[data-test="ring-input-clear"] {
- color: #fff !important;
- }
-}
-
-@media screen and (max-width: 759px) {
- .popup-wrapper {
- min-width: 100% !important;
- }
-}
-
-.template-wrapper {
- display: grid;
-
- height: 32px;
- grid-template-columns: auto auto;
-
- strong {
- color: $font-color;
- }
-
- span {
- color: $font-color;
-
- line-height: 32px;
-
- &.template-description {
- color: $secondary-font-color;
- justify-self: end;
- }
- }
-}
-
-@media screen and (max-width: 759px) {
- .template-wrapper {
- display: flex;
- flex-direction: column;
-
- height: auto;
-
- span {
- line-height: unset;
- }
- }
-}
-
-.template-name {
- justify-self: start;
-}
-
-/* remove fade at the bottom */
-[class^="fade"] {
- display: none;
-}
-
-[class*="hover"] {
- background-color: hsla(0, 0%, 100%, 0.1) !important;
-}
diff --git a/plugins/base/frontend/src/main/components/search/search.tsx b/plugins/base/frontend/src/main/components/search/search.tsx
deleted file mode 100644
index 24545671..00000000
--- a/plugins/base/frontend/src/main/components/search/search.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import React, {useCallback, useEffect, useState} from 'react';
-import List from '@jetbrains/ring-ui/components/list/list';
-import Select from '@jetbrains/ring-ui/components/select/select';
-import '@jetbrains/ring-ui/components/input-size/input-size.css';
-import './search.scss';
-import {CustomAnchorProps, IWindow, Option, Props} from "./types";
-import {DokkaSearchAnchor} from "./dokkaSearchAnchor";
-import {DokkaFuzzyFilterComponent} from "./dokkaFuzzyFilter";
-import {relativizeUrlForRequest} from '../utils/requests';
-
-const WithFuzzySearchFilterComponent: React.FC<Props> = ({ data }: Props) => {
- const [selected, onSelected] = useState<Option>(data[0]);
- const onChangeSelected = useCallback(
- (option: Option) => {
- window.location.replace(`${(window as IWindow).pathToRoot}${option.location}?query=${option.name}`)
- onSelected(option);
- },
- [data]
- );
-
- return (
- <div className="search-container">
- <div className="search">
- <DokkaFuzzyFilterComponent
- id="pages-search"
- selectedLabel="Search"
- label="Please type page name"
- filter={true}
- type={Select.Type.CUSTOM}
- clear
- renderOptimization
- disableScrollToActive
- selected={selected}
- data={data}
- popupClassName={"popup-wrapper"}
- onSelect={onChangeSelected}
- customAnchor={({ wrapperProps, buttonProps, popup }: CustomAnchorProps) =>
- <DokkaSearchAnchor wrapperProps={wrapperProps} buttonProps={buttonProps} popup={popup} />
- }
- />
- </div>
- </div>
- )
-}
-
-export const WithFuzzySearchFilter = () => {
- const [navigationList, setNavigationList] = useState<Option[]>([]);
-
- useEffect(() => {
- fetch(relativizeUrlForRequest('scripts/pages.json'))
- .then(response => response.json())
- .then((result) => {
- setNavigationList(result.map((record: Option, idx: number) => {
- return {
- ...record,
- label: record.name,
- key: idx,
- type: record.kind,
- rgItemType: List.ListProps.Type.CUSTOM
- }
- }))
- },
- (error) => {
- console.error('failed to fetch pages data', error)
- setNavigationList([])
- })
- }, [])
-
- return <WithFuzzySearchFilterComponent data={navigationList} />;
-};
diff --git a/plugins/base/frontend/src/main/components/search/searchResultRow.tsx b/plugins/base/frontend/src/main/components/search/searchResultRow.tsx
deleted file mode 100644
index e8b91519..00000000
--- a/plugins/base/frontend/src/main/components/search/searchResultRow.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import React from "react";
-import {OptionWithSearchResult, SearchProps} from "./types";
-import _ from "lodash";
-
-type HighlighterProps = {
- label: string
-}
-
-const Highlighter: React.FC<HighlighterProps> = ({label}: HighlighterProps) => {
- return <strong>{label}</strong>
-}
-
-export const signatureFromSearchResult = (searchResult: OptionWithSearchResult): string => {
- return searchResult.name.replace(searchResult.searchKeys[searchResult.rank], searchResult.highlight)
-}
-
-export const SearchResultRow: React.FC<SearchProps> = ({searchResult}: SearchProps) => {
- /*
- This is a work-around for an issue: https://youtrack.jetbrains.com/issue/RG-2108
- */
- const out = _.chunk(signatureFromSearchResult(searchResult).split('**'), 2).flatMap(([txt, label]) => [
- txt,
- label ? <Highlighter label={label}></Highlighter> : null,
- ]);
-
- return (
- <div className="template-wrapper">
- <span>{out}</span>
- <span className="template-description">{searchResult.description}</span>
- </div>
- )
-}
diff --git a/plugins/base/frontend/src/main/components/search/types.ts b/plugins/base/frontend/src/main/components/search/types.ts
deleted file mode 100644
index 3e390dde..00000000
--- a/plugins/base/frontend/src/main/components/search/types.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import React, {ButtonHTMLAttributes, HTMLAttributes, ReactNode, RefCallback} from "react";
-
-export type Page = {
- name: string;
- kind: string;
- location: string;
- searchKeys: string[];
- description: string;
-}
-
-export type Option = Page & {
- label: string;
- key: number;
- location: string;
- name: string;
-}
-
-export type IWindow = typeof window & {
- pathToRoot: string
- pages: Page[]
-}
-
-export type Props = {
- data: Option[]
-};
-
-export type OptionWithSearchResult = Option & {
- matched: boolean,
- highlight: string,
- rank: number
-}
-
-export type OptionWithHighlightComponent = Option & {
- name: React.FC<SearchProps>
-}
-
-export type SearchProps = {
- searchResult: OptionWithSearchResult,
-}
-
-export interface DataTestProps {
- 'data-test'?: string | null | undefined
-}
-
-export interface CustomAnchorProps {
- wrapperProps: HTMLAttributes<HTMLElement> & DataTestProps & {ref: RefCallback<HTMLElement>}
- buttonProps: Pick<ButtonHTMLAttributes<HTMLButtonElement>, 'id' | 'disabled' | 'children'> &
- {onClick: () => void} &
- DataTestProps,
- popup: ReactNode
-}
diff --git a/plugins/base/frontend/src/main/components/utils/hotkey.ts b/plugins/base/frontend/src/main/components/utils/hotkey.ts
deleted file mode 100644
index ae813166..00000000
--- a/plugins/base/frontend/src/main/components/utils/hotkey.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import {detectOsKind, OsKind} from "./os";
-
-type ModifierKey = {
- name: string
- keyArg: string
-}
-
-class ModifierKeys {
- static metaKey: ModifierKey = {name: "Command", keyArg: "Meta"}
- static ctrlKey: ModifierKey = {name: "Ctrl", keyArg: "Control"}
- static altKey: ModifierKey = {name: "Alt", keyArg: "Alt"}
- static shiftKey: ModifierKey = {name: "Shift", keyArg: "Shift"}
-}
-
-const setOfKeys = [ModifierKeys.altKey, ModifierKeys.shiftKey, ModifierKeys.ctrlKey, ModifierKeys.metaKey]
-
-export class Hotkey {
- private readonly osKind: OsKind;
-
- constructor() {
- this.osKind = detectOsKind()
- }
-
- public getOsAccelKeyName() {
- return this.getOsAccelKey().name
- }
-
- /**
- * Register a hotkey of combination Accel key (Cmd/Ctrl depending on OS).
- * The method also checks that other modifiers key is not pressed to avoid shortcuts intersection.
- * E.g. don't trigger [Ctrl+K] if [Ctrl + Shift + K] pressed
- */
- public registerHotkeyWithAccel = (event: () => void, letter: string) => {
- const osMetaKey = this.getOsAccelKey()
- document.onkeydown = (keyDownEvent) => {
- const isMetaKeyPressed = keyDownEvent.getModifierState(osMetaKey.keyArg)
- const isOtherModifierKeyPressed = setOfKeys
- .filter(key => key !== osMetaKey)
- .map((otherKeys: ModifierKey) => keyDownEvent.getModifierState(otherKeys.keyArg))
- .some(value => value)
-
- if (isMetaKeyPressed && !isOtherModifierKeyPressed && keyDownEvent.key === letter) {
- keyDownEvent.preventDefault()
- event()
- }
- };
- }
-
- private getOsAccelKey(): ModifierKey {
- switch (this.osKind) {
- case OsKind.MACOS:
- return ModifierKeys.metaKey
- default:
- return ModifierKeys.ctrlKey
- }
- }
-}
-
diff --git a/plugins/base/frontend/src/main/components/utils/os.ts b/plugins/base/frontend/src/main/components/utils/os.ts
deleted file mode 100644
index 6130ef67..00000000
--- a/plugins/base/frontend/src/main/components/utils/os.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-export enum OsKind{
- WINDOWS,
- MACOS,
- LINUX,
- OTHER
-}
-
-export const detectOsKind = (): OsKind => {
- const userAgent = navigator.userAgent
- if(userAgent.includes("Mac")) return OsKind.MACOS
- else if (userAgent.includes("Win")) return OsKind.WINDOWS
- else if (userAgent.includes("Linux")) return OsKind.LINUX
- else return OsKind.OTHER
-}
diff --git a/plugins/base/frontend/src/main/components/utils/requests.tsx b/plugins/base/frontend/src/main/components/utils/requests.tsx
deleted file mode 100644
index 568c331b..00000000
--- a/plugins/base/frontend/src/main/components/utils/requests.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import {IWindow} from "../search/types"
-
-export const relativizeUrlForRequest = (filePath: string) : string => {
- const pathToRoot = (window as IWindow).pathToRoot
- const relativePath = pathToRoot == "" ? "." : pathToRoot
- return relativePath.endsWith('/') ? `${relativePath}${filePath}` : `${relativePath}/${filePath}`
-}
diff --git a/plugins/base/frontend/src/main/scss/index.scss b/plugins/base/frontend/src/main/scss/index.scss
deleted file mode 100644
index b68d57f3..00000000
--- a/plugins/base/frontend/src/main/scss/index.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@import "~@jetbrains/ring-ui/components/global/variables.css";
-
-$white: #FFFFFF;
-$grey-border: #DADFE6;
-$list-background-hover: rgba(91, 93, 239, 0.15);
-$hover-link-color: #5B5DEF;
diff --git a/plugins/base/frontend/src/main/types/@jetbrains/index.d.ts b/plugins/base/frontend/src/main/types/@jetbrains/index.d.ts
deleted file mode 100644
index 58472d01..00000000
--- a/plugins/base/frontend/src/main/types/@jetbrains/index.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-declare module '@jetbrains/ring-ui' {
- export const Tooltip: any;
- export const Select: any;
- export const List: any;
-}
diff --git a/plugins/base/frontend/stylelint.config.js b/plugins/base/frontend/stylelint.config.js
deleted file mode 100644
index 23c951f0..00000000
--- a/plugins/base/frontend/stylelint.config.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-module.exports = {
- extends: '@jetbrains/stylelint-config',
- rules: {}
-};
diff --git a/plugins/base/frontend/tsconfig.json b/plugins/base/frontend/tsconfig.json
deleted file mode 100644
index 0f0a4555..00000000
--- a/plugins/base/frontend/tsconfig.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "compilerOptions": {
- "sourceMap": true,
- "target": "es5",
- "lib": [
- "dom",
- "dom.iterable",
- "esnext",
- "es2019"
- ],
- "noImplicitAny": true,
- "allowJs": true,
- "skipLibCheck": true,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "module": "esnext",
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "noEmit": true,
- "jsx": "react",
- "typeRoots": [
- "src/main/types"
- ]
- },
- "include": [
- "./node_modules/@types/node/globals.d.ts"
- ]
-}
diff --git a/plugins/base/frontend/webpack.config.js b/plugins/base/frontend/webpack.config.js
deleted file mode 100644
index 59e71dbc..00000000
--- a/plugins/base/frontend/webpack.config.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-const {join, resolve} = require('path');
-
-const ringUiWebpackConfig = require('@jetbrains/ring-ui/webpack.config');
-const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-const TerserPlugin = require("terser-webpack-plugin");
-
-const pkgConfig = require('./package.json').config;
-
-const componentsPath = join(__dirname, pkgConfig.components);
-
-const webpackConfig = () => ({
- entry: `${componentsPath}/root.tsx`,
- resolve: {
- mainFields: ['module', 'browser', 'main'],
- extensions: ['.tsx', '.ts', '.js', '.svg'],
- alias: {
- react: resolve('./node_modules/react'),
- 'react-dom': resolve('./node_modules/react-dom'),
- '@jetbrains/ring-ui': resolve('./node_modules/@jetbrains/ring-ui')
- }
- },
- output: {
- path: resolve(__dirname, pkgConfig.dist),
- filename: '[name].js',
- publicPath: '',
- devtoolModuleFilenameTemplate: '/[absolute-resource-path]'
- },
- module: {
- rules: [
- ...ringUiWebpackConfig.config.module.rules,
- {
- test: /\.s[ac]ss$/i,
- use: [
- MiniCssExtractPlugin.loader,
- 'css-loader',
- 'sass-loader',
- ],
- include: componentsPath,
- exclude: ringUiWebpackConfig.componentsPath,
- },
- {
- test: /\.tsx?$/,
- use: [
- {
- loader: 'ts-loader',
- options: {
- transpileOnly: true
- }
- }
- ]
- },
- {
- test: /\.svg$/,
- loader: require.resolve('svg-inline-loader'),
- options: {removeSVGTagAttrs: false},
- include: [require('@jetbrains/icons')]
- }
- ]
- },
- plugins: [
- new MiniCssExtractPlugin({
- // Options similar to the same options in webpackOptions.output
- // both options are optional
- filename: '[name].css',
- chunkFilename: '[id].css',
- }),
- ],
- optimization: {
- minimize: true,
- minimizer: [new TerserPlugin({
- extractComments: false,
- })],
- },
- output: {
- path: __dirname + '/dist/'
- }
-});
-
-module.exports = webpackConfig;
diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt
deleted file mode 100644
index ca86d4d5..00000000
--- a/plugins/base/src/main/kotlin/DokkaBase.kt
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.generation.SingleModuleGeneration
-import org.jetbrains.dokka.base.renderers.*
-import org.jetbrains.dokka.base.renderers.html.*
-import org.jetbrains.dokka.base.renderers.html.command.consumers.PathToRootConsumer
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ReplaceVersionsConsumer
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ResolveLinkConsumer
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.external.javadoc.JavadocExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.base.signatures.KotlinSignatureProvider
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer
-import org.jetbrains.dokka.base.transformers.documentables.*
-import org.jetbrains.dokka.base.transformers.pages.DefaultSamplesTransformer
-import org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinTransformer
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
-import org.jetbrains.dokka.base.transformers.pages.merger.*
-import org.jetbrains.dokka.base.transformers.pages.sourcelinks.SourceLinksTransformer
-import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider
-import org.jetbrains.dokka.base.transformers.pages.tags.SinceKotlinTagContentProvider
-import org.jetbrains.dokka.base.translators.documentables.DefaultDocumentableToPageTranslator
-import org.jetbrains.dokka.generation.Generation
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.renderers.Renderer
-import org.jetbrains.dokka.transformers.documentation.*
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-@Suppress("unused")
-public class DokkaBase : DokkaPlugin() {
-
- public val preMergeDocumentableTransformer: ExtensionPoint<PreMergeDocumentableTransformer> by extensionPoint()
- public val pageMergerStrategy: ExtensionPoint<PageMergerStrategy> by extensionPoint()
- public val commentsToContentConverter: ExtensionPoint<CommentsToContentConverter> by extensionPoint()
- public val customTagContentProvider: ExtensionPoint<CustomTagContentProvider> by extensionPoint()
- public val signatureProvider: ExtensionPoint<SignatureProvider> by extensionPoint()
- public val locationProviderFactory: ExtensionPoint<LocationProviderFactory> by extensionPoint()
- public val externalLocationProviderFactory: ExtensionPoint<ExternalLocationProviderFactory> by extensionPoint()
- public val outputWriter: ExtensionPoint<OutputWriter> by extensionPoint()
- public val htmlPreprocessors: ExtensionPoint<PageTransformer> by extensionPoint()
-
- @Deprecated("It is not used anymore")
- public val tabSortingStrategy: ExtensionPoint<TabSortingStrategy> by extensionPoint()
- public val immediateHtmlCommandConsumer: ExtensionPoint<ImmediateHtmlCommandConsumer> by extensionPoint()
-
-
- public val singleGeneration: Extension<Generation, *, *> by extending {
- CoreExtensions.generation providing ::SingleModuleGeneration
- }
-
- public val documentableMerger: Extension<DocumentableMerger, *, *> by extending {
- CoreExtensions.documentableMerger providing ::DefaultDocumentableMerger
- }
-
- public val deprecatedDocumentableFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::DeprecatedDocumentableFilterTransformer
- }
-
- public val suppressedDocumentableFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::SuppressedByConfigurationDocumentableFilterTransformer
- }
-
- public val suppressedBySuppressTagDocumentableFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::SuppressTagDocumentableFilter
- }
-
- public val documentableVisibilityFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::DocumentableVisibilityFilterTransformer
- }
-
- public val obviousFunctionsVisbilityFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::ObviousFunctionsDocumentableFilterTransformer
- }
-
- public val inheritedEntriesVisbilityFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::InheritedEntriesDocumentableFilterTransformer
- }
-
- public val kotlinArrayDocumentableReplacer: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::KotlinArrayDocumentableReplacerTransformer
- }
-
- public val emptyPackagesFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::EmptyPackagesFilterTransformer order {
- after(
- deprecatedDocumentableFilter,
- suppressedDocumentableFilter,
- documentableVisibilityFilter,
- suppressedBySuppressTagDocumentableFilter,
- obviousFunctionsVisbilityFilter,
- inheritedEntriesVisbilityFilter,
- )
- }
- }
-
- public val emptyModulesFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer with EmptyModulesFilterTransformer() order {
- after(emptyPackagesFilter)
- }
- }
-
- public val modulesAndPackagesDocumentation: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- preMergeDocumentableTransformer providing ::ModuleAndPackageDocumentationTransformer
- }
-
- public val actualTypealiasAdder: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer with ActualTypealiasAdder()
- }
-
- public val kotlinSignatureProvider: Extension<SignatureProvider, *, *> by extending {
- signatureProvider providing ::KotlinSignatureProvider
- }
-
- public val sinceKotlinTransformer: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer providing ::SinceKotlinTransformer applyIf {
- SinceKotlinTransformer.shouldDisplaySinceKotlin()
- } order {
- before(extensionsExtractor)
- }
- }
-
- public val inheritorsExtractor: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer with InheritorsExtractorTransformer()
- }
-
- public val undocumentedCodeReporter: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer with ReportUndocumentedTransformer()
- }
-
- public val extensionsExtractor: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer with ExtensionExtractorTransformer()
- }
-
- public val documentableToPageTranslator: Extension<DocumentableToPageTranslator, *, *> by extending {
- CoreExtensions.documentableToPageTranslator providing ::DefaultDocumentableToPageTranslator
- }
-
- public val docTagToContentConverter: Extension<CommentsToContentConverter, *, *> by extending {
- commentsToContentConverter with DocTagToContentConverter()
- }
-
- public val sinceKotlinTagContentProvider: Extension<CustomTagContentProvider, *, *> by extending {
- customTagContentProvider with SinceKotlinTagContentProvider applyIf {
- SinceKotlinTransformer.shouldDisplaySinceKotlin()
- }
- }
-
- public val pageMerger: Extension<PageTransformer, *, *> by extending {
- CoreExtensions.pageTransformer providing ::PageMerger
- }
-
- public val sourceSetMerger: Extension<PageTransformer, *, *> by extending {
- CoreExtensions.pageTransformer providing ::SourceSetMergingPageTransformer
- }
-
- public val fallbackMerger: Extension<PageMergerStrategy, *, *> by extending {
- pageMergerStrategy providing { ctx -> FallbackPageMergerStrategy(ctx.logger) }
- }
-
- public val sameMethodNameMerger: Extension<PageMergerStrategy, *, *> by extending {
- pageMergerStrategy providing { ctx -> SameMethodNamePageMergerStrategy(ctx.logger) } order {
- before(fallbackMerger)
- }
- }
-
- public val htmlRenderer: Extension<Renderer, *, *> by extending {
- CoreExtensions.renderer providing ::HtmlRenderer
- }
-
- public val locationProvider: Extension<LocationProviderFactory, *, *> by extending {
- locationProviderFactory providing ::DokkaLocationProviderFactory
- }
-
- public val javadocLocationProvider: Extension<ExternalLocationProviderFactory, *, *> by extending {
- externalLocationProviderFactory providing ::JavadocExternalLocationProviderFactory
- }
-
- public val dokkaLocationProvider: Extension<ExternalLocationProviderFactory, *, *> by extending {
- externalLocationProviderFactory providing ::DefaultExternalLocationProviderFactory
- }
-
- public val fileWriter: Extension<OutputWriter, *, *> by extending {
- outputWriter providing ::FileWriter
- }
-
- public val rootCreator: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors with RootCreator applyIf { !delayTemplateSubstitution }
- }
-
- public val defaultSamplesTransformer: Extension<PageTransformer, *, *> by extending {
- CoreExtensions.pageTransformer providing ::DefaultSamplesTransformer order {
- before(pageMerger)
- }
- }
-
- public val sourceLinksTransformer: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing ::SourceLinksTransformer order { after(rootCreator) }
- }
-
- public val navigationPageInstaller: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing ::NavigationPageInstaller order { after(rootCreator) }
- }
-
- public val scriptsInstaller: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing ::ScriptsInstaller order { after(rootCreator) }
- }
-
- public val stylesInstaller: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing ::StylesInstaller order { after(rootCreator) }
- }
-
- public val assetsInstaller: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors with AssetsInstaller order { after(rootCreator) } applyIf { !delayTemplateSubstitution }
- }
-
- public val customResourceInstaller: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing { ctx -> CustomResourceInstaller(ctx) } order {
- after(stylesInstaller)
- after(scriptsInstaller)
- after(assetsInstaller)
- }
- }
-
- public val packageListCreator: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing {
- PackageListCreator(it, RecognizedLinkFormat.DokkaHtml)
- } order { after(rootCreator) }
- }
-
- public val sourcesetDependencyAppender: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing ::SourcesetDependencyAppender order { after(rootCreator) }
- }
-
- public val resolveLinkConsumer: Extension<ImmediateHtmlCommandConsumer, *, *> by extending {
- immediateHtmlCommandConsumer with ResolveLinkConsumer
- }
- public val replaceVersionConsumer: Extension<ImmediateHtmlCommandConsumer, *, *> by extending {
- immediateHtmlCommandConsumer providing ::ReplaceVersionsConsumer
- }
- public val pathToRootConsumer: Extension<ImmediateHtmlCommandConsumer, *, *> by extending {
- immediateHtmlCommandConsumer with PathToRootConsumer
- }
- public val baseSearchbarDataInstaller: Extension<PageTransformer, *, *> by extending {
- htmlPreprocessors providing ::SearchbarDataInstaller order { after(sourceLinksTransformer) }
- }
-
- //<editor-fold desc="Deprecated API left for compatibility">
- @Suppress("DEPRECATION_ERROR")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val kotlinAnalysis: ExtensionPoint<org.jetbrains.dokka.analysis.KotlinAnalysis> by extensionPoint()
-
- @Suppress("DEPRECATION_ERROR")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val externalDocumentablesProvider: ExtensionPoint<org.jetbrains.dokka.base.translators.descriptors.ExternalDocumentablesProvider> by extensionPoint()
-
- @Suppress("DEPRECATION_ERROR")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val externalClasslikesTranslator: ExtensionPoint<org.jetbrains.dokka.base.translators.descriptors.ExternalClasslikesTranslator> by extensionPoint()
-
- @Suppress("DeprecatedCallableAddReplaceWith")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val descriptorToDocumentableTranslator: org.jetbrains.dokka.plugability.Extension<org.jetbrains.dokka.transformers.sources.SourceToDocumentableTranslator, *, *>
- get() = throw org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError()
-
- @Suppress("DeprecatedCallableAddReplaceWith")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val psiToDocumentableTranslator: org.jetbrains.dokka.plugability.Extension<org.jetbrains.dokka.transformers.sources.SourceToDocumentableTranslator, *, *>
- get() = throw org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError()
-
- @Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val defaultKotlinAnalysis: org.jetbrains.dokka.plugability.Extension<org.jetbrains.dokka.analysis.KotlinAnalysis, *, *>
- get() = throw org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError()
-
- @Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val defaultExternalDocumentablesProvider: org.jetbrains.dokka.plugability.Extension<org.jetbrains.dokka.base.translators.descriptors.ExternalDocumentablesProvider, *, *>
- get() = throw org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError()
-
- @Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith")
- @Deprecated(message = org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val defaultExternalClasslikesTranslator: org.jetbrains.dokka.plugability.Extension<org.jetbrains.dokka.base.translators.descriptors.ExternalClasslikesTranslator, *, *>
- get() = throw org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError()
- //</editor-fold>
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/base/src/main/kotlin/DokkaBaseConfiguration.kt b/plugins/base/src/main/kotlin/DokkaBaseConfiguration.kt
deleted file mode 100644
index 34195f65..00000000
--- a/plugins/base/src/main/kotlin/DokkaBaseConfiguration.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base
-
-import org.jetbrains.dokka.plugability.ConfigurableBlock
-import java.io.File
-import java.time.Year
-
-public data class DokkaBaseConfiguration(
- var customStyleSheets: List<File> = defaultCustomStyleSheets,
- var customAssets: List<File> = defaultCustomAssets,
- var separateInheritedMembers: Boolean = separateInheritedMembersDefault,
- var footerMessage: String = defaultFooterMessage,
- var mergeImplicitExpectActualDeclarations: Boolean = mergeImplicitExpectActualDeclarationsDefault,
- var templatesDir: File? = defaultTemplatesDir,
- var homepageLink: String? = null,
-) : ConfigurableBlock {
- public companion object {
- public val defaultFooterMessage: String = "© ${Year.now().value} Copyright"
- public val defaultCustomStyleSheets: List<File> = emptyList()
- public val defaultCustomAssets: List<File> = emptyList()
- public const val separateInheritedMembersDefault: Boolean = false
- public const val mergeImplicitExpectActualDeclarationsDefault: Boolean = false
- public val defaultTemplatesDir: File? = null
- }
-}
diff --git a/plugins/base/src/main/kotlin/deprecated/AnalysisApiDeprecatedError.kt b/plugins/base/src/main/kotlin/deprecated/AnalysisApiDeprecatedError.kt
deleted file mode 100644
index 52280b3e..00000000
--- a/plugins/base/src/main/kotlin/deprecated/AnalysisApiDeprecatedError.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.deprecated
-
-import org.jetbrains.dokka.InternalDokkaApi
-
-// TODO all API that mentions this message or error can be removed in Dokka >= 2.1
-
-internal const val ANALYSIS_API_DEPRECATION_MESSAGE =
- "Dokka's Analysis API has been reworked. Please, see the following issue for details and migration options: " +
- "https://github.com/Kotlin/dokka/issues/3099"
-
-@InternalDokkaApi
-public class AnalysisApiDeprecatedError : Error(ANALYSIS_API_DEPRECATION_MESSAGE)
diff --git a/plugins/base/src/main/kotlin/deprecated/KotlinAnalysisDeprecatedApi.kt b/plugins/base/src/main/kotlin/deprecated/KotlinAnalysisDeprecatedApi.kt
deleted file mode 100644
index 1d9e7e9f..00000000
--- a/plugins/base/src/main/kotlin/deprecated/KotlinAnalysisDeprecatedApi.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@file:Suppress("PackageDirectoryMismatch", "FunctionName", "UNUSED_PARAMETER", "unused", "DEPRECATION_ERROR",
- "DeprecatedCallableAddReplaceWith", "unused"
-)
-
-package org.jetbrains.dokka.analysis
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE
-import org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.utilities.DokkaLogger
-import java.io.Closeable
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public abstract class KotlinAnalysis(
- private val parent: KotlinAnalysis? = null
-) : Closeable {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public operator fun get(key: DokkaConfiguration.DokkaSourceSet): AnalysisContext = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public operator fun get(key: DokkaSourceSetID): AnalysisContext = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- protected abstract fun find(sourceSetID: DokkaSourceSetID): AnalysisContext?
-}
-
-public class AnalysisContext(environment: Any, facade: Any, private val analysisEnvironment: Any) : Closeable {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val environment: Any get() = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public val facade: Any get() = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public operator fun component1(): Any = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public operator fun component2(): Any = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- override fun close() { throw AnalysisApiDeprecatedError() }
-}
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public class DokkaAnalysisConfiguration(public val ignoreCommonBuiltIns: Boolean = false)
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public fun KotlinAnalysis(context: DokkaContext): KotlinAnalysis = throw AnalysisApiDeprecatedError()
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public fun KotlinAnalysis(
- sourceSets: List<DokkaConfiguration.DokkaSourceSet>,
- logger: DokkaLogger,
- analysisConfiguration: DokkaAnalysisConfiguration = DokkaAnalysisConfiguration()
-): KotlinAnalysis = throw AnalysisApiDeprecatedError()
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public fun ProjectKotlinAnalysis(
- sourceSets: List<DokkaConfiguration.DokkaSourceSet>,
- logger: DokkaLogger,
- analysisConfiguration: DokkaAnalysisConfiguration = DokkaAnalysisConfiguration()
-): KotlinAnalysis = throw AnalysisApiDeprecatedError()
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public fun SamplesKotlinAnalysis(
- sourceSets: List<DokkaConfiguration.DokkaSourceSet>,
- logger: DokkaLogger,
- projectKotlinAnalysis: KotlinAnalysis,
- analysisConfiguration: DokkaAnalysisConfiguration = DokkaAnalysisConfiguration()
-): KotlinAnalysis = throw AnalysisApiDeprecatedError()
-
diff --git a/plugins/base/src/main/kotlin/deprecated/ParsersDeprecatedAPI.kt b/plugins/base/src/main/kotlin/deprecated/ParsersDeprecatedAPI.kt
deleted file mode 100644
index 55b1daab..00000000
--- a/plugins/base/src/main/kotlin/deprecated/ParsersDeprecatedAPI.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@file:Suppress("PackageDirectoryMismatch", "DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith", "unused")
-
-package org.jetbrains.dokka.base.parsers
-
-import org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE
-import org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.doc.DocTag
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.model.doc.TagWrapper
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public abstract class Parser {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public open fun parseStringToDocNode(extractedString: String): DocTag = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public open fun preparse(text: String): String = throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public open fun parseTagWithBody(tagName: String, content: String): TagWrapper = throw AnalysisApiDeprecatedError()
-}
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public open class MarkdownParser(
- private val externalDri: (String) -> DRI?,
- private val kdocLocation: String?,
-) : Parser() {
- public companion object {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public fun parseFromKDocTag(
- @Suppress("UNUSED_PARAMETER") kDocTag: Any?,
- @Suppress("UNUSED_PARAMETER") externalDri: (String) -> DRI?,
- @Suppress("UNUSED_PARAMETER") kdocLocation: String?,
- @Suppress("UNUSED_PARAMETER") parseWithChildren: Boolean = true
- ): DocumentationNode = throw AnalysisApiDeprecatedError()
- }
-}
diff --git a/plugins/base/src/main/kotlin/deprecated/ParsersFactoriesDeprecatedAPI.kt b/plugins/base/src/main/kotlin/deprecated/ParsersFactoriesDeprecatedAPI.kt
deleted file mode 100644
index 7b84803c..00000000
--- a/plugins/base/src/main/kotlin/deprecated/ParsersFactoriesDeprecatedAPI.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@file:Suppress("DeprecatedCallableAddReplaceWith", "PackageDirectoryMismatch", "unused")
-
-package org.jetbrains.dokka.base.parsers.factories
-
-import org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE
-import org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.doc.DocTag
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public object DocTagsFromStringFactory {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public fun getInstance(
- @Suppress("UNUSED_PARAMETER") name: String,
- @Suppress("UNUSED_PARAMETER") children: List<DocTag> = emptyList(),
- @Suppress("UNUSED_PARAMETER") params: Map<String, String> = emptyMap(),
- @Suppress("UNUSED_PARAMETER") body: String? = null,
- @Suppress("UNUSED_PARAMETER") dri: DRI? = null,
- ): DocTag = throw AnalysisApiDeprecatedError()
-}
diff --git a/plugins/base/src/main/kotlin/deprecated/TranslatorDescriptorsDeprecatedAPI.kt b/plugins/base/src/main/kotlin/deprecated/TranslatorDescriptorsDeprecatedAPI.kt
deleted file mode 100644
index 87d82ccf..00000000
--- a/plugins/base/src/main/kotlin/deprecated/TranslatorDescriptorsDeprecatedAPI.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@file:Suppress("PackageDirectoryMismatch", "DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith", "unused")
-
-package org.jetbrains.dokka.base.translators.descriptors
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE
-import org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DClasslike
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.sources.AsyncSourceToDocumentableTranslator
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public fun interface ExternalDocumentablesProvider {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public fun findClasslike(dri: DRI, sourceSet: DokkaConfiguration.DokkaSourceSet): DClasslike?
-}
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public class DefaultExternalDocumentablesProvider(
- @Suppress("UNUSED_PARAMETER") context: DokkaContext
-) : ExternalDocumentablesProvider {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- override fun findClasslike(dri: DRI, sourceSet: DokkaConfiguration.DokkaSourceSet): DClasslike =
- throw AnalysisApiDeprecatedError()
-}
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public fun interface ExternalClasslikesTranslator {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- public fun translateClassDescriptor(descriptor: Any, sourceSet: DokkaConfiguration.DokkaSourceSet): DClasslike
-}
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public class DefaultDescriptorToDocumentableTranslator(
- private val context: DokkaContext
-) : AsyncSourceToDocumentableTranslator, ExternalClasslikesTranslator {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- override suspend fun invokeSuspending(sourceSet: DokkaConfiguration.DokkaSourceSet, context: DokkaContext, ): DModule =
- throw AnalysisApiDeprecatedError()
-
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- override fun translateClassDescriptor(descriptor: Any, sourceSet: DokkaConfiguration.DokkaSourceSet): DClasslike =
- throw AnalysisApiDeprecatedError()
-}
diff --git a/plugins/base/src/main/kotlin/deprecated/TranslatorPsiDeprecatedAPI.kt b/plugins/base/src/main/kotlin/deprecated/TranslatorPsiDeprecatedAPI.kt
deleted file mode 100644
index 1906a7b1..00000000
--- a/plugins/base/src/main/kotlin/deprecated/TranslatorPsiDeprecatedAPI.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@file:Suppress("PackageDirectoryMismatch", "DeprecatedCallableAddReplaceWith", "unused")
-
-package org.jetbrains.dokka.base.translators.psi
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.deprecated.ANALYSIS_API_DEPRECATION_MESSAGE
-import org.jetbrains.dokka.base.deprecated.AnalysisApiDeprecatedError
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.sources.AsyncSourceToDocumentableTranslator
-
-@Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
-public class DefaultPsiToDocumentableTranslator(
- @Suppress("UNUSED_PARAMETER") context: DokkaContext,
-) : AsyncSourceToDocumentableTranslator {
- @Deprecated(message = ANALYSIS_API_DEPRECATION_MESSAGE, level = DeprecationLevel.ERROR)
- override suspend fun invokeSuspending(
- sourceSet: DokkaConfiguration.DokkaSourceSet,
- context: DokkaContext,
- ): DModule = throw AnalysisApiDeprecatedError()
-}
diff --git a/plugins/base/src/main/kotlin/generation/SingleModuleGeneration.kt b/plugins/base/src/main/kotlin/generation/SingleModuleGeneration.kt
deleted file mode 100644
index 8ea109b9..00000000
--- a/plugins/base/src/main/kotlin/generation/SingleModuleGeneration.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.generation
-
-import kotlinx.coroutines.*
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaException
-import org.jetbrains.dokka.Timer
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.generation.Generation
-import org.jetbrains.dokka.generation.exitGenerationGracefully
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.transformers.sources.AsyncSourceToDocumentableTranslator
-import org.jetbrains.dokka.utilities.parallelMap
-import org.jetbrains.dokka.utilities.report
-
-public class SingleModuleGeneration(private val context: DokkaContext) : Generation {
-
- override fun Timer.generate() {
- report("Validity check")
- validityCheck(context)
-
- // Step 1: translate sources into documentables & transform documentables (change internally)
- report("Creating documentation models")
- val modulesFromPlatforms = createDocumentationModels()
-
- report("Transforming documentation model before merging")
- val transformedDocumentationBeforeMerge = transformDocumentationModelBeforeMerge(modulesFromPlatforms)
-
- report("Merging documentation models")
- val transformedDocumentationAfterMerge = mergeDocumentationModels(transformedDocumentationBeforeMerge)
- ?: exitGenerationGracefully("Nothing to document")
-
- report("Transforming documentation model after merging")
- val transformedDocumentation = transformDocumentationModelAfterMerge(transformedDocumentationAfterMerge)
-
- // Step 2: Generate pages & transform them (change internally)
- report("Creating pages")
- val pages = createPages(transformedDocumentation)
-
- report("Transforming pages")
- val transformedPages = transformPages(pages)
-
- // Step 3: Rendering
- report("Rendering")
- render(transformedPages)
-
- report("Running post-actions")
- runPostActions()
-
- reportAfterRendering()
- }
-
- override val generationName: String = "documentation for ${context.configuration.moduleName}"
-
- /**
- * Implementation note: it runs in a separated single thread due to existing support of coroutines (see #2936)
- */
- @OptIn(DelicateCoroutinesApi::class, ExperimentalCoroutinesApi::class)
- public fun createDocumentationModels(): List<DModule> = newSingleThreadContext("Generating documentable model").use { coroutineContext -> // see https://github.com/Kotlin/dokka/issues/3151
- runBlocking(coroutineContext) {
- context.configuration.sourceSets.parallelMap { sourceSet -> translateSources(sourceSet, context) }.flatten()
- .also { modules -> if (modules.isEmpty()) exitGenerationGracefully("Nothing to document") }
- }
- }
-
-
- public fun transformDocumentationModelBeforeMerge(modulesFromPlatforms: List<DModule>): List<DModule> {
- return context.plugin<DokkaBase>()
- .query { preMergeDocumentableTransformer }
- .fold(modulesFromPlatforms) { acc, t -> t(acc) }
- }
-
- public fun mergeDocumentationModels(modulesFromPlatforms: List<DModule>): DModule? =
- context.single(CoreExtensions.documentableMerger).invoke(modulesFromPlatforms)
-
- public fun transformDocumentationModelAfterMerge(documentationModel: DModule): DModule =
- context[CoreExtensions.documentableTransformer].fold(documentationModel) { acc, t -> t(acc, context) }
-
- public fun createPages(transformedDocumentation: DModule): RootPageNode =
- context.single(CoreExtensions.documentableToPageTranslator).invoke(transformedDocumentation)
-
- public fun transformPages(pages: RootPageNode): RootPageNode =
- context[CoreExtensions.pageTransformer].fold(pages) { acc, t -> t(acc) }
-
- public fun render(transformedPages: RootPageNode) {
- context.single(CoreExtensions.renderer).render(transformedPages)
- }
-
- public fun runPostActions() {
- context[CoreExtensions.postActions].forEach { it() }
- }
-
- public fun validityCheck(context: DokkaContext) {
- val (preGenerationCheckResult, checkMessages) = context[CoreExtensions.preGenerationCheck].fold(
- Pair(true, emptyList<String>())
- ) { acc, checker -> checker() + acc }
- if (!preGenerationCheckResult) throw DokkaException(
- "Pre-generation validity check failed: ${checkMessages.joinToString(",")}"
- )
- }
-
- public fun reportAfterRendering() {
- context.unusedPoints.takeIf { it.isNotEmpty() }?.also {
- context.logger.info("Unused extension points found: ${it.joinToString(", ")}")
- }
-
- context.logger.report()
-
- if (context.configuration.failOnWarning && (context.logger.warningsCount > 0 || context.logger.errorsCount > 0)) {
- throw DokkaException(
- "Failed with warningCount=${context.logger.warningsCount} and errorCount=${context.logger.errorsCount}"
- )
- }
- }
-
- private suspend fun translateSources(sourceSet: DokkaConfiguration.DokkaSourceSet, context: DokkaContext) =
- context[CoreExtensions.sourceToDocumentableTranslator].parallelMap { translator ->
- when (translator) {
- is AsyncSourceToDocumentableTranslator -> translator.invokeSuspending(sourceSet, context)
- else -> translator.invoke(sourceSet, context)
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt
deleted file mode 100644
index eed7794e..00000000
--- a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.jetbrains.dokka.DokkaException
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.renderers.Renderer
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public abstract class DefaultRenderer<T>(
- protected val context: DokkaContext
-) : Renderer {
-
- protected val outputWriter: OutputWriter = context.plugin<DokkaBase>().querySingle { outputWriter }
-
- protected lateinit var locationProvider: LocationProvider
- private set
-
- protected open val preprocessors: Iterable<PageTransformer> = emptyList()
-
- public abstract fun T.buildHeader(level: Int, node: ContentHeader, content: T.() -> Unit)
- public abstract fun T.buildLink(address: String, content: T.() -> Unit)
- public abstract fun T.buildList(
- node: ContentList,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- )
-
- public abstract fun T.buildLineBreak()
- public open fun T.buildLineBreak(node: ContentBreakLine, pageContext: ContentPage) {
- buildLineBreak()
- }
-
- public abstract fun T.buildResource(node: ContentEmbeddedResource, pageContext: ContentPage)
- public abstract fun T.buildTable(
- node: ContentTable,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- )
-
- public abstract fun T.buildText(textNode: ContentText)
- public abstract fun T.buildNavigation(page: PageNode)
-
- public abstract fun buildPage(page: ContentPage, content: (T, ContentPage) -> Unit): String
- public abstract fun buildError(node: ContentNode)
-
- public open fun T.buildPlatformDependent(
- content: PlatformHintedContent,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildContentNode(content.inner, pageContext)
- }
-
- public open fun T.buildGroup(
- node: ContentGroup,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- wrapGroup(node, pageContext) { node.children.forEach { it.build(this, pageContext, sourceSetRestriction) } }
- }
-
- public open fun T.buildDivergent(node: ContentDivergentGroup, pageContext: ContentPage) {
- node.children.forEach { it.build(this, pageContext) }
- }
-
- public open fun T.wrapGroup(node: ContentGroup, pageContext: ContentPage, childrenCallback: T.() -> Unit) {
- childrenCallback()
- }
-
- public open fun T.buildText(
- nodes: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- nodes.forEach { it.build(this, pageContext, sourceSetRestriction) }
- }
-
- public open fun T.buildCodeBlock(code: ContentCodeBlock, pageContext: ContentPage) {
- code.children.forEach { it.build(this, pageContext) }
- }
-
- public open fun T.buildCodeInline(code: ContentCodeInline, pageContext: ContentPage) {
- code.children.forEach { it.build(this, pageContext) }
- }
-
- public open fun T.buildHeader(
- node: ContentHeader,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- buildHeader(node.level, node) { node.children.forEach { it.build(this, pageContext, sourceSetRestriction) } }
- }
-
- public open fun ContentNode.build(
- builder: T,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- builder.buildContentNode(this, pageContext, sourceSetRestriction)
- }
-
- public fun T.buildContentNode(
- node: ContentNode,
- pageContext: ContentPage,
- sourceSetRestriction: DisplaySourceSet
- ) {
- buildContentNode(node, pageContext, setOf(sourceSetRestriction))
- }
-
- public open fun T.buildContentNode(
- node: ContentNode,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- if (sourceSetRestriction.isNullOrEmpty() || node.sourceSets.any { it in sourceSetRestriction }) {
- when (node) {
- is ContentText -> buildText(node)
- is ContentHeader -> buildHeader(node, pageContext, sourceSetRestriction)
- is ContentCodeBlock -> buildCodeBlock(node, pageContext)
- is ContentCodeInline -> buildCodeInline(node, pageContext)
- is ContentDRILink -> buildDRILink(node, pageContext, sourceSetRestriction)
- is ContentResolvedLink -> buildResolvedLink(node, pageContext, sourceSetRestriction)
- is ContentEmbeddedResource -> buildResource(node, pageContext)
- is ContentList -> buildList(node, pageContext, sourceSetRestriction)
- is ContentTable -> buildTable(node, pageContext, sourceSetRestriction)
- is ContentGroup -> buildGroup(node, pageContext, sourceSetRestriction)
- is ContentBreakLine -> buildLineBreak(node, pageContext)
- is PlatformHintedContent -> buildPlatformDependent(node, pageContext, sourceSetRestriction)
- is ContentDivergentGroup -> buildDivergent(node, pageContext)
- is ContentDivergentInstance -> buildDivergentInstance(node, pageContext)
- else -> buildError(node)
- }
- }
- }
-
- public open fun T.buildDRILink(
- node: ContentDRILink,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- locationProvider.resolve(node.address, node.sourceSets, pageContext)?.let { address ->
- buildLink(address) {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- } ?: buildText(node.children, pageContext, sourceSetRestriction)
- }
-
- public open fun T.buildResolvedLink(
- node: ContentResolvedLink,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildLink(node.address) {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- }
-
- public open fun T.buildDivergentInstance(node: ContentDivergentInstance, pageContext: ContentPage) {
- node.before?.build(this, pageContext)
- node.divergent.build(this, pageContext)
- node.after?.build(this, pageContext)
- }
-
- public open fun buildPageContent(context: T, page: ContentPage) {
- context.buildNavigation(page)
- page.content.build(context, page)
- }
-
- public open suspend fun renderPage(page: PageNode) {
- val path by lazy {
- locationProvider.resolve(page, skipExtension = true)
- ?: throw DokkaException("Cannot resolve path for ${page.name}")
- }
- when (page) {
- is ContentPage -> outputWriter.write(path, buildPage(page) { c, p -> buildPageContent(c, p) }, ".html")
- is RendererSpecificPage -> when (val strategy = page.strategy) {
- is RenderingStrategy.Copy -> outputWriter.writeResources(strategy.from, path)
- is RenderingStrategy.Write -> outputWriter.write(path, strategy.text, "")
- is RenderingStrategy.Callback -> outputWriter.write(path, strategy.instructions(this, page), ".html")
- is RenderingStrategy.DriLocationResolvableWrite -> outputWriter.write(
- path,
- strategy.contentToResolve { dri, sourcesets ->
- locationProvider.resolve(dri, sourcesets)
- },
- ""
- )
- is RenderingStrategy.PageLocationResolvableWrite -> outputWriter.write(
- path,
- strategy.contentToResolve { pageToLocate, context ->
- locationProvider.resolve(pageToLocate, context)
- },
- ""
- )
- RenderingStrategy.DoNothing -> Unit
- }
- else -> throw AssertionError(
- "Page ${page.name} cannot be rendered by renderer as it is not renderer specific nor contains content"
- )
- }
- }
-
- private suspend fun renderPages(root: PageNode) {
- coroutineScope {
- renderPage(root)
-
- root.children.forEach {
- launch { renderPages(it) }
- }
- }
- }
-
- override fun render(root: RootPageNode) {
- val newRoot = preprocessors.fold(root) { acc, t -> t(acc) }
-
- locationProvider =
- context.plugin<DokkaBase>().querySingle { locationProviderFactory }.getLocationProvider(newRoot)
-
- runBlocking(Dispatchers.Default) {
- renderPages(newRoot)
- }
- }
-
- protected fun ContentDivergentGroup.groupDivergentInstances(
- pageContext: ContentPage,
- beforeTransformer: (ContentDivergentInstance, ContentPage, DisplaySourceSet) -> String,
- afterTransformer: (ContentDivergentInstance, ContentPage, DisplaySourceSet) -> String
- ): Map<SerializedBeforeAndAfter, List<InstanceWithSource>> =
- children.flatMap { instance ->
- instance.sourceSets.map { sourceSet ->
- Pair(instance, sourceSet) to Pair(
- beforeTransformer(instance, pageContext, sourceSet),
- afterTransformer(instance, pageContext, sourceSet)
- )
- }
- }.groupBy(
- Pair<InstanceWithSource, SerializedBeforeAndAfter>::second,
- Pair<InstanceWithSource, SerializedBeforeAndAfter>::first
- )
-}
-
-internal typealias SerializedBeforeAndAfter = Pair<String, String>
-internal typealias InstanceWithSource = Pair<ContentDivergentInstance, DisplaySourceSet>
-
-public fun ContentPage.sourceSets(): Set<DisplaySourceSet> = this.content.sourceSets
diff --git a/plugins/base/src/main/kotlin/renderers/FileWriter.kt b/plugins/base/src/main/kotlin/renderers/FileWriter.kt
deleted file mode 100644
index 1a1c3b42..00000000
--- a/plugins/base/src/main/kotlin/renderers/FileWriter.kt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.sync.Mutex
-import kotlinx.coroutines.sync.withLock
-import kotlinx.coroutines.withContext
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.io.File
-import java.io.IOException
-import java.net.URI
-import java.nio.file.*
-
-public class FileWriter(
- public val context: DokkaContext
-): OutputWriter {
- private val createdFiles: MutableSet<String> = mutableSetOf()
- private val createdFilesMutex = Mutex()
- private val jarUriPrefix = "jar:file:"
- private val root = context.configuration.outputDir
-
- override suspend fun write(path: String, text: String, ext: String) {
- if (checkFileCreated(path)) return
-
- try {
- val dir = Paths.get(root.absolutePath, path.dropLastWhile { it != '/' }).toFile()
- withContext(Dispatchers.IO) {
- dir.mkdirsOrFail()
- Files.write(Paths.get(root.absolutePath, "$path$ext"), text.lines())
- }
- } catch (e: Throwable) {
- context.logger.error("Failed to write $this. ${e.message}")
- e.printStackTrace()
- }
- }
-
- private suspend fun checkFileCreated(path: String): Boolean = createdFilesMutex.withLock {
- if (createdFiles.contains(path)) {
- context.logger.error("An attempt to write ${root}/$path several times!")
- return true
- }
- createdFiles.add(path)
- return false
- }
-
- override suspend fun writeResources(pathFrom: String, pathTo: String) {
- if (javaClass.getResource(pathFrom)?.toURI()?.toString()?.startsWith(jarUriPrefix) == true) {
- copyFromJar(pathFrom, pathTo)
- } else {
- copyFromDirectory(pathFrom, pathTo)
- }
- }
-
-
- private suspend fun copyFromDirectory(pathFrom: String, pathTo: String) {
- val dest = Paths.get(root.path, pathTo).toFile()
- val uri = javaClass.getResource(pathFrom)?.toURI()
- val file = uri?.let { File(it) } ?: File(pathFrom)
- withContext(Dispatchers.IO) {
- file.copyRecursively(dest, true)
- }
- }
-
- private suspend fun copyFromJar(pathFrom: String, pathTo: String) {
- val rebase = fun(path: String) =
- "$pathTo/${path.removePrefix(pathFrom)}"
- val dest = Paths.get(root.path, pathTo).toFile()
- if(dest.isDirectory){
- dest.mkdirsOrFail()
- } else {
- dest.parentFile.mkdirsOrFail()
- }
- val uri = javaClass.getResource(pathFrom).toURI()
- val fs = getFileSystemForURI(uri)
- val path = fs.getPath(pathFrom)
- for (file in Files.walk(path).iterator()) {
- if (Files.isDirectory(file)) {
- val dirPath = file.toAbsolutePath().toString()
- withContext(Dispatchers.IO) {
- Paths.get(root.path, rebase(dirPath)).toFile().mkdirsOrFail()
- }
- } else {
- val filePath = file.toAbsolutePath().toString()
- withContext(Dispatchers.IO) {
- Paths.get(root.path, rebase(filePath)).toFile().writeBytes(
- this@FileWriter.javaClass.getResourceAsStream(filePath).use { it?.readBytes() }
- ?: throw IllegalStateException("Can not get a resource from $filePath")
- )
- }
- }
- }
- }
-
- private fun File.mkdirsOrFail() {
- if (!mkdirs() && !exists()) {
- throw IOException("Failed to create directory $this")
- }
- }
-
- private fun getFileSystemForURI(uri: URI): FileSystem =
- try {
- FileSystems.newFileSystem(uri, emptyMap<String, Any>())
- } catch (e: FileSystemAlreadyExistsException) {
- FileSystems.getFileSystem(uri)
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/OutputWriter.kt b/plugins/base/src/main/kotlin/renderers/OutputWriter.kt
deleted file mode 100644
index 3fdd1802..00000000
--- a/plugins/base/src/main/kotlin/renderers/OutputWriter.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-public interface OutputWriter {
-
- public suspend fun write(path: String, text: String, ext: String)
- public suspend fun writeResources(pathFrom: String, pathTo: String)
-}
diff --git a/plugins/base/src/main/kotlin/renderers/PackageListService.kt b/plugins/base/src/main/kotlin/renderers/PackageListService.kt
deleted file mode 100644
index 3ed6cd21..00000000
--- a/plugins/base/src/main/kotlin/renderers/PackageListService.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.shared.LinkFormat
-import org.jetbrains.dokka.base.resolvers.shared.PackageList.Companion.DOKKA_PARAM_PREFIX
-import org.jetbrains.dokka.base.resolvers.shared.PackageList.Companion.MODULE_DELIMITER
-import org.jetbrains.dokka.base.resolvers.shared.PackageList.Companion.SINGLE_MODULE_NAME
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-
-public class PackageListService(
- public val context: DokkaContext,
- public val rootPage: RootPageNode
-) {
-
- public fun createPackageList(module: ModulePage, format: LinkFormat): String {
-
- val packages = mutableSetOf<String>()
- val nonStandardLocations = mutableMapOf<String, String>()
-
- val locationProvider =
- context.plugin<DokkaBase>().querySingle { locationProviderFactory }.getLocationProvider(rootPage)
-
- fun visit(node: PageNode) {
- if (node is PackagePage) {
- node.name
- .takeUnless { name -> name.startsWith("[") && name.endsWith("]") } // Do not include the package name for declarations without one
- ?.let { packages.add(it) }
- }
-
- val contentPage = node as? ContentPage
- contentPage?.dri?.forEach { dri ->
- val nodeLocation = locationProvider.resolve(node, context = module, skipExtension = true)
- ?: run { context.logger.error("Cannot resolve path for ${node.name}!"); null }
-
- if (dri != DRI.topLevel && locationProvider.expectedLocationForDri(dri) != nodeLocation) {
- nonStandardLocations[dri.toString()] = "$nodeLocation.${format.linkExtension}"
- }
- }
-
- node.children.forEach { visit(it) }
- }
-
- visit(module)
- return renderPackageList(
- nonStandardLocations = nonStandardLocations,
- modules = mapOf(SINGLE_MODULE_NAME to packages),
- format = format.formatName,
- linkExtension = format.linkExtension
- )
- }
-
- public companion object {
- public fun renderPackageList(
- nonStandardLocations: Map<String, String>,
- modules: Map<String, Set<String>>,
- format: String,
- linkExtension: String
- ): String = buildString {
- appendLine("$DOKKA_PARAM_PREFIX.format:${format}")
- appendLine("$DOKKA_PARAM_PREFIX.linkExtension:${linkExtension}")
- nonStandardLocations.map { (signature, location) ->
- "$DOKKA_PARAM_PREFIX.location:$signature\u001f$location"
- }.sorted().joinTo(this, separator = "\n", postfix = "\n")
-
- modules.mapNotNull { (module, packages) ->
- ("$MODULE_DELIMITER$module\n".takeIf { module != SINGLE_MODULE_NAME }.orEmpty() +
- packages.filter(String::isNotBlank).sorted().joinToString(separator = "\n"))
- .takeIf { packages.isNotEmpty() }
- }.joinTo(this, separator = "\n", postfix = "\n")
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/TabSortingStrategy.kt b/plugins/base/src/main/kotlin/renderers/TabSortingStrategy.kt
deleted file mode 100644
index 665b6717..00000000
--- a/plugins/base/src/main/kotlin/renderers/TabSortingStrategy.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import org.jetbrains.dokka.pages.ContentNode
-
-public interface TabSortingStrategy {
- public fun <T: ContentNode> sort(tabs: Collection<T>) : List<T>
-}
diff --git a/plugins/base/src/main/kotlin/renderers/contentTypeChecking.kt b/plugins/base/src/main/kotlin/renderers/contentTypeChecking.kt
deleted file mode 100644
index 0fcb0efb..00000000
--- a/plugins/base/src/main/kotlin/renderers/contentTypeChecking.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import org.jetbrains.dokka.base.renderers.HtmlFileExtensions.imageExtensions
-import org.jetbrains.dokka.pages.ContentEmbeddedResource
-import java.io.File
-
-public fun ContentEmbeddedResource.isImage(): Boolean {
- return File(address).extension.toLowerCase() in imageExtensions
-}
-
-public val String.URIExtension: String
- get() = substringBefore('?').substringAfterLast('.')
-
-public fun String.isImage(): Boolean =
- URIExtension in imageExtensions
-
-public object HtmlFileExtensions {
- public val imageExtensions: Set<String> = setOf("png", "jpg", "jpeg", "gif", "bmp", "tif", "webp", "svg")
-}
-
diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlContent.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlContent.kt
deleted file mode 100644
index 1ef6e04c..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/HtmlContent.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import org.jetbrains.dokka.pages.ContentBreakLine
-import org.jetbrains.dokka.pages.Style
-
-
-/**
- * Html-specific style that represents <hr> tag if used in conjunction with [ContentBreakLine]
- */
-internal object HorizontalBreakLineStyle : Style {
- // this exists as a simple internal solution to avoid introducing unnecessary public API on content level.
- // If you have the need to implement proper horizontal divider (i.e to support `---` markdown element),
- // consider removing this and providing proper API for all formats and levels
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
deleted file mode 100644
index 083876d5..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
+++ /dev/null
@@ -1,1013 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import kotlinx.html.*
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.*
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
-import org.jetbrains.dokka.base.renderers.html.innerTemplating.DefaultTemplateModelFactory
-import org.jetbrains.dokka.base.renderers.html.innerTemplating.DefaultTemplateModelMerger
-import org.jetbrains.dokka.base.renderers.html.innerTemplating.DokkaTemplateTypes
-import org.jetbrains.dokka.base.renderers.html.innerTemplating.HtmlTemplater
-import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
-import org.jetbrains.dokka.base.resolvers.local.DokkaBaseLocationProvider
-import org.jetbrains.dokka.base.templating.*
-import org.jetbrains.dokka.base.transformers.documentables.CallableExtensions
-import org.jetbrains.dokka.base.translators.documentables.shouldDocumentConstructors
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.pages.HtmlContent
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jetbrains.dokka.utilities.htmlEscape
-
-internal const val TEMPLATE_REPLACEMENT: String = "###"
-internal const val TOGGLEABLE_CONTENT_TYPE_ATTR = "data-togglable"
-
-public open class HtmlRenderer(
- context: DokkaContext
-) : DefaultRenderer<FlowContent>(context) {
- private val sourceSetDependencyMap: Map<DokkaSourceSetID, List<DokkaSourceSetID>> =
- context.configuration.sourceSets.associate { sourceSet ->
- sourceSet.sourceSetID to context.configuration.sourceSets
- .map { it.sourceSetID }
- .filter { it in sourceSet.dependentSourceSets }
- }
-
- private val templateModelFactories = listOf(DefaultTemplateModelFactory(context)) // TODO: Make extension point
- private val templateModelMerger = DefaultTemplateModelMerger()
- private val templater = HtmlTemplater(context).apply {
- setupSharedModel(templateModelMerger.invoke(templateModelFactories) { buildSharedModel() })
- }
-
- private var shouldRenderSourceSetTabs: Boolean = false
-
- override val preprocessors: List<PageTransformer> = context.plugin<DokkaBase>().query { htmlPreprocessors }
-
- /**
- * Tabs themselves are created in HTML plugin since, currently, only HTML format supports them.
- * [TabbedContentType] is used to mark content that should be inside tab content.
- * A tab can display multiple [TabbedContentType].
- * The content style [ContentStyle.TabbedContent] is used to determine where tabs will be generated.
- *
- * @see TabbedContentType
- * @see ContentStyle.TabbedContent
- */
- private fun createTabs(pageContext: ContentPage): List<ContentTab> {
- return when(pageContext) {
- is ClasslikePage -> createTabsForClasslikes(pageContext)
- is PackagePage -> createTabsForPackage(pageContext)
- else -> throw IllegalArgumentException("Page ${pageContext.name} cannot have tabs")
- }
- }
-
- private fun createTabsForClasslikes(page: ClasslikePage): List<ContentTab> {
- val documentables = page.documentables
- val csEnum = documentables.filterIsInstance<DEnum>()
- val csWithConstructor = documentables.filterIsInstance<WithConstructors>()
- val scopes = documentables.filterIsInstance<WithScope>()
- val constructorsToDocumented = csWithConstructor.flatMap { it.constructors }
-
- val containsRenderableConstructors = constructorsToDocumented.isNotEmpty() && documentables.shouldDocumentConstructors()
- val containsRenderableMembers =
- containsRenderableConstructors || scopes.any { it.classlikes.isNotEmpty() || it.functions.isNotEmpty() || it.properties.isNotEmpty() }
-
- @Suppress("UNCHECKED_CAST")
- val extensions = (documentables as List<WithExtraProperties<DClasslike>>).flatMap {
- it.extra[CallableExtensions]?.extensions
- ?.filterIsInstance<Documentable>().orEmpty()
- }
- .distinctBy { it.sourceSets to it.dri } // [Documentable] has expensive equals/hashCode at the moment, see #2620
- return listOfNotNull(
- if(!containsRenderableMembers) null else
- ContentTab(
- "Members",
- listOf(
- BasicTabbedContentType.CONSTRUCTOR,
- BasicTabbedContentType.TYPE,
- BasicTabbedContentType.PROPERTY,
- BasicTabbedContentType.FUNCTION
- )
- ),
- if (extensions.isEmpty()) null else ContentTab(
- "Members & Extensions",
- listOf(
- BasicTabbedContentType.CONSTRUCTOR,
- BasicTabbedContentType.TYPE,
- BasicTabbedContentType.PROPERTY,
- BasicTabbedContentType.FUNCTION,
- BasicTabbedContentType.EXTENSION_PROPERTY,
- BasicTabbedContentType.EXTENSION_FUNCTION
- )
- ),
- if(csEnum.isEmpty()) null else ContentTab(
- "Entries",
- listOf(
- BasicTabbedContentType.ENTRY
- )
- )
- )
- }
-
- private fun createTabsForPackage(page: PackagePage): List<ContentTab> {
- val p = page.documentables.single() as DPackage
- return listOfNotNull(
- if (p.typealiases.isEmpty() && p.classlikes.isEmpty()) null else ContentTab(
- "Types",
- listOf(
- BasicTabbedContentType.TYPE,
- )
- ),
- if (p.functions.isEmpty()) null else ContentTab(
- "Functions",
- listOf(
- BasicTabbedContentType.FUNCTION,
- BasicTabbedContentType.EXTENSION_FUNCTION,
- )
- ),
- if (p.properties.isEmpty()) null else ContentTab(
- "Properties",
- listOf(
- BasicTabbedContentType.PROPERTY,
- BasicTabbedContentType.EXTENSION_PROPERTY,
- )
- )
- )
- }
-
- private fun <R> TagConsumer<R>.prepareForTemplates() =
- if (context.configuration.delayTemplateSubstitution || this is ImmediateResolutionTagConsumer) this
- else ImmediateResolutionTagConsumer(this, context)
-
- override fun FlowContent.wrapGroup(
- node: ContentGroup,
- pageContext: ContentPage,
- childrenCallback: FlowContent.() -> Unit
- ) {
- val additionalClasses = node.style.joinToString(" ") { it.toString().toLowerCase() }
- return when {
- node.hasStyle(ContentStyle.TabbedContent) -> div(additionalClasses) {
- val contentTabs = createTabs(pageContext)
-
- div(classes = "tabs-section") {
- attributes["tabs-section"] = "tabs-section"
- contentTabs.forEachIndexed { index, contentTab ->
- button(classes = "section-tab") {
- if (index == 0) attributes["data-active"] = ""
- attributes[TOGGLEABLE_CONTENT_TYPE_ATTR] =
- contentTab.tabbedContentTypes.joinToString(",") { it.toHtmlAttribute() }
- text(contentTab.text)
- }
- }
- }
- div(classes = "tabs-section-body") {
- childrenCallback()
- }
- }
- node.hasStyle(ContentStyle.WithExtraAttributes) -> div {
- node.extra.extraHtmlAttributes().forEach { attributes[it.extraKey] = it.extraValue }
- childrenCallback()
- }
- node.dci.kind in setOf(ContentKind.Symbol) -> div("symbol $additionalClasses") {
- childrenCallback()
- }
- node.hasStyle(ContentStyle.KDocTag) -> span("kdoc-tag") { childrenCallback() }
- node.hasStyle(ContentStyle.Footnote) -> div("footnote") { childrenCallback() }
- node.hasStyle(TextStyle.BreakableAfter) -> {
- span { childrenCallback() }
- wbr { }
- }
- node.hasStyle(TextStyle.Breakable) -> {
- span("breakable-word") { childrenCallback() }
- }
- node.hasStyle(TextStyle.Span) -> span { childrenCallback() }
- node.dci.kind == ContentKind.Symbol -> div("symbol $additionalClasses") {
- childrenCallback()
- }
- node.dci.kind == SymbolContentKind.Parameters -> {
- span("parameters $additionalClasses") {
- childrenCallback()
- }
- }
- node.dci.kind == SymbolContentKind.Parameter -> {
- span("parameter $additionalClasses") {
- childrenCallback()
- }
- }
- node.hasStyle(TextStyle.InlineComment) -> div("inline-comment") { childrenCallback() }
- node.dci.kind == ContentKind.BriefComment -> div("brief $additionalClasses") { childrenCallback() }
- node.dci.kind == ContentKind.Cover -> div("cover $additionalClasses") { //TODO this can be removed
- childrenCallback()
- }
- node.dci.kind == ContentKind.Deprecation -> div("deprecation-content") { childrenCallback() }
- node.hasStyle(TextStyle.Paragraph) -> p(additionalClasses) { childrenCallback() }
- node.hasStyle(TextStyle.Block) -> div(additionalClasses) {
- childrenCallback()
- }
- node.hasStyle(TextStyle.Quotation) -> blockQuote(additionalClasses) { childrenCallback() }
- node.hasStyle(TextStyle.FloatingRight) -> span("clearfix") { span("floating-right") { childrenCallback() } }
- node.hasStyle(TextStyle.Strikethrough) -> strike { childrenCallback() }
- node.isAnchorable -> buildAnchor(
- node.anchor!!,
- node.anchorLabel!!,
- node.buildSourceSetFilterValues()
- ) { childrenCallback() }
- node.extra[InsertTemplateExtra] != null -> node.extra[InsertTemplateExtra]?.let { templateCommand(it.command) }
- ?: Unit
- node.hasStyle(ListStyle.DescriptionTerm) -> DT(emptyMap(), consumer).visit {
- this@wrapGroup.childrenCallback()
- }
- node.hasStyle(ListStyle.DescriptionDetails) -> DD(emptyMap(), consumer).visit {
- this@wrapGroup.childrenCallback()
- }
- node.extra.extraTabbedContentType() != null -> div() {
- node.extra.extraTabbedContentType()?.let { attributes[TOGGLEABLE_CONTENT_TYPE_ATTR] = it.value.toHtmlAttribute() }
- this@wrapGroup.childrenCallback()
- }
- else -> childrenCallback()
- }
- }
-
- private fun FlowContent.copyButton() = span(classes = "top-right-position") {
- span("copy-icon")
- copiedPopup("Content copied to clipboard", "popup-to-left")
- }
-
- private fun FlowContent.copiedPopup(notificationContent: String, additionalClasses: String = "") =
- div("copy-popup-wrapper $additionalClasses") {
- span("copy-popup-icon")
- span {
- text(notificationContent)
- }
- }
-
- override fun FlowContent.buildPlatformDependent(
- content: PlatformHintedContent,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildPlatformDependent(
- content.sourceSets.filter {
- sourceSetRestriction == null || it in sourceSetRestriction
- }.associateWith { setOf(content.inner) },
- pageContext,
- content.extra,
- content.style
- )
- }
-
- private fun FlowContent.buildPlatformDependent(
- nodes: Map<DisplaySourceSet, Collection<ContentNode>>,
- pageContext: ContentPage,
- extra: PropertyContainer<ContentNode> = PropertyContainer.empty(),
- styles: Set<Style> = emptySet(),
- shouldHaveTabs: Boolean = shouldRenderSourceSetTabs
- ) {
- val contents = contentsForSourceSetDependent(nodes, pageContext)
- val isOnlyCommonContent = contents.singleOrNull()?.let { (sourceSet, _) ->
- sourceSet.platform == Platform.common
- && sourceSet.name.equals("common", ignoreCase = true)
- && sourceSet.sourceSetIDs.all.all { sourceSetDependencyMap[it]?.isEmpty() == true }
- } ?: false
-
- // little point in rendering a single "common" tab - it can be
- // assumed that code without any tabs is common by default
- val renderTabs = shouldHaveTabs && !isOnlyCommonContent
-
- val divStyles = "platform-hinted ${styles.joinToString()}" + if (renderTabs) " with-platform-tabs" else ""
- div(divStyles) {
- attributes["data-platform-hinted"] = "data-platform-hinted"
- extra.extraHtmlAttributes().forEach { attributes[it.extraKey] = it.extraValue }
- if (renderTabs) {
- div("platform-bookmarks-row") {
- attributes["data-toggle-list"] = "data-toggle-list"
- contents.forEachIndexed { index, pair ->
- button(classes = "platform-bookmark") {
- attributes["data-filterable-current"] = pair.first.sourceSetIDs.merged.toString()
- attributes["data-filterable-set"] = pair.first.sourceSetIDs.merged.toString()
- if (index == 0) attributes["data-active"] = ""
- attributes["data-toggle"] = pair.first.sourceSetIDs.merged.toString()
- text(pair.first.name)
- }
- }
- }
- }
- contents.forEach {
- consumer.onTagContentUnsafe { +it.second }
- }
- }
- }
-
- private fun contentsForSourceSetDependent(
- nodes: Map<DisplaySourceSet, Collection<ContentNode>>,
- pageContext: ContentPage,
- ): List<Pair<DisplaySourceSet, String>> {
- var counter = 0
- return nodes.toList().map { (sourceSet, elements) ->
- val htmlContent = createHTML(prettyPrint = false).prepareForTemplates().div {
- elements.forEach {
- buildContentNode(it, pageContext, sourceSet)
- }
- }.stripDiv()
- sourceSet to createHTML(prettyPrint = false).prepareForTemplates()
- .div(classes = "content sourceset-dependent-content") {
- if (counter++ == 0) attributes["data-active"] = ""
- attributes["data-togglable"] = sourceSet.sourceSetIDs.merged.toString()
- unsafe {
- +htmlContent
- }
- }
- }.sortedBy { it.first.comparableKey }
- }
-
- override fun FlowContent.buildDivergent(node: ContentDivergentGroup, pageContext: ContentPage) {
- if (node.implicitlySourceSetHinted) {
- val groupedInstancesBySourceSet = node.children.flatMap { instance ->
- instance.sourceSets.map { sourceSet -> instance to sourceSet }
- }.groupBy(
- Pair<ContentDivergentInstance, DisplaySourceSet>::second,
- Pair<ContentDivergentInstance, DisplaySourceSet>::first
- )
-
- val nodes = groupedInstancesBySourceSet.mapValues {
- val distinct =
- groupDivergentInstancesWithSourceSet(it.value, it.key, pageContext,
- beforeTransformer = { instance, _, sourceSet ->
- createHTML(prettyPrint = false).prepareForTemplates().div {
- instance.before?.let { before ->
- buildContentNode(before, pageContext, sourceSet)
- }
- }.stripDiv()
- },
- afterTransformer = { instance, _, sourceSet ->
- createHTML(prettyPrint = false).prepareForTemplates().div {
- instance.after?.let { after ->
- buildContentNode(after, pageContext, sourceSet)
- }
- }.stripDiv()
- })
-
- val isPageWithOverloadedMembers = pageContext is MemberPage && pageContext.documentables().size > 1
-
- val contentOfSourceSet = mutableListOf<ContentNode>()
- distinct.onEachIndexed{ index, (_, distinctInstances) ->
- distinctInstances.firstOrNull()?.before?.let { contentOfSourceSet.add(it) }
- contentOfSourceSet.addAll(distinctInstances.map { it.divergent })
- (distinctInstances.firstOrNull()?.after ?: if (index != distinct.size - 1) ContentBreakLine(setOf(it.key)) else null)
- ?.let { contentOfSourceSet.add(it) }
-
- // content kind main is important for declarations list to avoid double line breaks
- if (node.dci.kind == ContentKind.Main && index != distinct.size - 1) {
- if (isPageWithOverloadedMembers) {
- // add some spacing and distinction between function/property overloads.
- // not ideal, but there's no other place to modify overloads page atm
- contentOfSourceSet.add(ContentBreakLine(setOf(it.key), style = setOf(HorizontalBreakLineStyle)))
- } else {
- contentOfSourceSet.add(ContentBreakLine(setOf(it.key)))
- }
- }
- }
- contentOfSourceSet
- }
- buildPlatformDependent(nodes, pageContext)
- } else {
- node.children.forEach {
- buildContentNode(it.divergent, pageContext, it.sourceSets)
- }
- }
- }
-
- private fun groupDivergentInstancesWithSourceSet(
- instances: List<ContentDivergentInstance>,
- sourceSet: DisplaySourceSet,
- pageContext: ContentPage,
- beforeTransformer: (ContentDivergentInstance, ContentPage, DisplaySourceSet) -> String,
- afterTransformer: (ContentDivergentInstance, ContentPage, DisplaySourceSet) -> String
- ): Map<SerializedBeforeAndAfter, List<ContentDivergentInstance>> =
- instances.map { instance ->
- instance to Pair(
- beforeTransformer(instance, pageContext, sourceSet),
- afterTransformer(instance, pageContext, sourceSet)
- )
- }.groupBy(
- Pair<ContentDivergentInstance, SerializedBeforeAndAfter>::second,
- Pair<ContentDivergentInstance, SerializedBeforeAndAfter>::first
- )
-
- private fun ContentPage.documentables(): List<Documentable> {
- return (this as? WithDocumentables)?.documentables ?: emptyList()
- }
-
- override fun FlowContent.buildList(
- node: ContentList,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- return when {
- node.ordered -> {
- ol { buildListItems(node.children, pageContext, sourceSetRestriction) }
- }
- node.hasStyle(ListStyle.DescriptionList) -> {
- dl { node.children.forEach { it.build(this, pageContext, sourceSetRestriction) } }
- }
- else -> {
- ul { buildListItems(node.children, pageContext, sourceSetRestriction) }
- }
- }
- }
-
- public open fun OL.buildListItems(
- items: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- items.forEach {
- if (it is ContentList)
- buildList(it, pageContext)
- else
- li { it.build(this, pageContext, sourceSetRestriction) }
- }
- }
-
- public open fun UL.buildListItems(
- items: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>? = null
- ) {
- items.forEach {
- if (it is ContentList)
- buildList(it, pageContext)
- else
- li { it.build(this, pageContext) }
- }
- }
-
- override fun FlowContent.buildResource(
- node: ContentEmbeddedResource,
- pageContext: ContentPage
- ) { // TODO: extension point there
- if (node.isImage()) {
- img(src = node.address, alt = node.altText)
- } else {
- println("Unrecognized resource type: $node")
- }
- }
-
- private fun FlowContent.buildRow(
- node: ContentGroup,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- node.children
- .filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } }
- .takeIf { it.isNotEmpty() }
- ?.let {
- when (pageContext) {
- is MultimoduleRootPage -> buildRowForMultiModule(node, it, pageContext, sourceSetRestriction)
- is ModulePage -> buildRowForModule(node, it, pageContext, sourceSetRestriction)
- else -> buildRowForContent(node, it, pageContext, sourceSetRestriction)
- }
- }
- }
-
- private fun FlowContent.buildRowForMultiModule(
- contextNode: ContentGroup,
- toRender: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildAnchor(contextNode)
- div(classes = "table-row") {
- div("main-subrow " + contextNode.style.joinToString(separator = " ")) {
- buildRowHeaderLink(toRender, pageContext, sourceSetRestriction, contextNode.anchor, "w-100")
- div {
- buildRowBriefSectionForDocs(toRender, pageContext, sourceSetRestriction)
- }
- }
- }
- }
-
- private fun FlowContent.buildRowForModule(
- contextNode: ContentGroup,
- toRender: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildAnchor(contextNode)
- div(classes = "table-row") {
- addSourceSetFilteringAttributes(contextNode)
- div {
- div("main-subrow " + contextNode.style.joinToString(separator = " ")) {
- buildRowHeaderLink(toRender, pageContext, sourceSetRestriction, contextNode.anchor)
- div("pull-right") {
- if (ContentKind.shouldBePlatformTagged(contextNode.dci.kind)) {
- createPlatformTags(contextNode, cssClasses = "no-gutters")
- }
- }
- }
- div {
- buildRowBriefSectionForDocs(toRender, pageContext, sourceSetRestriction)
- }
- }
- }
- }
-
- private fun FlowContent.buildRowForContent(
- contextNode: ContentGroup,
- toRender: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildAnchor(contextNode)
- div(classes = "table-row") {
- contextNode.extra.extraTabbedContentType()?.let { attributes[TOGGLEABLE_CONTENT_TYPE_ATTR] = it.value.toHtmlAttribute() }
- addSourceSetFilteringAttributes(contextNode)
- div("main-subrow keyValue " + contextNode.style.joinToString(separator = " ")) {
- buildRowHeaderLink(toRender, pageContext, sourceSetRestriction, contextNode.anchor)
- div {
- toRender.filter { it !is ContentLink && !it.hasStyle(ContentStyle.RowTitle) }
- .takeIf { it.isNotEmpty() }?.let {
- div("title") {
- it.forEach {
- it.build(this, pageContext, sourceSetRestriction)
- }
- }
- }
- }
- }
- }
- }
-
- private fun FlowContent.buildRowHeaderLink(
- toRender: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?,
- anchorDestination: String?,
- classes: String = ""
- ) {
- toRender.filter { it is ContentLink || it.hasStyle(ContentStyle.RowTitle) }.takeIf { it.isNotEmpty() }?.let {
- div(classes) {
- it.filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } }
- .forEach {
- span("inline-flex") {
- div {
- it.build(this, pageContext, sourceSetRestriction)
- }
- if (it is ContentLink && !anchorDestination.isNullOrBlank()) {
- buildAnchorCopyButton(anchorDestination)
- }
- }
- }
- }
- }
- }
-
- private fun FlowContent.addSourceSetFilteringAttributes(
- contextNode: ContentGroup,
- ) {
- attributes["data-filterable-current"] = contextNode.buildSourceSetFilterValues()
- attributes["data-filterable-set"] = contextNode.buildSourceSetFilterValues()
- }
-
- private fun ContentNode.buildSourceSetFilterValues(): String {
- // This value is used in HTML and JS for filtering out source set declarations,
- // it is expected that the separator is the same here and there.
- // See https://github.com/Kotlin/dokka/issues/3011#issuecomment-1568620493
- return this.sourceSets.joinToString(",") {
- it.sourceSetIDs.merged.toString()
- }
- }
-
- private fun FlowContent.buildRowBriefSectionForDocs(
- toRender: List<ContentNode>,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?,
- ) {
- toRender.filter { it !is ContentLink }.takeIf { it.isNotEmpty() }?.let {
- it.forEach {
- span(classes = if (it.dci.kind == ContentKind.Comment) "brief-comment" else "") {
- it.build(this, pageContext, sourceSetRestriction)
- }
- }
- }
- }
-
- private fun FlowContent.createPlatformTagBubbles(sourceSets: List<DisplaySourceSet>, cssClasses: String = "") {
- div("platform-tags $cssClasses") {
- sourceSets.sortedBy { it.name }.forEach {
- div("platform-tag") {
- when (it.platform.key) {
- "common" -> classes = classes + "common-like"
- "native" -> classes = classes + "native-like"
- "jvm" -> classes = classes + "jvm-like"
- "js" -> classes = classes + "js-like"
- "wasm" -> classes = classes + "wasm-like"
- }
- text(it.name)
- }
- }
- }
- }
-
- private fun FlowContent.createPlatformTags(
- node: ContentNode,
- sourceSetRestriction: Set<DisplaySourceSet>? = null,
- cssClasses: String = ""
- ) {
- node.takeIf { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } }?.let {
- createPlatformTagBubbles(node.sourceSets.filter {
- sourceSetRestriction == null || it in sourceSetRestriction
- }.sortedBy { it.name }, cssClasses)
- }
- }
-
- override fun FlowContent.buildTable(
- node: ContentTable,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- when {
- node.style.contains(CommentTable) -> buildDefaultTable(node, pageContext, sourceSetRestriction)
- else -> div(classes = "table") {
- node.extra.extraHtmlAttributes().forEach { attributes[it.extraKey] = it.extraValue }
- node.children.forEach {
- buildRow(it, pageContext, sourceSetRestriction)
- }
- }
- }
-
- }
-
- public fun FlowContent.buildDefaultTable(
- node: ContentTable,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- table {
- thead {
- node.header.forEach {
- tr {
- it.children.forEach {
- th {
- it.build(this@table, pageContext, sourceSetRestriction)
- }
- }
- }
- }
- }
- tbody {
- node.children.forEach {
- tr {
- it.children.forEach {
- td {
- it.build(this, pageContext, sourceSetRestriction)
- }
- }
- }
- }
- }
- }
- }
-
-
- override fun FlowContent.buildHeader(level: Int, node: ContentHeader, content: FlowContent.() -> Unit) {
- val classes = node.style.joinToString { it.toString() }.toLowerCase()
- when (level) {
- 1 -> h1(classes = classes, content)
- 2 -> h2(classes = classes, content)
- 3 -> h3(classes = classes, content)
- 4 -> h4(classes = classes, content)
- 5 -> h5(classes = classes, content)
- else -> h6(classes = classes, content)
- }
- }
-
- private fun FlowContent.buildAnchor(
- anchor: String,
- anchorLabel: String,
- sourceSets: String,
- content: FlowContent.() -> Unit
- ) {
- a {
- attributes["data-name"] = anchor
- attributes["anchor-label"] = anchorLabel
- attributes["id"] = anchor
- attributes["data-filterable-set"] = sourceSets
- }
- content()
- }
-
- private fun FlowContent.buildAnchor(anchor: String, anchorLabel: String, sourceSets: String) =
- buildAnchor(anchor, anchorLabel, sourceSets) {}
-
- private fun FlowContent.buildAnchor(node: ContentNode) {
- node.anchorLabel?.let { label -> buildAnchor(node.anchor!!, label, node.buildSourceSetFilterValues()) }
- }
-
-
- override fun FlowContent.buildNavigation(page: PageNode) {
- div(classes = "breadcrumbs") {
- val path = locationProvider.ancestors(page).filterNot { it is RendererSpecificPage }.asReversed()
- if (path.size > 1) {
- buildNavigationElement(path.first(), page)
- path.drop(1).forEach { node ->
- span(classes = "delimiter") {
- text("/")
- }
- buildNavigationElement(node, page)
- }
- }
- }
- }
-
- private fun FlowContent.buildNavigationElement(node: PageNode, page: PageNode) =
- if (node.isNavigable) {
- val isCurrentPage = (node == page)
- if (isCurrentPage) {
- span(classes = "current") {
- text(node.name)
- }
- } else {
- buildLink(node, page)
- }
- } else {
- text(node.name)
- }
-
- private fun FlowContent.buildLink(to: PageNode, from: PageNode) =
- locationProvider.resolve(to, from)?.let { path ->
- buildLink(path) {
- text(to.name)
- }
- } ?: span {
- attributes["data-unresolved-link"] = to.name.htmlEscape()
- text(to.name)
- }
-
- public fun FlowContent.buildAnchorCopyButton(pointingTo: String) {
- span(classes = "anchor-wrapper") {
- span(classes = "anchor-icon") {
- attributes["pointing-to"] = pointingTo
- }
- copiedPopup("Link copied to clipboard")
- }
- }
-
- public fun FlowContent.buildLink(
- to: DRI,
- platforms: List<DisplaySourceSet>,
- from: PageNode? = null,
- block: FlowContent.() -> Unit
- ) {
- locationProvider.resolve(to, platforms.toSet(), from)?.let { buildLink(it, block) }
- ?: run { context.logger.error("Cannot resolve path for `$to` from `$from`"); block() }
- }
-
- override fun buildError(node: ContentNode) {
- context.logger.error("Unknown ContentNode type: $node")
- }
-
- override fun FlowContent.buildLineBreak() {
- br()
- }
- override fun FlowContent.buildLineBreak(node: ContentBreakLine, pageContext: ContentPage) {
- if (node.style.contains(HorizontalBreakLineStyle)) {
- hr()
- } else {
- buildLineBreak()
- }
- }
-
- override fun FlowContent.buildLink(address: String, content: FlowContent.() -> Unit) {
- a(href = address, block = content)
- }
-
- override fun FlowContent.buildDRILink(
- node: ContentDRILink,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- locationProvider.resolve(node.address, node.sourceSets, pageContext)?.let { address ->
- buildLink(address) {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- } ?: if (isPartial) {
- templateCommand(ResolveLinkCommand(node.address)) {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- } else {
- span {
- attributes["data-unresolved-link"] = node.address.toString().htmlEscape()
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- }
- }
-
- override fun FlowContent.buildCodeBlock(
- code: ContentCodeBlock,
- pageContext: ContentPage
- ) {
- div("sample-container") {
- val codeLang = "lang-" + code.language.ifEmpty { "kotlin" }
- val stylesWithBlock = code.style + TextStyle.Block + codeLang
- pre {
- code(stylesWithBlock.joinToString(" ") { it.toString().toLowerCase() }) {
- attributes["theme"] = "idea"
- code.children.forEach { buildContentNode(it, pageContext) }
- }
- }
- /*
- Disable copy button on samples as:
- - it is useless
- - it overflows with playground's run button
- */
- if (!code.style.contains(ContentStyle.RunnableSample)) copyButton()
- }
- }
-
- override fun FlowContent.buildCodeInline(
- code: ContentCodeInline,
- pageContext: ContentPage
- ) {
- val codeLang = "lang-" + code.language.ifEmpty { "kotlin" }
- val stylesWithBlock = code.style + codeLang
- code(stylesWithBlock.joinToString(" ") { it.toString().toLowerCase() }) {
- code.children.forEach { buildContentNode(it, pageContext) }
- }
- }
-
- override fun FlowContent.buildText(textNode: ContentText) {
- buildText(textNode, textNode.style)
- }
-
- private fun FlowContent.buildText(textNode: ContentText, unappliedStyles: Set<Style>) {
- when {
- textNode.extra[HtmlContent] != null -> {
- consumer.onTagContentUnsafe { raw(textNode.text) }
- }
- unappliedStyles.contains(TextStyle.Indented) -> {
- consumer.onTagContentEntity(Entities.nbsp)
- buildText(textNode, unappliedStyles - TextStyle.Indented)
- }
- unappliedStyles.isNotEmpty() -> {
- val styleToApply = unappliedStyles.first()
- applyStyle(styleToApply) {
- buildText(textNode, unappliedStyles - styleToApply)
- }
- }
- textNode.hasStyle(ContentStyle.RowTitle) || textNode.hasStyle(TextStyle.Cover) ->
- buildBreakableText(textNode.text)
- else -> text(textNode.text)
- }
- }
-
- private inline fun FlowContent.applyStyle(styleToApply: Style, crossinline body: FlowContent.() -> Unit) {
- when (styleToApply) {
- TextStyle.Bold -> b { body() }
- TextStyle.Italic -> i { body() }
- TextStyle.Strikethrough -> strike { body() }
- TextStyle.Strong -> strong { body() }
- TextStyle.Var -> htmlVar { body() }
- TextStyle.Underlined -> underline { body() }
- is TokenStyle -> span("token ${styleToApply.prismJsClass()}") { body() }
- else -> body()
- }
- }
-
- private fun TokenStyle.prismJsClass(): String = when(this) {
- // Prism.js parser adds Builtin token instead of Annotation
- // for some reason, so we also add it for consistency and correct coloring
- TokenStyle.Annotation -> "annotation builtin"
- else -> this.toString().toLowerCase()
- }
-
- override fun render(root: RootPageNode) {
- shouldRenderSourceSetTabs = shouldRenderSourceSetTabs(root)
- super.render(root)
- }
-
- override fun buildPage(page: ContentPage, content: (FlowContent, ContentPage) -> Unit): String =
- buildHtml(page, page.embeddedResources) {
- content(this, page)
- }
-
- private fun PageNode.getDocumentableType(): String? =
- when(this) {
- is PackagePage -> "package"
- is ClasslikePage -> "classlike"
- is MemberPage -> "member"
- else -> null
- }
-
- public open fun buildHtml(
- page: PageNode,
- resources: List<String>, content: FlowContent.() -> Unit
- ): String {
- return templater.renderFromTemplate(DokkaTemplateTypes.BASE) {
- val generatedContent =
- createHTML().div("main-content") {
- page.getDocumentableType()?.let { attributes["data-page-type"] = it }
- id = "content"
- (page as? ContentPage)?.let {
- attributes["pageIds"] = "${context.configuration.moduleName}::${page.pageId}"
- }
- content()
- }
-
- templateModelMerger.invoke(templateModelFactories) {
- buildModel(
- page,
- resources,
- locationProvider,
- generatedContent
- )
- }
- }
- }
-
- /**
- * This is deliberately left open for plugins that have some other pages above ours and would like to link to them
- * instead of ours when clicking the logo
- */
- public open fun FlowContent.clickableLogo(page: PageNode, pathToRoot: String) {
- if (context.configuration.delayTemplateSubstitution && page is ContentPage) {
- templateCommand(PathToRootSubstitutionCommand(pattern = "###", default = pathToRoot)) {
- a {
- href = "###index.html"
- templateCommand(
- ProjectNameSubstitutionCommand(
- pattern = "@@@",
- default = context.configuration.moduleName
- )
- ) {
- span {
- text("@@@")
- }
- }
- }
- }
- } else {
- a {
- href = pathToRoot + "index.html"
- text(context.configuration.moduleName)
- }
- }
- }
-
- private val ContentNode.isAnchorable: Boolean
- get() = anchorLabel != null
-
- private val ContentNode.anchorLabel: String?
- get() = extra[SymbolAnchorHint]?.anchorName
-
- private val ContentNode.anchor: String?
- get() = extra[SymbolAnchorHint]?.contentKind?.let { contentKind ->
- (locationProvider as DokkaBaseLocationProvider).anchorForDCI(DCI(dci.dri, contentKind), sourceSets)
- }
-
- private val isPartial = context.configuration.delayTemplateSubstitution
-}
-
-private fun TabbedContentType.toHtmlAttribute(): String =
- when(this) {
- is BasicTabbedContentType ->
- when(this) {
- BasicTabbedContentType.ENTRY -> "ENTRY"
- BasicTabbedContentType.TYPE -> "TYPE"
- BasicTabbedContentType.CONSTRUCTOR -> "CONSTRUCTOR"
- BasicTabbedContentType.FUNCTION -> "FUNCTION"
- BasicTabbedContentType.PROPERTY -> "PROPERTY"
- BasicTabbedContentType.EXTENSION_PROPERTY -> "EXTENSION_PROPERTY"
- BasicTabbedContentType.EXTENSION_FUNCTION -> "EXTENSION_FUNCTION"
- }
- else -> throw IllegalStateException("Unknown TabbedContentType $this")
- }
-
-/**
- * Tabs for a content with [ContentStyle.TabbedContent].
- *
- * @see ContentStyle.TabbedContent]
- */
-private data class ContentTab(val text: String, val tabbedContentTypes: List<TabbedContentType>)
-
-public fun List<SimpleAttr>.joinAttr(): String = joinToString(" ") { it.extraKey + "=" + it.extraValue }
-
-private fun String.stripDiv() = drop(5).dropLast(6) // TODO: Find a way to do it without arbitrary trims
-
-private val PageNode.isNavigable: Boolean
- get() = this !is RendererSpecificPage || strategy != RenderingStrategy.DoNothing
-
-private fun PropertyContainer<ContentNode>.extraHtmlAttributes() = allOfType<SimpleAttr>()
-private fun PropertyContainer<ContentNode>.extraTabbedContentType() = this[TabbedContentTypeExtra]
-
-private val DisplaySourceSet.comparableKey
- get() = sourceSetIDs.merged.let { it.scopeId + it.sourceSetName }
diff --git a/plugins/base/src/main/kotlin/renderers/html/NavigationDataProvider.kt b/plugins/base/src/main/kotlin/renderers/html/NavigationDataProvider.kt
deleted file mode 100644
index fccfd145..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/NavigationDataProvider.kt
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.annotations
-import org.jetbrains.dokka.base.transformers.documentables.isDeprecated
-import org.jetbrains.dokka.base.transformers.documentables.isException
-import org.jetbrains.dokka.base.utils.canonicalAlphabeticalOrder
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.analysis.kotlin.internal.DocumentableLanguage
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-public abstract class NavigationDataProvider(
- dokkaContext: DokkaContext
-) {
- private val documentableSourceLanguageParser = dokkaContext.plugin<InternalKotlinAnalysisPlugin>().querySingle { documentableSourceLanguageParser }
-
- public open fun navigableChildren(input: RootPageNode): NavigationNode = input.withDescendants()
- .first { it is ModulePage || it is MultimoduleRootPage }.let { visit(it as ContentPage) }
-
- public open fun visit(page: ContentPage): NavigationNode =
- NavigationNode(
- name = page.displayableName(),
- dri = page.dri.first(),
- sourceSets = page.sourceSets(),
- icon = chooseNavigationIcon(page),
- styles = chooseStyles(page),
- children = page.navigableChildren()
- )
-
- /**
- * Parenthesis is applied in 1 case:
- * - page only contains functions (therefore documentable from this page is [DFunction])
- */
- private fun ContentPage.displayableName(): String =
- if (this is WithDocumentables && documentables.all { it is DFunction }) {
- "$name()"
- } else {
- name
- }
-
- private fun chooseNavigationIcon(contentPage: ContentPage): NavigationNodeIcon? =
- if (contentPage is WithDocumentables) {
- val documentable = contentPage.documentables.firstOrNull()
- val isJava = documentable?.hasAnyJavaSources() ?: false
-
- when (documentable) {
- is DTypeAlias -> NavigationNodeIcon.TYPEALIAS_KT
- is DClass -> when {
- documentable.isException -> NavigationNodeIcon.EXCEPTION
- documentable.isAbstract() -> {
- if (isJava) NavigationNodeIcon.ABSTRACT_CLASS else NavigationNodeIcon.ABSTRACT_CLASS_KT
- }
- else -> if (isJava) NavigationNodeIcon.CLASS else NavigationNodeIcon.CLASS_KT
- }
- is DFunction -> NavigationNodeIcon.FUNCTION
- is DProperty -> {
- val isVar = documentable.extra[IsVar] != null
- if (isVar) NavigationNodeIcon.VAR else NavigationNodeIcon.VAL
- }
- is DInterface -> if (isJava) NavigationNodeIcon.INTERFACE else NavigationNodeIcon.INTERFACE_KT
- is DEnum,
- is DEnumEntry -> if (isJava) NavigationNodeIcon.ENUM_CLASS else NavigationNodeIcon.ENUM_CLASS_KT
- is DAnnotation -> {
- if (isJava) NavigationNodeIcon.ANNOTATION_CLASS else NavigationNodeIcon.ANNOTATION_CLASS_KT
- }
- is DObject -> NavigationNodeIcon.OBJECT
- else -> null
- }
- } else {
- null
- }
-
- private fun Documentable.hasAnyJavaSources(): Boolean {
- return this.sourceSets.any { sourceSet ->
- documentableSourceLanguageParser.getLanguage(this, sourceSet) == DocumentableLanguage.JAVA
- }
- }
-
- private fun DClass.isAbstract() =
- modifier.values.all { it is KotlinModifier.Abstract || it is JavaModifier.Abstract }
-
- private fun chooseStyles(page: ContentPage): Set<Style> =
- if (page.containsOnlyDeprecatedDocumentables()) setOf(TextStyle.Strikethrough) else emptySet()
-
- private fun ContentPage.containsOnlyDeprecatedDocumentables(): Boolean {
- if (this !is WithDocumentables) {
- return false
- }
- return this.documentables.isNotEmpty() && this.documentables.all { it.isDeprecatedForAllSourceSets() }
- }
-
- private fun Documentable.isDeprecatedForAllSourceSets(): Boolean {
- val sourceSetAnnotations = this.annotations()
- return sourceSetAnnotations.isNotEmpty() && sourceSetAnnotations.all { (_, annotations) ->
- annotations.any { it.isDeprecated() }
- }
- }
-
- private val navigationNodeOrder: Comparator<NavigationNode> =
- compareBy(canonicalAlphabeticalOrder) { it.name }
-
- private fun ContentPage.navigableChildren() =
- if (this is ClasslikePage) {
- this.navigableChildren()
- } else {
- children
- .filterIsInstance<ContentPage>()
- .map { visit(it) }
- .sortedWith(navigationNodeOrder)
- }
-
- private fun ClasslikePage.navigableChildren(): List<NavigationNode> {
- // Classlikes should only have other classlikes as navigable children
- val navigableChildren = children
- .filterIsInstance<ClasslikePage>()
- .map { visit(it) }
-
- val isEnumPage = documentables.any { it is DEnum }
- return if (isEnumPage) {
- // no sorting for enum entries, should be the same order as in source code
- navigableChildren
- } else {
- navigableChildren.sortedWith(navigationNodeOrder)
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt b/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt
deleted file mode 100644
index eae43daf..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import kotlinx.html.*
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.base.renderers.html.NavigationNodeIcon.CLASS
-import org.jetbrains.dokka.base.renderers.html.NavigationNodeIcon.CLASS_KT
-import org.jetbrains.dokka.base.renderers.pageId
-import org.jetbrains.dokka.base.templating.AddToNavigationCommand
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.WithChildren
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class NavigationPage(
- public val root: NavigationNode,
- public val moduleName: String,
- public val context: DokkaContext
-) : RendererSpecificPage {
-
- override val name: String = "navigation"
-
- override val children: List<PageNode> = emptyList()
-
- override fun modified(name: String, children: List<PageNode>): NavigationPage = this
-
- override val strategy: RenderingStrategy = RenderingStrategy<HtmlRenderer> {
- createHTML().visit(root, this)
- }
-
- private fun <R> TagConsumer<R>.visit(node: NavigationNode, renderer: HtmlRenderer): R = with(renderer) {
- if (context.configuration.delayTemplateSubstitution) {
- templateCommand(AddToNavigationCommand(moduleName)) {
- visit(node, "${moduleName}-nav-submenu", renderer)
- }
- } else {
- visit(node, "${moduleName}-nav-submenu", renderer)
- }
- }
-
- private fun <R> TagConsumer<R>.visit(node: NavigationNode, navId: String, renderer: HtmlRenderer): R =
- with(renderer) {
- div("sideMenuPart") {
- id = navId
- attributes["pageId"] = "${moduleName}::${node.pageId}"
- div("overview") {
- if (node.children.isNotEmpty()) {
- span("navButton") {
- onClick = """document.getElementById("$navId").classList.toggle("hidden");"""
- span("navButtonContent")
- }
- }
- buildLink(node.dri, node.sourceSets.toList()) {
- val withIcon = node.icon != null
- if (withIcon) {
- // in case link text is so long that it needs to have word breaks,
- // and it stretches to two or more lines, make sure the icon
- // is always on the left in the grid and is not wrapped with text
- span("nav-link-grid") {
- span("nav-link-child ${node.icon?.style()}")
- span("nav-link-child") {
- nodeText(node)
- }
- }
- } else {
- nodeText(node)
- }
- }
- }
- node.children.withIndex().forEach { (n, p) -> visit(p, "$navId-$n", renderer) }
- }
- }
-
- private fun FlowContent.nodeText(node: NavigationNode) {
- if (node.styles.contains(TextStyle.Strikethrough)) {
- strike {
- buildBreakableText(node.name)
- }
- } else {
- buildBreakableText(node.name)
- }
- }
-}
-
-public data class NavigationNode(
- val name: String,
- val dri: DRI,
- val sourceSets: Set<DisplaySourceSet>,
- val icon: NavigationNodeIcon?,
- val styles: Set<Style> = emptySet(),
- override val children: List<NavigationNode>
-) : WithChildren<NavigationNode>
-
-/**
- * [CLASS] represents a neutral (a.k.a Java-style) icon,
- * whereas [CLASS_KT] should be Kotlin-styled
- */
-public enum class NavigationNodeIcon(
- private val cssClass: String
-) {
- CLASS("class"),
- CLASS_KT("class-kt"),
- ABSTRACT_CLASS("abstract-class"),
- ABSTRACT_CLASS_KT("abstract-class-kt"),
- ENUM_CLASS("enum-class"),
- ENUM_CLASS_KT("enum-class-kt"),
- ANNOTATION_CLASS("annotation-class"),
- ANNOTATION_CLASS_KT("annotation-class-kt"),
- INTERFACE("interface"),
- INTERFACE_KT("interface-kt"),
- FUNCTION("function"),
- EXCEPTION("exception-class"),
- OBJECT("object"),
- TYPEALIAS_KT("typealias-kt"),
- VAL("val"),
- VAR("var");
-
- internal fun style(): String = "nav-icon $cssClass"
-}
-
-public fun NavigationPage.transform(block: (NavigationNode) -> NavigationNode): NavigationPage =
- NavigationPage(root.transform(block), moduleName, context)
-
-public fun NavigationNode.transform(block: (NavigationNode) -> NavigationNode): NavigationNode =
- run(block).let { NavigationNode(it.name, it.dri, it.sourceSets, it.icon, it.styles, it.children.map(block)) }
diff --git a/plugins/base/src/main/kotlin/renderers/html/SearchbarDataInstaller.kt b/plugins/base/src/main/kotlin/renderers/html/SearchbarDataInstaller.kt
deleted file mode 100644
index 83d4b24f..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/SearchbarDataInstaller.kt
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.base.templating.AddToSearch
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public data class SearchRecord(
- val name: String,
- val description: String? = null,
- val location: String,
- val searchKeys: List<String> = listOf(name)
-) {
- public companion object
-}
-
-public open class SearchbarDataInstaller(
- public val context: DokkaContext
-) : PageTransformer {
-
- public data class DRIWithSourceSets(val dri: DRI, val sourceSet: Set<DisplaySourceSet>)
-
- public data class SignatureWithId(val driWithSourceSets: DRIWithSourceSets, val displayableSignature: String) {
- public constructor(dri: DRI, page: ContentPage) : this( DRIWithSourceSets(dri, page.sourceSets()),
- getSymbolSignature(page, dri)?.let { flattenToText(it) } ?: page.name)
-
- val id: String
- get() = with(driWithSourceSets.dri) {
- listOfNotNull(
- packageName?.takeIf { it.isNotBlank() },
- classNames,
- callable?.name
- ).joinToString(".")
- }
- }
-
- private val mapper = jacksonObjectMapper()
-
- public open fun generatePagesList(
- pages: List<SignatureWithId>,
- locationResolver: DriResolver
- ): List<SearchRecord> =
- pages.map { pageWithId ->
- createSearchRecord(
- name = pageWithId.displayableSignature,
- description = pageWithId.id,
- location = resolveLocation(locationResolver, pageWithId.driWithSourceSets).orEmpty(),
- searchKeys = listOf(
- pageWithId.id.substringAfterLast("."),
- pageWithId.displayableSignature,
- pageWithId.id,
- )
- )
- }.sortedWith(compareBy({ it.name }, { it.description }))
-
- public open fun createSearchRecord(
- name: String,
- description: String?,
- location: String,
- searchKeys: List<String>
- ): SearchRecord =
- SearchRecord(name, description, location, searchKeys)
-
- public open fun processPage(page: PageNode): List<SignatureWithId> =
- when (page) {
- is ContentPage -> page.takeIf { page !is ModulePageNode && page !is PackagePageNode }?.dri
- ?.map { dri -> SignatureWithId(dri, page) }.orEmpty()
- else -> emptyList()
- }
-
- private fun resolveLocation(locationResolver: DriResolver, driWithSourceSets: DRIWithSourceSets): String? =
- locationResolver(driWithSourceSets.dri, driWithSourceSets.sourceSet).also { location ->
- if (location.isNullOrBlank()) context.logger.warn("Cannot resolve path for ${driWithSourceSets.dri}")
- }
-
- override fun invoke(input: RootPageNode): RootPageNode {
- val signatureWithIds = input.withDescendants().fold(emptyList<SignatureWithId>()) { pageList, page ->
- pageList + processPage(page)
- }
- val page = RendererSpecificResourcePage(
- name = "scripts/pages.json",
- children = emptyList(),
- strategy = RenderingStrategy.DriLocationResolvableWrite { resolver ->
- val content = signatureWithIds.run {
- generatePagesList(this, resolver)
- }
-
- if (context.configuration.delayTemplateSubstitution) {
- mapper.writeValueAsString(AddToSearch(context.configuration.moduleName, content))
- } else {
- mapper.writeValueAsString(content)
- }
- })
-
- return input.modified(children = input.children + page)
- }
-}
-
-private fun getSymbolSignature(page: ContentPage, dri: DRI) =
- page.content.dfs { it.dci.kind == ContentKind.Symbol && it.dci.dri.contains(dri) }
-
-private fun flattenToText(node: ContentNode): String {
- fun getContentTextNodes(node: ContentNode, sourceSetRestriction: DisplaySourceSet): List<ContentText> =
- when (node) {
- is ContentText -> listOf(node)
- is ContentComposite -> node.children
- .filter { sourceSetRestriction in it.sourceSets }
- .flatMap { getContentTextNodes(it, sourceSetRestriction) }
- .takeIf { node.dci.kind != ContentKind.Annotations && node.dci.kind != ContentKind.Source }
- .orEmpty()
- else -> emptyList()
- }
-
- val sourceSetRestriction =
- node.sourceSets.find { it.platform == Platform.common } ?: node.sourceSets.first()
- return getContentTextNodes(node, sourceSetRestriction).joinToString("") { it.text }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/Tags.kt b/plugins/base/src/main/kotlin/renderers/html/Tags.kt
deleted file mode 100644
index 7d6fc390..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/Tags.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import kotlinx.html.*
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.toJsonString
-
-public typealias TemplateBlock = TemplateCommand.() -> Unit
-
-@HtmlTagMarker
-public fun FlowOrPhrasingContent.wbr(classes: String? = null, block: WBR.() -> Unit = {}): Unit =
- WBR(attributesMapOf("class", classes), consumer).visit(block)
-
-@Suppress("unused")
-public open class WBR(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) :
- HTMLTag("wbr", consumer, initialAttributes, namespace = null, inlineTag = true, emptyTag = false),
- HtmlBlockInlineTag
-
-/**
- * Work-around until next version of kotlinx.html doesn't come out
- */
-@HtmlTagMarker
-public inline fun FlowOrPhrasingContent.strike(classes : String? = null, crossinline block : STRIKE.() -> Unit = {}) : Unit = STRIKE(attributesMapOf("class", classes), consumer).visit(block)
-
-public open class STRIKE(initialAttributes: Map<String, String>, override val consumer: TagConsumer<*>) :
- HTMLTag("strike", consumer, initialAttributes, null, false, false), HtmlBlockInlineTag
-
-@HtmlTagMarker
-public inline fun FlowOrPhrasingContent.underline(classes : String? = null, crossinline block : UNDERLINE.() -> Unit = {}) : Unit = UNDERLINE(attributesMapOf("class", classes), consumer).visit(block)
-
-public open class UNDERLINE(initialAttributes: Map<String, String>, override val consumer: TagConsumer<*>) :
- HTMLTag("u", consumer, initialAttributes, null, false, false), HtmlBlockInlineTag
-
-public const val TEMPLATE_COMMAND_SEPARATOR: String = ":"
-public const val TEMPLATE_COMMAND_BEGIN_BORDER: String = "[+]cmd"
-public const val TEMPLATE_COMMAND_END_BORDER: String = "[-]cmd"
-
-public fun FlowOrMetaDataContent.templateCommandAsHtmlComment(data: Command, block: FlowOrMetaDataContent.() -> Unit = {}): Unit =
- (consumer as? ImmediateResolutionTagConsumer)?.processCommand(data, block)
- ?: let{
- comment( "$TEMPLATE_COMMAND_BEGIN_BORDER$TEMPLATE_COMMAND_SEPARATOR${toJsonString(data)}")
- block()
- comment(TEMPLATE_COMMAND_END_BORDER)
- }
-
-public fun <T: Appendable> T.templateCommandAsHtmlComment(command: Command, action: T.() -> Unit ) {
- append("<!--$TEMPLATE_COMMAND_BEGIN_BORDER$TEMPLATE_COMMAND_SEPARATOR${toJsonString(command)}-->")
- action()
- append("<!--$TEMPLATE_COMMAND_END_BORDER-->")
-}
-
-public fun FlowOrMetaDataContent.templateCommand(data: Command, block: TemplateBlock = {}): Unit =
- (consumer as? ImmediateResolutionTagConsumer)?.processCommand(data, block)
- ?: TemplateCommand(attributesMapOf("data", toJsonString(data)), consumer).visit(block)
-
-public fun <T> TagConsumer<T>.templateCommand(data: Command, block: TemplateBlock = {}): T =
- (this as? ImmediateResolutionTagConsumer)?.processCommandAndFinalize(data, block)
- ?: TemplateCommand(attributesMapOf("data", toJsonString(data)), this).visitAndFinalize(this, block)
-
-public fun templateCommandFor(data: Command, consumer: TagConsumer<*>): TemplateCommand =
- TemplateCommand(attributesMapOf("data", toJsonString(data)), consumer)
-
-public class TemplateCommand(initialAttributes: Map<String, String>, consumer: TagConsumer<*>) :
- HTMLTag(
- "dokka-template-command",
- consumer,
- initialAttributes,
- namespace = null,
- inlineTag = true,
- emptyTag = false
- ),
- CommonAttributeGroupFacadeFlowInteractivePhrasingContent
-
-// This hack is outrageous. I hate it but I cannot find any other way around `kotlinx.html` type system.
-public fun TemplateBlock.buildAsInnerHtml(): String = createHTML(prettyPrint = false).run {
- TemplateCommand(emptyMap, this).visitAndFinalize(this, this@buildAsInnerHtml).substringAfter(">").substringBeforeLast("<")
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt
deleted file mode 100644
index 9cde1fca..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ImmediateResolutionTagConsumer.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.command.consumers
-
-import kotlinx.html.TagConsumer
-import kotlinx.html.visit
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.html.TemplateBlock
-import org.jetbrains.dokka.base.renderers.html.templateCommand
-import org.jetbrains.dokka.base.renderers.html.templateCommandFor
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-
-public class ImmediateResolutionTagConsumer<out R>(
- private val downstream: TagConsumer<R>,
- private val context: DokkaContext
-): TagConsumer<R> by downstream {
-
- public fun processCommand(command: Command, block: TemplateBlock) {
- context.plugin<DokkaBase>().query { immediateHtmlCommandConsumer }
- .find { it.canProcess(command) }
- ?.processCommand(command, block, this)
- ?: run { templateCommandFor(command, downstream).visit(block) }
- }
-
- public fun processCommandAndFinalize(command: Command, block: TemplateBlock): R {
- return context.plugin<DokkaBase>().query { immediateHtmlCommandConsumer }
- .find { it.canProcess(command) }
- ?.processCommandAndFinalize(command, block, this)
- ?: downstream.templateCommand(command, block)
- }
-}
-
diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt
deleted file mode 100644
index 9ac6eb91..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/command/consumers/PathToRootConsumer.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.command.consumers
-
-import org.jetbrains.dokka.base.renderers.html.TemplateBlock
-import org.jetbrains.dokka.base.renderers.html.buildAsInnerHtml
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer
-import org.jetbrains.dokka.base.templating.PathToRootSubstitutionCommand
-
-public object PathToRootConsumer: ImmediateHtmlCommandConsumer {
- override fun canProcess(command: Command): Boolean = command is PathToRootSubstitutionCommand
-
- override fun <R> processCommand(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>) {
- command as PathToRootSubstitutionCommand
- tagConsumer.onTagContentUnsafe { +block.buildAsInnerHtml().replace(command.pattern, command.default) }
- }
-
- override fun <R> processCommandAndFinalize(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>): R {
- processCommand(command, block, tagConsumer)
- return tagConsumer.finalize()
- }
-
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ReplaceVersionsConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ReplaceVersionsConsumer.kt
deleted file mode 100644
index dd95c202..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ReplaceVersionsConsumer.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.command.consumers
-
-import org.jetbrains.dokka.base.renderers.html.TemplateBlock
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer
-import org.jetbrains.dokka.base.templating.ReplaceVersionsCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class ReplaceVersionsConsumer(private val context: DokkaContext) : ImmediateHtmlCommandConsumer {
- override fun canProcess(command: Command): Boolean = command is ReplaceVersionsCommand
-
- override fun <R> processCommand(
- command: Command,
- block: TemplateBlock,
- tagConsumer: ImmediateResolutionTagConsumer<R>
- ) {
- command as ReplaceVersionsCommand
- tagConsumer.onTagContentUnsafe { +context.configuration.moduleVersion.orEmpty() }
- }
-
- override fun <R> processCommandAndFinalize(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>): R {
- processCommand(command, block, tagConsumer)
- return tagConsumer.finalize()
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt b/plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt
deleted file mode 100644
index 292e88b0..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/command/consumers/ResolveLinkConsumer.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.command.consumers
-
-import kotlinx.html.SPAN
-import kotlinx.html.span
-import kotlinx.html.unsafe
-import kotlinx.html.visit
-import org.jetbrains.dokka.base.renderers.html.TemplateBlock
-import org.jetbrains.dokka.base.renderers.html.buildAsInnerHtml
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer
-import org.jetbrains.dokka.base.templating.ResolveLinkCommand
-import org.jetbrains.dokka.utilities.htmlEscape
-
-public object ResolveLinkConsumer: ImmediateHtmlCommandConsumer {
- override fun canProcess(command: Command): Boolean = command is ResolveLinkCommand
-
- override fun <R> processCommand(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>) {
- command as ResolveLinkCommand
- SPAN(mapOf("data-unresolved-link" to command.dri.toString().htmlEscape()), tagConsumer).visit {
- unsafe { block.buildAsInnerHtml() }
- }
- }
-
- override fun <R> processCommandAndFinalize(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>): R {
- command as ResolveLinkCommand
- return tagConsumer.span {
- attributes["data-unresolved-link"] = command.dri.toString().htmlEscape()
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/htmlFormatingUtils.kt b/plugins/base/src/main/kotlin/renderers/html/htmlFormatingUtils.kt
deleted file mode 100644
index b6ce4147..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/htmlFormatingUtils.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import kotlinx.html.FlowContent
-import kotlinx.html.span
-
-public fun FlowContent.buildTextBreakableAfterCapitalLetters(name: String, hasLastElement: Boolean = false) {
- if (name.contains(" ")) {
- val withOutSpaces = name.split(" ")
- withOutSpaces.dropLast(1).forEach {
- buildBreakableText(it)
- +" "
- }
- buildBreakableText(withOutSpaces.last())
- } else {
- val content = name.replace(Regex("(?<=[a-z])([A-Z])"), " $1").split(" ")
- joinToHtml(content, hasLastElement) {
- it
- }
- }
-}
-
-public fun FlowContent.buildBreakableDotSeparatedHtml(name: String) {
- val phrases = name.split(".")
- phrases.forEachIndexed { i, e ->
- val elementWithOptionalDot = e.takeIf { i == phrases.lastIndex } ?: "$e."
- if (e.length > 10) {
- buildTextBreakableAfterCapitalLetters(elementWithOptionalDot, hasLastElement = i == phrases.lastIndex)
- } else {
- buildBreakableHtmlElement(elementWithOptionalDot, i == phrases.lastIndex)
- }
- }
-}
-
-private fun FlowContent.joinToHtml(elements: List<String>, hasLastElement: Boolean = true, onEach: (String) -> String) {
- elements.dropLast(1).forEach {
- buildBreakableHtmlElement(onEach(it))
- }
- elements.takeIf { it.isNotEmpty() && it.last().isNotEmpty() }?.let {
- if (hasLastElement) {
- span {
- buildBreakableHtmlElement(it.last(), last = true)
- }
- } else {
- buildBreakableHtmlElement(it.last(), last = false)
- }
- }
-}
-
-private fun FlowContent.buildBreakableHtmlElement(element: String, last: Boolean = false) {
- element.takeIf { it.isNotBlank() }?.let {
- span {
- +it
- }
- }
- if (!last) {
- wbr { }
- }
-}
-
-public fun FlowContent.buildBreakableText(name: String) {
- if (name.contains(".")) buildBreakableDotSeparatedHtml(name)
- else buildTextBreakableAfterCapitalLetters(name, hasLastElement = true)
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt b/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt
deleted file mode 100644
index dad013e2..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.templating.AddToSourcesetDependencies
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jetbrains.dokka.pages.RendererSpecificResourcePage
-import org.jetbrains.dokka.pages.RenderingStrategy
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.configuration
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public open class NavigationPageInstaller(
- public val context: DokkaContext
-) : NavigationDataProvider(context), PageTransformer {
- override fun invoke(input: RootPageNode): RootPageNode =
- input.modified(
- children = input.children + NavigationPage(
- root = navigableChildren(input),
- moduleName = context.configuration.moduleName,
- context = context
- )
- )
-}
-
-public class CustomResourceInstaller(
- public val dokkaContext: DokkaContext
-) : PageTransformer {
- private val configuration = configuration<DokkaBase, DokkaBaseConfiguration>(dokkaContext)
-
- private val customAssets = configuration?.customAssets?.map {
- RendererSpecificResourcePage("images/${it.name}", emptyList(), RenderingStrategy.Copy(it.absolutePath))
- }.orEmpty()
-
- private val customStylesheets = configuration?.customStyleSheets?.map {
- RendererSpecificResourcePage("styles/${it.name}", emptyList(), RenderingStrategy.Copy(it.absolutePath))
- }.orEmpty()
-
- override fun invoke(input: RootPageNode): RootPageNode {
- val customResourcesPaths = (customAssets + customStylesheets).map { it.name }.toSet()
- val withEmbeddedResources =
- input.transformContentPagesTree { it.modified(embeddedResources = it.embeddedResources + customResourcesPaths) }
- if(dokkaContext.configuration.delayTemplateSubstitution)
- return withEmbeddedResources
- val (currentResources, otherPages) = withEmbeddedResources.children.partition { it is RendererSpecificResourcePage }
- return input.modified(children = otherPages + currentResources.filterNot { it.name in customResourcesPaths } + customAssets + customStylesheets)
- }
-}
-
-public class ScriptsInstaller(private val dokkaContext: DokkaContext) : PageTransformer {
-
- // scripts ending with `_deferred.js` are loaded with `defer`, otherwise `async`
- private val scriptsPages = listOf(
- "scripts/clipboard.js",
- "scripts/navigation-loader.js",
- "scripts/platform-content-handler.js",
- "scripts/main.js",
- "scripts/prism.js",
-
- // It's important for this script to be deferred because it has logic that makes decisions based on
- // rendered elements (for instance taking their clientWidth), and if not all styles are loaded/applied
- // at the time of inspecting them, it will give incorrect results and might lead to visual bugs.
- // should be easy to test if you open any page in incognito or by reloading it (Ctrl+Shift+R)
- "scripts/symbol-parameters-wrapper_deferred.js",
- )
-
- override fun invoke(input: RootPageNode): RootPageNode =
- input.let { root ->
- if (dokkaContext.configuration.delayTemplateSubstitution) root
- else root.modified(children = input.children + scriptsPages.toRenderSpecificResourcePage())
- }.transformContentPagesTree {
- it.modified(
- embeddedResources = it.embeddedResources + scriptsPages
- )
- }
-}
-
-public class StylesInstaller(private val dokkaContext: DokkaContext) : PageTransformer {
- private val stylesPages = listOf(
- "styles/style.css",
- "styles/main.css",
- "styles/prism.css",
- "styles/logo-styles.css",
- "styles/font-jb-sans-auto.css"
- )
-
- override fun invoke(input: RootPageNode): RootPageNode =
- input.let { root ->
- if (dokkaContext.configuration.delayTemplateSubstitution) root
- else root.modified(children = input.children + stylesPages.toRenderSpecificResourcePage())
- }.transformContentPagesTree {
- it.modified(
- embeddedResources = it.embeddedResources + stylesPages
- )
- }
-}
-
-public object AssetsInstaller : PageTransformer {
- private val imagesPages = listOf(
- "images/arrow_down.svg",
- "images/logo-icon.svg",
- "images/go-to-top-icon.svg",
- "images/footer-go-to-link.svg",
- "images/anchor-copy-button.svg",
- "images/copy-icon.svg",
- "images/copy-successful-icon.svg",
- "images/theme-toggle.svg",
- "images/burger.svg",
- "images/homepage.svg",
-
- // navigation icons
- "images/nav-icons/abstract-class.svg",
- "images/nav-icons/abstract-class-kotlin.svg",
- "images/nav-icons/annotation.svg",
- "images/nav-icons/annotation-kotlin.svg",
- "images/nav-icons/class.svg",
- "images/nav-icons/class-kotlin.svg",
- "images/nav-icons/enum.svg",
- "images/nav-icons/enum-kotlin.svg",
- "images/nav-icons/exception-class.svg",
- "images/nav-icons/field-value.svg",
- "images/nav-icons/field-variable.svg",
- "images/nav-icons/function.svg",
- "images/nav-icons/interface.svg",
- "images/nav-icons/interface-kotlin.svg",
- "images/nav-icons/object.svg",
- "images/nav-icons/typealias-kotlin.svg",
- )
-
- override fun invoke(input: RootPageNode): RootPageNode = input.modified(
- children = input.children + imagesPages.toRenderSpecificResourcePage()
- )
-}
-
-private fun List<String>.toRenderSpecificResourcePage(): List<RendererSpecificResourcePage> =
- map { RendererSpecificResourcePage(it, emptyList(), RenderingStrategy.Copy("/dokka/$it")) }
-
-public class SourcesetDependencyAppender(
- public val context: DokkaContext
-) : PageTransformer {
- private val name = "scripts/sourceset_dependencies.js"
- override fun invoke(input: RootPageNode): RootPageNode {
- val dependenciesMap = context.configuration.sourceSets.associate {
- it.sourceSetID to it.dependentSourceSets
- }
-
- fun createDependenciesJson(): String =
- dependenciesMap.map { (key, values) -> key.toString() to values.map { it.toString() } }.toMap()
- .let { content ->
- if (context.configuration.delayTemplateSubstitution) {
- toJsonString(AddToSourcesetDependencies(context.configuration.moduleName, content))
- } else {
- "sourceset_dependencies='${toJsonString(content)}'"
- }
- }
-
- val deps = RendererSpecificResourcePage(
- name = name,
- children = emptyList(),
- strategy = RenderingStrategy.Write(createDependenciesJson())
- )
-
- return input.modified(
- children = input.children + deps
- ).transformContentPagesTree { it.modified(embeddedResources = it.embeddedResources + name) }
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelFactory.kt b/plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelFactory.kt
deleted file mode 100644
index fe6f0089..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelFactory.kt
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.innerTemplating
-
-import freemarker.core.Environment
-import freemarker.template.*
-import kotlinx.html.*
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.renderers.URIExtension
-import org.jetbrains.dokka.base.renderers.html.TEMPLATE_REPLACEMENT
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
-import org.jetbrains.dokka.base.renderers.html.templateCommand
-import org.jetbrains.dokka.base.renderers.html.templateCommandAsHtmlComment
-import org.jetbrains.dokka.base.renderers.isImage
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.base.templating.PathToRootSubstitutionCommand
-import org.jetbrains.dokka.base.templating.ProjectNameSubstitutionCommand
-import org.jetbrains.dokka.base.templating.ReplaceVersionsCommand
-import org.jetbrains.dokka.base.templating.SubstitutionCommand
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.configuration
-import java.net.URI
-
-public class DefaultTemplateModelFactory(
- public val context: DokkaContext
-) : TemplateModelFactory {
- private val configuration = configuration<DokkaBase, DokkaBaseConfiguration>(context)
- private val isPartial = context.configuration.delayTemplateSubstitution
-
- private fun <R> TagConsumer<R>.prepareForTemplates() =
- if (context.configuration.delayTemplateSubstitution || this is ImmediateResolutionTagConsumer) this
- else ImmediateResolutionTagConsumer(this, context)
-
- public data class SourceSetModel(val name: String, val platform: String, val filter: String)
-
- override fun buildModel(
- page: PageNode,
- resources: List<String>,
- locationProvider: LocationProvider,
- content: String
- ): TemplateMap {
- val path = locationProvider.resolve(page)
- val pathToRoot = locationProvider.pathToRoot(page)
- val mapper = mutableMapOf<String, Any>()
- mapper["pageName"] = page.name
- mapper["resources"] = PrintDirective {
- val sb = StringBuilder()
- if (isPartial)
- sb.templateCommandAsHtmlComment(
- PathToRootSubstitutionCommand(
- TEMPLATE_REPLACEMENT,
- default = pathToRoot
- )
- ) { resourcesForPage(TEMPLATE_REPLACEMENT, resources) }
- else
- sb.resourcesForPage(pathToRoot, resources)
- sb.toString()
- }
- mapper["content"] = PrintDirective { content }
- mapper["version"] = PrintDirective {
- createHTML().prepareForTemplates().templateCommand(ReplaceVersionsCommand(path.orEmpty()))
- }
- mapper["template_cmd"] = TemplateDirective(context.configuration, pathToRoot)
-
- if (page is ContentPage) {
- val sourceSets = page.content.withDescendants()
- .flatMap { it.sourceSets }
- .distinct()
- .sortedBy { it.comparableKey }
- .map { SourceSetModel(it.name, it.platform.key, it.sourceSetIDs.merged.toString()) }
- .toList()
-
- if (sourceSets.isNotEmpty()) {
- mapper["sourceSets"] = sourceSets
- }
- }
- return mapper
- }
-
- override fun buildSharedModel(): TemplateMap {
- val mapper = mutableMapOf<String, Any>()
-
- mapper["footerMessage"] =
- (configuration?.footerMessage?.takeIf(String::isNotBlank) ?: DokkaBaseConfiguration.defaultFooterMessage)
-
- configuration?.homepageLink?.takeIf(String::isNotBlank)?.let { mapper["homepageLink"] = it }
-
- return mapper
- }
-
- private val DisplaySourceSet.comparableKey
- get() = sourceSetIDs.merged.let { it.scopeId + it.sourceSetName }
- private val String.isAbsolute: Boolean
- get() = URI(this).isAbsolute
-
- private fun Appendable.resourcesForPage(pathToRoot: String, resources: List<String>): Unit =
- resources.forEach { resource ->
-
- val resourceHtml = with(createHTML()) {
- when {
-
- resource.URIExtension == "css" ->
- link(
- rel = LinkRel.stylesheet,
- href = if (resource.isAbsolute) resource else "$pathToRoot$resource"
- )
-
- resource.URIExtension == "js" ->
- script(
- type = ScriptType.textJavaScript,
- src = if (resource.isAbsolute) resource else "$pathToRoot$resource"
- ) {
- if (resource == "scripts/main.js" || resource.endsWith("_deferred.js"))
- defer = true
- else
- async = true
- }
-
- resource.isImage() -> link(href = if (resource.isAbsolute) resource else "$pathToRoot$resource")
- else -> null
- }
- }
- if (resourceHtml != null) {
- append(resourceHtml)
- }
- }
-
-}
-
-private class PrintDirective(val generateData: () -> String) : TemplateDirectiveModel {
- override fun execute(
- env: Environment,
- params: MutableMap<Any?, Any?>?,
- loopVars: Array<TemplateModel>?,
- body: TemplateDirectiveBody?
- ) {
- if (params?.isNotEmpty() == true) throw TemplateModelException(
- "Parameters are not allowed"
- )
- if (loopVars?.isNotEmpty() == true) throw TemplateModelException(
- "Loop variables are not allowed"
- )
- env.out.write(generateData())
- }
-}
-
-private class TemplateDirective(
- val configuration: DokkaConfiguration,
- val pathToRoot: String
-) : TemplateDirectiveModel {
- override fun execute(
- env: Environment,
- params: MutableMap<Any?, Any?>?,
- loopVars: Array<TemplateModel>?,
- body: TemplateDirectiveBody?
- ) {
- val commandName = params?.get(PARAM_NAME) ?: throw TemplateModelException(
- "The required $PARAM_NAME parameter is missing."
- )
- val replacement = (params[PARAM_REPLACEMENT] as? SimpleScalar)?.asString ?: TEMPLATE_REPLACEMENT
-
- when ((commandName as? SimpleScalar)?.asString) {
- "pathToRoot" -> {
- body ?: throw TemplateModelException(
- "No directive body for $commandName command."
- )
- executeSubstituteCommand(
- PathToRootSubstitutionCommand(
- replacement, pathToRoot
- ),
- "pathToRoot",
- pathToRoot,
- Context(env, body)
- )
- }
-
- "projectName" -> {
- body ?: throw TemplateModelException(
- "No directive body $commandName command."
- )
- executeSubstituteCommand(
- ProjectNameSubstitutionCommand(
- replacement, configuration.moduleName
- ),
- "projectName",
- configuration.moduleName,
- Context(env, body)
- )
- }
-
- else -> throw TemplateModelException(
- "The parameter $PARAM_NAME $commandName is unknown"
- )
- }
- }
-
- private data class Context(val env: Environment, val body: TemplateDirectiveBody)
-
- private fun executeSubstituteCommand(
- command: SubstitutionCommand,
- name: String,
- value: String,
- ctx: Context
- ) {
- if (configuration.delayTemplateSubstitution)
- ctx.env.out.templateCommandAsHtmlComment(command) {
- renderWithLocalVar(name, command.pattern, ctx)
- }
- else {
- renderWithLocalVar(name, value, ctx)
- }
- }
-
- private fun renderWithLocalVar(name: String, value: String, ctx: Context) =
- with(ctx) {
- env.setVariable(name, SimpleScalar(value))
- body.render(env.out)
- env.setVariable(name, null)
- }
-
- companion object {
- const val PARAM_NAME = "name"
- const val PARAM_REPLACEMENT = "replacement"
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelMerger.kt b/plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelMerger.kt
deleted file mode 100644
index 2f17183d..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/DefaultTemplateModelMerger.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.innerTemplating
-
-public class DefaultTemplateModelMerger : TemplateModelMerger {
- override fun invoke(
- factories: List<TemplateModelFactory>,
- buildModel: TemplateModelFactory.() -> TemplateMap
- ): TemplateMap {
- val mapper = mutableMapOf<String, Any?>()
- factories.map(buildModel).forEach { partialModel ->
- partialModel.forEach { (k, v) ->
- mapper[k] = v
- }
- }
- return mapper
- }
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/HtmlTemplater.kt b/plugins/base/src/main/kotlin/renderers/html/innerTemplating/HtmlTemplater.kt
deleted file mode 100644
index 1638c9c0..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/HtmlTemplater.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.innerTemplating
-
-import freemarker.cache.ClassTemplateLoader
-import freemarker.cache.FileTemplateLoader
-import freemarker.cache.MultiTemplateLoader
-import freemarker.log.Logger
-import freemarker.template.Configuration
-import freemarker.template.TemplateExceptionHandler
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.configuration
-import java.io.StringWriter
-
-
-public enum class DokkaTemplateTypes(
- public val path: String
-) {
- BASE("base.ftl")
-}
-
-public typealias TemplateMap = Map<String, Any?>
-
-public class HtmlTemplater(
- context: DokkaContext
-) {
-
- init {
- // to disable logging, but it isn't reliable see [Logger.SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY]
- // (use SLF4j further)
- System.setProperty(
- Logger.SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY,
- System.getProperty(Logger.SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY) ?: Logger.LIBRARY_NAME_NONE
- )
- }
-
- private val configuration = configuration<DokkaBase, DokkaBaseConfiguration>(context)
- private val templaterConfiguration =
- Configuration(Configuration.VERSION_2_3_31).apply { configureTemplateEngine() }
-
- private fun Configuration.configureTemplateEngine() {
- val loaderFromResources = ClassTemplateLoader(javaClass, "/dokka/templates")
- templateLoader = configuration?.templatesDir?.let {
- MultiTemplateLoader(
- arrayOf(
- FileTemplateLoader(it),
- loaderFromResources
- )
- )
- } ?: loaderFromResources
-
- unsetLocale()
- defaultEncoding = "UTF-8"
- templateExceptionHandler = TemplateExceptionHandler.RETHROW_HANDLER
- logTemplateExceptions = false
- wrapUncheckedExceptions = true
- fallbackOnNullLoopVariable = false
- templateUpdateDelayMilliseconds = Long.MAX_VALUE
- }
-
- public fun setupSharedModel(model: TemplateMap) {
- templaterConfiguration.setSharedVariables(model)
- }
-
- public fun renderFromTemplate(
- templateType: DokkaTemplateTypes,
- generateModel: () -> TemplateMap
- ): String {
- val out = StringWriter()
- // Freemarker has own thread-safe cache to keep templates
- val template = templaterConfiguration.getTemplate(templateType.path)
- val model = generateModel()
- template.process(model, out)
-
- return out.toString()
- }
-}
-
diff --git a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelFactory.kt b/plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelFactory.kt
deleted file mode 100644
index 3af11bf9..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelFactory.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.innerTemplating
-
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.pages.PageNode
-
-public interface TemplateModelFactory {
- public fun buildModel(
- page: PageNode,
- resources: List<String>,
- locationProvider: LocationProvider,
- content: String
- ): TemplateMap
-
- public fun buildSharedModel(): TemplateMap
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelMerger.kt b/plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelMerger.kt
deleted file mode 100644
index ada0c6cd..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/innerTemplating/TemplateModelMerger.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html.innerTemplating
-
-public fun interface TemplateModelMerger {
- public fun invoke(factories: List<TemplateModelFactory>, buildModel: TemplateModelFactory.() -> TemplateMap): TemplateMap
-}
diff --git a/plugins/base/src/main/kotlin/renderers/html/shouldRenderSourceSetBubbles.kt b/plugins/base/src/main/kotlin/renderers/html/shouldRenderSourceSetBubbles.kt
deleted file mode 100644
index a7bafadb..00000000
--- a/plugins/base/src/main/kotlin/renderers/html/shouldRenderSourceSetBubbles.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers.html
-
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.RootPageNode
-
-internal fun shouldRenderSourceSetTabs(page: RootPageNode): Boolean {
- return page.withDescendants()
- .flatMap { pageNode ->
- if (pageNode is ContentPage) pageNode.content.withDescendants()
- else emptySequence()
- }
- .flatMap { contentNode -> contentNode.sourceSets }
- .distinct()
- .count() > 1
-}
diff --git a/plugins/base/src/main/kotlin/renderers/pageId.kt b/plugins/base/src/main/kotlin/renderers/pageId.kt
deleted file mode 100644
index f5d75cfc..00000000
--- a/plugins/base/src/main/kotlin/renderers/pageId.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import org.jetbrains.dokka.base.renderers.html.NavigationNode
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.ContentPage
-
-internal val ContentPage.pageId: String
- get() = pageId(dri.first(), sourceSets())
-
-internal val NavigationNode.pageId: String
- get() = pageId(dri, sourceSets)
-
-@JvmName("shortenSourceSetsToUrl")
-internal fun Set<DisplaySourceSet>.shortenToUrl() =
- sortedBy { it.sourceSetIDs.merged.let { it.scopeId + it.sourceSetName } }.joinToString().hashCode()
-
-internal fun DRI.shortenToUrl() = toString()
-
-@JvmName("shortenDrisToUrl")
-internal fun Set<DRI>.shortenToUrl() = sortedBy { it.toString() }.joinToString().hashCode()
-
-/**
- * Page Id is required to have a sourceSet in order to distinguish between different pages that has same DRI but different sourceSet
- * like main functions that are not expect/actual
- */
-private fun pageId(dri: DRI, sourceSets: Set<DisplaySourceSet>): String = "${dri.shortenToUrl()}/${sourceSets.shortenToUrl()}"
diff --git a/plugins/base/src/main/kotlin/renderers/preprocessors.kt b/plugins/base/src/main/kotlin/renderers/preprocessors.kt
deleted file mode 100644
index a3a32651..00000000
--- a/plugins/base/src/main/kotlin/renderers/preprocessors.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.renderers
-
-import org.jetbrains.dokka.base.resolvers.shared.LinkFormat
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public object RootCreator : PageTransformer {
- override fun invoke(input: RootPageNode): RootPageNode =
- RendererSpecificRootPage("", listOf(input), RenderingStrategy.DoNothing)
-}
-
-public class PackageListCreator(
- public val context: DokkaContext,
- public val format: LinkFormat,
- public val outputFilesNames: List<String> = listOf("package-list")
-) : PageTransformer {
- override fun invoke(input: RootPageNode): RootPageNode {
- return input.transformPageNodeTree { pageNode ->
- pageNode.takeIf { it is ModulePage }?.let { it.modified(children = it.children + packageList(input, it as ModulePage)) } ?: pageNode
- }
- }
-
- private fun packageList(rootPageNode: RootPageNode, module: ModulePage): List<RendererSpecificPage> {
- val content = PackageListService(context, rootPageNode).createPackageList(
- module,
- format
- )
- return outputFilesNames.map { fileName ->
- RendererSpecificResourcePage(
- fileName,
- emptyList(),
- RenderingStrategy.Write(content)
- )
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt b/plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt
deleted file mode 100644
index c9218947..00000000
--- a/plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.anchors
-
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.ExtraProperty
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.pages.Kind
-
-public data class SymbolAnchorHint(val anchorName: String, val contentKind: Kind) : ExtraProperty<ContentNode> {
- override val key: ExtraProperty.Key<ContentNode, SymbolAnchorHint> = SymbolAnchorHint
-
- public companion object : ExtraProperty.Key<ContentNode, SymbolAnchorHint> {
- public fun from(d: Documentable, contentKind: Kind): SymbolAnchorHint? =
- d.name?.let { SymbolAnchorHint(it, contentKind) }
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProvider.kt
deleted file mode 100644
index 32825303..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProvider.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external
-
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider.Companion.identifierToFilename
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public open class DefaultExternalLocationProvider(
- public val externalDocumentation: ExternalDocumentation,
- public val extension: String,
- public val dokkaContext: DokkaContext
-) : ExternalLocationProvider {
- public val docURL: String = externalDocumentation.documentationURL.toString().removeSuffix("/") + "/"
-
- override fun resolve(dri: DRI): String? {
- externalDocumentation.packageList.locations[dri.toString()]?.let { path -> return "$docURL$path" }
-
- if (dri.packageName !in externalDocumentation.packageList.packages)
- return null
-
- return dri.constructPath()
- }
-
- protected open fun DRI.constructPath(): String {
- val modulePart = packageName?.let { packageName ->
- externalDocumentation.packageList.moduleFor(packageName)?.let {
- if (it.isNotBlank())
- "$it/"
- else
- ""
- }
- }.orEmpty()
-
- val docWithModule = docURL + modulePart
- val classNamesChecked = classNames ?: return "$docWithModule${packageName ?: ""}/index$extension"
- val classLink = (listOfNotNull(packageName) + classNamesChecked.split('.'))
- .joinToString("/", transform = ::identifierToFilename)
-
- val fileName = callable?.let { identifierToFilename(it.name) } ?: "index"
- return "$docWithModule$classLink/$fileName$extension"
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProviderFactory.kt
deleted file mode 100644
index 09ddca01..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/DefaultExternalLocationProviderFactory.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external
-
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class DefaultExternalLocationProviderFactory(
- public val context: DokkaContext,
-) : ExternalLocationProviderFactory by ExternalLocationProviderFactoryWithCache(
- { doc ->
- when (doc.packageList.linkFormat) {
- RecognizedLinkFormat.KotlinWebsite,
- RecognizedLinkFormat.KotlinWebsiteHtml,
- RecognizedLinkFormat.DokkaOldHtml,
- -> Dokka010ExternalLocationProvider(doc, ".html", context)
-
- RecognizedLinkFormat.DokkaHtml -> DefaultExternalLocationProvider(doc, ".html", context)
- RecognizedLinkFormat.DokkaGFM,
- RecognizedLinkFormat.DokkaJekyll,
- -> DefaultExternalLocationProvider(doc, ".md", context)
-
- else -> null
- }
- }
-)
diff --git a/plugins/base/src/main/kotlin/resolvers/external/Dokka010ExternalLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/external/Dokka010ExternalLocationProvider.kt
deleted file mode 100644
index f887c9bc..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/Dokka010ExternalLocationProvider.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external
-
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider.Companion.identifierToFilename
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public open class Dokka010ExternalLocationProvider(
- public val externalDocumentation: ExternalDocumentation,
- public val extension: String,
- public val dokkaContext: DokkaContext
-) : ExternalLocationProvider {
- public val docURL: String = externalDocumentation.documentationURL.toString().removeSuffix("/") + "/"
-
- override fun resolve(dri: DRI): String? {
-
- val fqName = listOfNotNull(
- dri.packageName.takeIf { it?.isNotBlank() == true },
- dri.classNames.takeIf { it?.isNotBlank() == true }?.removeCompanion()
- ).joinToString(".")
- val relocationId =
- fqName.let { if (dri.callable != null) it + "$" + dri.callable!!.toOldString() else it }
- externalDocumentation.packageList.locations[relocationId]?.let { path -> return "$docURL$path" }
-
- if (dri.packageName !in externalDocumentation.packageList.packages)
- return null
-
- val classNamesChecked = dri.classNames?.removeCompanion()
- ?: return "$docURL${dri.packageName ?: ""}/index$extension"
-
- val classLink = (listOfNotNull(dri.packageName) + classNamesChecked.split('.'))
- .joinToString("/", transform = ::identifierToFilename)
-
- val callableChecked = dri.callable ?: return "$docURL$classLink/index$extension"
- return "$docURL$classLink/" + identifierToFilename(callableChecked.name) + extension
- }
-
- private fun String.removeCompanion() = removeSuffix(".Companion")
-
- private fun Callable.toOldString() = name + params.joinToString(", ", "(", ")") + (receiver?.let { "#$it" } ?: "")
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProvider.kt
deleted file mode 100644
index 238b6342..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProvider.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external
-
-import org.jetbrains.dokka.links.DRI
-
-/**
- * Provides the path to the page documenting a [DRI] in an external documentation source
- */
-public fun interface ExternalLocationProvider {
- /**
- * @return Path to the page containing the [dri] or null if the path cannot be created
- * (eg. when the package-list does not contain [dri]'s package)
- */
- public fun resolve(dri: DRI): String?
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt
deleted file mode 100644
index 952f4d51..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactory.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external
-
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-
-public fun interface ExternalLocationProviderFactory {
- public fun getExternalLocationProvider(doc: ExternalDocumentation): ExternalLocationProvider?
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactoryWithCache.kt b/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactoryWithCache.kt
deleted file mode 100644
index 0b56e174..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/ExternalLocationProviderFactoryWithCache.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external
-
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import java.util.concurrent.ConcurrentHashMap
-
-public class ExternalLocationProviderFactoryWithCache(
- public val ext: ExternalLocationProviderFactory
-) : ExternalLocationProviderFactory {
-
- private val locationProviders = ConcurrentHashMap<ExternalDocumentation, CacheWrapper>()
-
- override fun getExternalLocationProvider(doc: ExternalDocumentation): ExternalLocationProvider? =
- locationProviders.getOrPut(doc) { CacheWrapper(ext.getExternalLocationProvider(doc)) }.provider
-
- private class CacheWrapper(val provider: ExternalLocationProvider?)
-}
-
diff --git a/plugins/base/src/main/kotlin/resolvers/external/javadoc/AndroidExternalLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/external/javadoc/AndroidExternalLocationProvider.kt
deleted file mode 100644
index 8c18be0c..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/javadoc/AndroidExternalLocationProvider.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external.javadoc
-
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public open class AndroidExternalLocationProvider(
- externalDocumentation: ExternalDocumentation,
- dokkaContext: DokkaContext
-) : JavadocExternalLocationProvider(externalDocumentation, "", "", dokkaContext) {
-
- override fun anchorPart(callable: Callable): String = callable.name.toLowerCase()
-
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt
deleted file mode 100644
index 65ee0e02..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external.javadoc
-
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.DRIExtraContainer
-import org.jetbrains.dokka.links.EnumEntryDRIExtra
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.utilities.htmlEscape
-
-public open class JavadocExternalLocationProvider(
- externalDocumentation: ExternalDocumentation,
- public val brackets: String,
- public val separator: String,
- dokkaContext: DokkaContext
-) : DefaultExternalLocationProvider(externalDocumentation, ".html", dokkaContext) {
-
- override fun DRI.constructPath(): String {
- val packageLink = packageName?.replace(".", "/")
- val modulePart = packageName?.let { packageName ->
- externalDocumentation.packageList.moduleFor(packageName)?.let {
- if (it.isNotBlank())
- "$it/"
- else
- ""
- }
- }.orEmpty()
-
- val docWithModule = docURL + modulePart
-
- if (classNames == null) {
- return "$docWithModule$packageLink/package-summary$extension".htmlEscape()
- }
-
- if (DRIExtraContainer(extra)[EnumEntryDRIExtra] != null) {
- val lastIndex = classNames?.lastIndexOf(".") ?: 0
- val (classSplit, enumEntityAnchor) =
- classNames?.substring(0, lastIndex) to classNames?.substring(lastIndex + 1)
-
- val classLink =
- if (packageLink == null) "${classSplit}$extension" else "$packageLink/${classSplit}$extension"
- return "$docWithModule$classLink#$enumEntityAnchor".htmlEscape()
- }
-
- val classLink = if (packageLink == null) "${classNames}$extension" else "$packageLink/${classNames}$extension"
- val callableChecked = callable ?: return "$docWithModule$classLink".htmlEscape()
-
- return ("$docWithModule$classLink#" + anchorPart(callableChecked)).htmlEscape()
- }
-
- protected open fun anchorPart(callable: Callable): String {
- return callable.name +
- "${brackets.first()}" +
- callable.params.joinToString(separator) +
- "${brackets.last()}"
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProviderFactory.kt
deleted file mode 100644
index dc184e49..00000000
--- a/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProviderFactory.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.external.javadoc
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.androidSdk
-import org.jetbrains.dokka.androidX
-import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProviderFactoryWithCache
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class JavadocExternalLocationProviderFactory(
- public val context: DokkaContext,
-) : ExternalLocationProviderFactory by ExternalLocationProviderFactoryWithCache(
- { doc ->
- when (doc.packageList.url) {
- DokkaConfiguration.ExternalDocumentationLink.androidX().packageListUrl,
- DokkaConfiguration.ExternalDocumentationLink.androidSdk().packageListUrl,
- ->
- AndroidExternalLocationProvider(doc, context)
-
- else ->
- when (doc.packageList.linkFormat) {
- RecognizedLinkFormat.Javadoc1 ->
- JavadocExternalLocationProvider(doc, "()", ", ", context) // Covers JDK 1 - 7
- RecognizedLinkFormat.Javadoc8 ->
- JavadocExternalLocationProvider(doc, "--", "-", context) // Covers JDK 8 - 9
- RecognizedLinkFormat.Javadoc10,
- RecognizedLinkFormat.DokkaJavadoc,
- ->
- JavadocExternalLocationProvider(doc, "()", ",", context) // Covers JDK 10
- else -> null
- }
- }
- }
-)
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
deleted file mode 100644
index 24d0f13e..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.external.Dokka010ExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.external.javadoc.AndroidExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.external.javadoc.JavadocExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-
-public abstract class DefaultLocationProvider(
- protected val pageGraphRoot: RootPageNode,
- protected val dokkaContext: DokkaContext
-) : LocationProvider {
- protected val externalLocationProviderFactories: List<ExternalLocationProviderFactory> =
- dokkaContext.plugin<DokkaBase>().query { externalLocationProviderFactory }
-
- protected val externalLocationProviders: Map<ExternalDocumentation, ExternalLocationProvider?> = dokkaContext
- .configuration
- .sourceSets
- .flatMap { sourceSet ->
- sourceSet.externalDocumentationLinks.map {
- PackageList.load(it.packageListUrl, sourceSet.jdkVersion, dokkaContext.configuration.offlineMode)
- ?.let { packageList -> ExternalDocumentation(it.url, packageList) }
- }
- }
- .filterNotNull().associateWith { extDocInfo ->
- externalLocationProviderFactories
- .mapNotNull { it.getExternalLocationProvider(extDocInfo) }
- .firstOrNull()
- ?: run { dokkaContext.logger.error("No ExternalLocationProvider for '${extDocInfo.packageList.url}' found"); null }
- }
-
- protected val packagesIndex: Map<String, ExternalLocationProvider?> =
- externalLocationProviders
- .flatMap { (extDocInfo, externalLocationProvider) ->
- extDocInfo.packageList.packages.map { packageName -> packageName to externalLocationProvider }
- }.groupBy { it.first }.mapValues { (_, lst) ->
- lst.map { it.second }
- .sortedWith(compareBy(nullsLast(ExternalLocationProviderOrdering)) { it })
- .firstOrNull()
- }
- .filterKeys(String::isNotBlank)
-
-
- protected val locationsIndex: Map<String, ExternalLocationProvider?> = externalLocationProviders
- .flatMap { (extDocInfo, externalLocationProvider) ->
- extDocInfo.packageList.locations.keys.map { relocatedDri -> relocatedDri to externalLocationProvider }
- }
- .toMap()
- .filterKeys(String::isNotBlank)
-
- protected open fun getExternalLocation(dri: DRI, sourceSets: Set<DisplaySourceSet>): String? =
- packagesIndex[dri.packageName]?.resolve(dri)
- ?: locationsIndex[dri.toString()]?.resolve(dri)
- ?: externalLocationProviders.values.mapNotNull { it?.resolve(dri) }.firstOrNull()
-
- private object ExternalLocationProviderOrdering : Comparator<ExternalLocationProvider> {
- private val desiredOrdering = listOf(
- DefaultExternalLocationProvider::class,
- Dokka010ExternalLocationProvider::class,
- AndroidExternalLocationProvider::class,
- JavadocExternalLocationProvider::class
- )
-
- override fun compare(o1: ExternalLocationProvider, o2: ExternalLocationProvider): Int =
- desiredOrdering.indexOf(o1::class).compareTo(desiredOrdering.indexOf(o2::class))
- }
-
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaBaseLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaBaseLocationProvider.kt
deleted file mode 100644
index ca3786ad..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/DokkaBaseLocationProvider.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.base.renderers.shortenToUrl
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.DCI
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.utilities.urlEncoded
-
-public abstract class DokkaBaseLocationProvider(
- pageGraphRoot: RootPageNode,
- dokkaContext: DokkaContext
-) : DefaultLocationProvider(pageGraphRoot, dokkaContext) {
-
- /**
- * Anchors should be unique and should contain sourcesets, dri and contentKind.
- * The idea is to make them as short as possible and just use a hashCode from sourcesets in order to match the
- * 2040 characters limit
- */
- public open fun anchorForDCI(dci: DCI, sourceSets: Set<DisplaySourceSet>): String =
- (dci.dri.shortenToUrl().toString() + "/" + dci.kind + "/" + sourceSets.shortenToUrl()).urlEncoded()
-
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
deleted file mode 100644
index aedbfb88..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.util.*
-
-public open class DokkaLocationProvider(
- pageGraphRoot: RootPageNode,
- dokkaContext: DokkaContext,
- public val extension: String = ".html"
-) : DokkaBaseLocationProvider(pageGraphRoot, dokkaContext) {
- protected open val PAGE_WITH_CHILDREN_SUFFIX: String = "index"
-
- protected open val pathsIndex: Map<PageNode, List<String>> = IdentityHashMap<PageNode, List<String>>().apply {
- fun registerPath(page: PageNode, prefix: List<String>) {
- if (page is RootPageNode && page.forceTopLevelName) {
- put(page, prefix + PAGE_WITH_CHILDREN_SUFFIX)
- page.children.forEach { registerPath(it, prefix) }
- } else {
- val newPrefix = prefix + page.pathName
- put(page, if (page is ModulePageNode) prefix else newPrefix)
- page.children.forEach { registerPath(it, newPrefix) }
- }
-
- }
- put(pageGraphRoot, emptyList())
- pageGraphRoot.children.forEach { registerPath(it, emptyList()) }
- }
-
- protected val pagesIndex: Map<DRIWithSourceSets, ContentPage> =
- pageGraphRoot.withDescendants().filterIsInstance<ContentPage>()
- .flatMap { page ->
- page.dri.flatMap { dri ->
- page.sourceSets().ifEmpty { setOf(null) }
- .map { sourceSet -> DRIWithSourceSets(dri, setOfNotNull(sourceSet)) to page }
- .let {
- if (it.size > 1) {
- it + (DRIWithSourceSets(dri, page.sourceSets()) to page)
- } else {
- it
- }
- }
- }
- }
- .groupingBy { it.first }
- .aggregate { key, _, (_, page), first ->
- if (first) page else throw AssertionError("Multiple pages associated with key: ${key.dri}/${key.sourceSet}")
- }
-
- protected val anchorsIndex: Map<DRIWithSourceSets, PageWithKind> =
- pageGraphRoot.withDescendants().filterIsInstance<ContentPage>()
- .flatMap { page ->
- page.content.withDescendants()
- .filter { it.extra[SymbolAnchorHint] != null && it.dci.dri.any() }
- .flatMap { content ->
- content.dci.dri.map { dri ->
- (dri to content.sourceSets) to content.extra[SymbolAnchorHint]?.contentKind!!
- }
- }
- .distinct()
- .flatMap { (pair, kind) ->
- val (dri, sourceSets) = pair
- sourceSets.ifEmpty { setOf(null) }.map { sourceSet ->
- DRIWithSourceSets(dri, setOfNotNull(sourceSet)) to PageWithKind(page, kind)
- }
- }
- }.toMap()
-
- override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean): String =
- pathTo(node, context) + if (!skipExtension) extension else ""
-
- override fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode?): String? =
- sourceSets.ifEmpty { setOf(null) }.mapNotNull { sourceSet ->
- val driWithSourceSets = DRIWithSourceSets(dri, setOfNotNull(sourceSet))
- getLocalLocation(driWithSourceSets, context)
- ?: getLocalLocation(driWithSourceSets.copy(dri = dri.copy(target = PointingToDeclaration)), context)
- // Not found in PageGraph, that means it's an external link
- ?: getExternalLocation(dri, sourceSets)
- ?: getExternalLocation(dri.copy(target = PointingToDeclaration), sourceSets)
- }.distinct().singleOrNull()
-
- private fun getLocalLocation(driWithSourceSets: DRIWithSourceSets, context: PageNode?): String? {
- val (dri, originalSourceSet) = driWithSourceSets
- val allSourceSets: List<Set<DisplaySourceSet>> =
- listOf(originalSourceSet) + originalSourceSet.let { oss ->
- val ossIds = oss.computeSourceSetIds()
- dokkaContext.configuration.sourceSets.filter { it.sourceSetID in ossIds }
- .flatMap { it.dependentSourceSets }
- .mapNotNull { ssid ->
- dokkaContext.configuration.sourceSets.find { it.sourceSetID == ssid }?.toDisplaySourceSet()
- }.map {
- setOf(it)
- }
- }
-
- return getLocalPageLink(dri, allSourceSets, context)
- ?: getLocalAnchor(dri, allSourceSets, context)
- }
-
- private fun getLocalPageLink(dri: DRI, allSourceSets: Iterable<Set<DisplaySourceSet>>, context: PageNode?) =
- allSourceSets.mapNotNull { displaySourceSet ->
- pagesIndex[DRIWithSourceSets(dri, displaySourceSet)]
- }.firstOrNull()?.let { page -> resolve(page, context) }
-
- private fun getLocalAnchor(dri: DRI, allSourceSets: Iterable<Set<DisplaySourceSet>>, context: PageNode?) =
- allSourceSets.mapNotNull { displaySourceSet ->
- anchorsIndex[DRIWithSourceSets(dri, displaySourceSet)]?.let { (page, kind) ->
- val dci = DCI(setOf(dri), kind)
- resolve(page, context) + "#" + anchorForDCI(dci, displaySourceSet)
- }
- }.firstOrNull()
-
- override fun pathToRoot(from: PageNode): String =
- pathTo(pageGraphRoot, from).removeSuffix(PAGE_WITH_CHILDREN_SUFFIX)
-
- override fun ancestors(node: PageNode): List<PageNode> =
- generateSequence(node) { it.parent() }.toList()
-
- protected open fun pathTo(node: PageNode, context: PageNode?): String {
- fun pathFor(page: PageNode) = pathsIndex[page] ?: throw AssertionError(
- "${page::class.simpleName}(${page.name}) does not belong to the current page graph so it is impossible to compute its path"
- )
-
- val nodePath = pathFor(node)
- val contextPath = context?.let { pathFor(it) }.orEmpty()
- val endedContextPath = if (context?.isIndexPage() == false)
- contextPath.toMutableList().also { it.removeLastOrNull() }
- else contextPath
-
- val commonPathElements = nodePath.asSequence().zip(endedContextPath.asSequence())
- .takeWhile { (a, b) -> a == b }.count()
-
- return (List(endedContextPath.size - commonPathElements) { ".." } + nodePath.drop(commonPathElements) +
- if (node.isIndexPage())
- listOf(PAGE_WITH_CHILDREN_SUFFIX)
- else
- emptyList()
- ).joinToString("/")
- }
-
- private fun PageNode.isIndexPage() = this is ClasslikePageNode || children.isNotEmpty()
-
- private fun PageNode.parent() = pageGraphRoot.parentMap[this]
-
- private val PageNode.pathName: String
- get() = if (this is PackagePageNode || this is RendererSpecificResourcePage) name else identifierToFilename(name)
-
- protected data class DRIWithSourceSets(val dri: DRI, val sourceSet: Set<DisplaySourceSet>)
-
- protected data class PageWithKind(val page: ContentPage, val kind: Kind)
-
- public companion object {
- public val reservedFilenames: Set<String> = setOf("index", "con", "aux", "lst", "prn", "nul", "eof", "inp", "out")
-
- //Taken from: https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
- internal val reservedCharacters = setOf('|', '>', '<', '*', ':', '"', '?', '%')
-
- public fun identifierToFilename(name: String): String {
- if (name.isEmpty()) return "--root--"
- return sanitizeFileName(name, reservedFilenames, reservedCharacters)
- }
- }
-}
-
-internal fun sanitizeFileName(name: String, reservedFileNames: Set<String>, reservedCharacters: Set<Char>): String {
- val lowercase = name.replace("[A-Z]".toRegex()) { matchResult -> "-" + matchResult.value.toLowerCase() }
- val withoutReservedFileNames = if (lowercase in reservedFileNames) "--$lowercase--" else lowercase
- return reservedCharacters.fold(withoutReservedFileNames) { acc, character ->
- if (character in acc) acc.replace(character.toString(), "[${character.toInt()}]")
- else acc
- }
-}
-
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt
deleted file mode 100644
index bd9fa1bb..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.util.concurrent.ConcurrentHashMap
-
-public class DokkaLocationProviderFactory(
- private val context: DokkaContext
-) : LocationProviderFactory {
- private val cache = ConcurrentHashMap<CacheWrapper, LocationProvider>()
-
- override fun getLocationProvider(pageNode: RootPageNode): LocationProvider {
- return cache.computeIfAbsent(CacheWrapper(pageNode)) {
- DokkaLocationProvider(pageNode, context)
- }
- }
-
- private class CacheWrapper(val pageNode: RootPageNode) {
- override fun equals(other: Any?) = other is CacheWrapper && other.pageNode == this.pageNode
- override fun hashCode() = System.identityHashCode(pageNode)
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt
deleted file mode 100644
index dbcd5c76..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.DokkaException
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider.Companion.identifierToFilename
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.PageNode
-
-public interface LocationProvider {
- public fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode? = null): String?
- public fun resolve(node: PageNode, context: PageNode? = null, skipExtension: Boolean = false): String?
- public fun pathToRoot(from: PageNode): String
- public fun ancestors(node: PageNode): List<PageNode>
-
- /**
- * This method should return guessed filesystem location for a given [DRI]
- * It is used to decide if a [DRI] should be present in the relocation list of the
- * generated package-list so it is ok if the path differs from the one returned by [resolve]
- * @return Path to a giver [DRI] or null if path should not be considered for relocations
- */
- public fun expectedLocationForDri(dri: DRI): String =
- (listOf(dri.packageName) +
- dri.classNames?.split(".")?.map { identifierToFilename(it) }.orEmpty() +
- listOf(dri.callable?.let { identifierToFilename(it.name) } ?: "index")
- ).filterNotNull().joinToString("/")
-}
-
-public fun LocationProvider.resolveOrThrow(
- dri: DRI, sourceSets: Set<DisplaySourceSet>,
- context: PageNode? = null
-): String {
- return resolve(dri = dri, sourceSets = sourceSets, context = context)
- ?: throw DokkaException("Cannot resolve path for $dri")
-}
-
-public fun LocationProvider.resolveOrThrow(
- node: PageNode,
- context: PageNode? = null,
- skipExtension: Boolean = false
-): String {
- return resolve(node = node, context = context, skipExtension = skipExtension)
- ?: throw DokkaException("Cannot resolve path for ${node.name}")
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt
deleted file mode 100644
index 31cac868..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.pages.RootPageNode
-
-public fun interface LocationProviderFactory {
- public fun getLocationProvider(pageNode: RootPageNode): LocationProvider
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentation.kt b/plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentation.kt
deleted file mode 100644
index db0c5492..00000000
--- a/plugins/base/src/main/kotlin/resolvers/shared/ExternalDocumentation.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.shared
-
-import java.net.URL
-
-public data class ExternalDocumentation(val documentationURL: URL, val packageList: PackageList)
diff --git a/plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt b/plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt
deleted file mode 100644
index 4f0d4932..00000000
--- a/plugins/base/src/main/kotlin/resolvers/shared/LinkFormat.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.shared
-
-public interface LinkFormat {
- public val formatName: String
- public val linkExtension: String
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt b/plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt
deleted file mode 100644
index 8297f875..00000000
--- a/plugins/base/src/main/kotlin/resolvers/shared/PackageList.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.shared
-
-import java.net.URL
-
-public typealias Module = String
-
-public data class PackageList(
- val linkFormat: RecognizedLinkFormat,
- val modules: Map<Module, Set<String>>,
- val locations: Map<String, String>,
- val url: URL
-) {
- val packages: Set<String>
- get() = modules.values.flatten().toSet()
-
- public fun moduleFor(packageName: String): Module? {
- return modules.asSequence()
- .filter { it.value.contains(packageName) }
- .firstOrNull()?.key
- }
-
- public companion object {
- public const val PACKAGE_LIST_NAME: String = "package-list"
- public const val MODULE_DELIMITER: String = "module:"
- public const val DOKKA_PARAM_PREFIX: String = "\$dokka"
- public const val SINGLE_MODULE_NAME: String = ""
-
- public fun load(url: URL, jdkVersion: Int, offlineMode: Boolean = false): PackageList? {
- if (offlineMode && url.protocol.toLowerCase() != "file")
- return null
-
- val packageListStream = runCatching { url.readContent() }.onFailure {
- println("Failed to download package-list from $url, this might suggest that remote resource is not available," +
- " module is empty or dokka output got corrupted")
- return null
- }.getOrThrow()
-
- val (params, packages) = packageListStream
- .bufferedReader()
- .useLines { lines -> lines.partition { it.startsWith(DOKKA_PARAM_PREFIX) } }
-
- val paramsMap = splitParams(params)
- val format = linkFormat(paramsMap["format"]?.singleOrNull(), jdkVersion)
- val locations = splitLocations(paramsMap["location"].orEmpty()).filterKeys(String::isNotEmpty)
-
- val modulesMap = splitPackages(packages)
- return PackageList(format, modulesMap, locations, url)
- }
-
- private fun splitParams(params: List<String>) = params.asSequence()
- .map { it.removePrefix("$DOKKA_PARAM_PREFIX.").split(":", limit = 2) }
- .groupBy({ (key, _) -> key }, { (_, value) -> value })
-
- private fun splitLocations(locations: List<String>) = locations.map { it.split("\u001f", limit = 2) }
- .associate { (key, value) -> key to value }
-
- private fun splitPackages(packages: List<String>): Map<Module, Set<String>> =
- packages.fold(("" to mutableMapOf<Module, Set<String>>())) { (lastModule, acc), el ->
- val currentModule : String
- when {
- el.startsWith(MODULE_DELIMITER) -> currentModule = el.substringAfter(MODULE_DELIMITER)
- el.isNotBlank() -> {
- currentModule = lastModule
- acc[currentModule] = acc.getOrDefault(lastModule, emptySet()) + el
- }
- else -> currentModule = lastModule
- }
- currentModule to acc
- }.second
-
- private fun linkFormat(formatName: String?, jdkVersion: Int) =
- formatName?.let { RecognizedLinkFormat.fromString(it) }
- ?: when {
- jdkVersion < 8 -> RecognizedLinkFormat.Javadoc1 // Covers JDK 1 - 7
- jdkVersion < 10 -> RecognizedLinkFormat.Javadoc8 // Covers JDK 8 - 9
- else -> RecognizedLinkFormat.Javadoc10 // Covers JDK 10+
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt b/plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt
deleted file mode 100644
index 4810c9e5..00000000
--- a/plugins/base/src/main/kotlin/resolvers/shared/RecognizedLinkFormat.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.shared
-
-public enum class RecognizedLinkFormat(
- override val formatName: String,
- override val linkExtension: String
-) : LinkFormat {
- DokkaHtml("html-v1", "html"),
- DokkaJavadoc("javadoc-v1", "html"),
- DokkaGFM("gfm-v1", "md"),
- DokkaJekyll("jekyll-v1", "html"),
- Javadoc1("javadoc1", "html"),
- Javadoc8("javadoc8", "html"),
- Javadoc10("javadoc10", "html"),
- DokkaOldHtml("html", "html"),
- KotlinWebsite("kotlin-website", "html"),
- KotlinWebsiteHtml("kotlin-website-html", "html");
-
- public companion object {
- private val values = values()
-
- public fun fromString(formatName: String): RecognizedLinkFormat? {
- return values.firstOrNull { it.formatName == formatName }
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/shared/utils.kt b/plugins/base/src/main/kotlin/resolvers/shared/utils.kt
deleted file mode 100644
index a6d9afc6..00000000
--- a/plugins/base/src/main/kotlin/resolvers/shared/utils.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.resolvers.shared
-
-import java.io.InputStream
-import java.net.HttpURLConnection
-import java.net.URL
-import java.net.URLConnection
-
-internal fun URL.readContent(timeout: Int = 10000, redirectsAllowed: Int = 16): InputStream {
- fun URL.doOpenConnection(timeout: Int, redirectsAllowed: Int): URLConnection {
- val connection = this.openConnection().apply {
- connectTimeout = timeout
- readTimeout = timeout
- }
-
- when (connection) {
- is HttpURLConnection -> return when (connection.responseCode) {
- in 200..299 -> connection
-
- HttpURLConnection.HTTP_MOVED_PERM,
- HttpURLConnection.HTTP_MOVED_TEMP,
- HttpURLConnection.HTTP_SEE_OTHER -> {
- if (redirectsAllowed > 0) {
- val newUrl = connection.getHeaderField("Location")
- URL(newUrl).doOpenConnection(timeout, redirectsAllowed - 1)
- } else {
- throw RuntimeException("Too many redirects")
- }
- }
-
- else -> throw RuntimeException("Unhandled HTTP code: ${connection.responseCode}")
- }
-
- else -> return connection
- }
- }
- return doOpenConnection(timeout, redirectsAllowed).getInputStream()
-}
diff --git a/plugins/base/src/main/kotlin/signatures/JvmSignatureUtils.kt b/plugins/base/src/main/kotlin/signatures/JvmSignatureUtils.kt
deleted file mode 100644
index e5f85803..00000000
--- a/plugins/base/src/main/kotlin/signatures/JvmSignatureUtils.kt
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.signatures
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.drisOfAllNestedBounds
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.AnnotationTarget
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-
-public interface JvmSignatureUtils {
-
- public fun PageContentBuilder.DocumentableContentBuilder.annotationsBlock(d: AnnotationTarget)
-
- public fun PageContentBuilder.DocumentableContentBuilder.annotationsInline(d: AnnotationTarget)
-
- public fun <T : Documentable> WithExtraProperties<T>.modifiers(): SourceSetDependent<Set<ExtraModifiers>>
-
- public fun Collection<ExtraModifiers>.toSignatureString(): String =
- joinToString("") { it.name.toLowerCase() + " " }
-
- @Suppress("UNCHECKED_CAST")
- public fun Documentable.annotations(): Map<DokkaSourceSet, List<Annotations.Annotation>> {
- return (this as? WithExtraProperties<Documentable>)?.annotations() ?: emptyMap()
- }
-
- public fun <T : AnnotationTarget> WithExtraProperties<T>.annotations(): SourceSetDependent<List<Annotations.Annotation>> =
- extra[Annotations]?.directAnnotations ?: emptyMap()
-
- @Suppress("UNCHECKED_CAST")
- public operator fun <T : Iterable<*>> SourceSetDependent<T>.plus(other: SourceSetDependent<T>): SourceSetDependent<T> {
- return LinkedHashMap(this).apply {
- for ((k, v) in other) {
- put(k, get(k).let { if (it != null) (it + v) as T else v })
- }
- }
- }
-
- public fun DProperty.annotations(): SourceSetDependent<List<Annotations.Annotation>> {
- return (extra[Annotations]?.directAnnotations ?: emptyMap()) +
- (getter?.annotations() ?: emptyMap()).mapValues { it.value.map { it.copy( scope = Annotations.AnnotationScope.GETTER) } } +
- (setter?.annotations() ?: emptyMap()).mapValues { it.value.map { it.copy( scope = Annotations.AnnotationScope.SETTER) } }
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.annotations(
- d: AnnotationTarget,
- ignored: Set<Annotations.Annotation>,
- styles: Set<Style>,
- operation: PageContentBuilder.DocumentableContentBuilder.(Annotations.Annotation) -> Unit
- ): Unit = when (d) {
- is DFunction -> d.annotations()
- is DProperty -> d.annotations()
- is DClass -> d.annotations()
- is DInterface -> d.annotations()
- is DObject -> d.annotations()
- is DEnum -> d.annotations()
- is DAnnotation -> d.annotations()
- is DTypeParameter -> d.annotations()
- is DEnumEntry -> d.annotations()
- is DTypeAlias -> d.annotations()
- is DParameter -> d.annotations()
- is TypeParameter -> d.annotations()
- is GenericTypeConstructor -> d.annotations()
- is FunctionalTypeConstructor -> d.annotations()
- is JavaObject -> d.annotations()
- else -> null
- }?.let {
- it.entries.forEach {
- it.value.filter { it !in ignored && it.mustBeDocumented }.takeIf { it.isNotEmpty() }?.let { annotations ->
- group(sourceSets = setOf(it.key), styles = styles, kind = ContentKind.Annotations) {
- annotations.forEach {
- operation(it)
- }
- }
- }
- }
- } ?: Unit
-
- public fun PageContentBuilder.DocumentableContentBuilder.toSignatureString(
- a: Annotations.Annotation,
- renderAtStrategy: AtStrategy,
- listBrackets: Pair<Char, Char>,
- classExtension: String
- ) {
-
- when (renderAtStrategy) {
- is All, is OnlyOnce -> {
- when(a.scope) {
- Annotations.AnnotationScope.GETTER -> text("@get:", styles = mainStyles + TokenStyle.Annotation)
- Annotations.AnnotationScope.SETTER -> text("@set:", styles = mainStyles + TokenStyle.Annotation)
- else -> text("@", styles = mainStyles + TokenStyle.Annotation)
- }
- link(a.dri.classNames!!, a.dri, styles = mainStyles + TokenStyle.Annotation)
- }
- is Never -> link(a.dri.classNames!!, a.dri)
- }
- val isNoWrappedBrackets = a.params.entries.isEmpty() && renderAtStrategy is OnlyOnce
- listParams(
- a.params.entries,
- if (isNoWrappedBrackets) null else Pair('(', ')')
- ) {
- text(it.key)
- text(" = ", styles = mainStyles + TokenStyle.Operator)
- when (renderAtStrategy) {
- is All -> All
- is Never, is OnlyOnce -> Never
- }.let { strategy ->
- valueToSignature(it.value, strategy, listBrackets, classExtension)
- }
- }
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.valueToSignature(
- a: AnnotationParameterValue,
- renderAtStrategy: AtStrategy,
- listBrackets: Pair<Char, Char>,
- classExtension: String
- ): Unit = when (a) {
- is AnnotationValue -> toSignatureString(a.annotation, renderAtStrategy, listBrackets, classExtension)
- is ArrayValue -> {
- listParams(a.value, listBrackets) { valueToSignature(it, renderAtStrategy, listBrackets, classExtension) }
- }
- is EnumValue -> link(a.enumName, a.enumDri)
- is ClassValue -> link(a.className + classExtension, a.classDRI)
- is StringValue -> group(styles = setOf(TextStyle.Breakable)) { stringLiteral( "\"${a.text()}\"") }
- is BooleanValue -> group(styles = setOf(TextStyle.Breakable)) { booleanLiteral(a.value) }
- is LiteralValue -> group(styles = setOf(TextStyle.Breakable)) { constant(a.text()) }
- }
-
- private fun<T> PageContentBuilder.DocumentableContentBuilder.listParams(
- params: Collection<T>,
- listBrackets: Pair<Char, Char>?,
- outFn: PageContentBuilder.DocumentableContentBuilder.(T) -> Unit
- ) {
- listBrackets?.let{ punctuation(it.first.toString()) }
- params.forEachIndexed { i, it ->
- group(styles = setOf(TextStyle.BreakableAfter)) {
- this.outFn(it)
- if (i != params.size - 1) punctuation(", ")
- }
- }
- listBrackets?.let{ punctuation(it.second.toString()) }
- }
-
- public fun PageContentBuilder.DocumentableContentBuilder.annotationsBlockWithIgnored(
- d: AnnotationTarget,
- ignored: Set<Annotations.Annotation>,
- renderAtStrategy: AtStrategy,
- listBrackets: Pair<Char, Char>,
- classExtension: String
- ) {
- annotations(d, ignored, setOf(TextStyle.Block)) {
- group {
- toSignatureString(it, renderAtStrategy, listBrackets, classExtension)
- }
- }
- }
-
- public fun PageContentBuilder.DocumentableContentBuilder.annotationsInlineWithIgnored(
- d: AnnotationTarget,
- ignored: Set<Annotations.Annotation>,
- renderAtStrategy: AtStrategy,
- listBrackets: Pair<Char, Char>,
- classExtension: String
- ) {
- annotations(d, ignored, setOf(TextStyle.Span)) {
- toSignatureString(it, renderAtStrategy, listBrackets, classExtension)
- text(Typography.nbsp.toString())
- }
- }
-
- public fun <T : Documentable> WithExtraProperties<T>.stylesIfDeprecated(sourceSetData: DokkaSourceSet): Set<TextStyle> {
- val directAnnotations = extra[Annotations]?.directAnnotations?.get(sourceSetData) ?: emptyList()
- val hasAnyDeprecatedAnnotation =
- directAnnotations.any { it.dri == DRI("kotlin", "Deprecated") || it.dri == DRI("java.lang", "Deprecated") }
-
- return if (hasAnyDeprecatedAnnotation) setOf(TextStyle.Strikethrough) else emptySet()
- }
-
- public infix fun DFunction.uses(typeParameter: DTypeParameter): Boolean {
- val parameterDris = parameters.flatMap { listOf(it.dri) + it.type.drisOfAllNestedBounds }
- val receiverDris =
- listOfNotNull(
- receiver?.dri,
- *receiver?.type?.drisOfAllNestedBounds?.toTypedArray() ?: emptyArray()
- )
- val allDris = parameterDris + receiverDris
- return typeParameter.dri in allDris
- }
-
- /**
- * Builds a distinguishable [function] parameters block, so that it
- * can be processed or custom rendered down the road.
- *
- * Resulting structure:
- * ```
- * SymbolContentKind.Parameters(style = wrapped) {
- * SymbolContentKind.Parameter(style = indented) { param, }
- * SymbolContentKind.Parameter(style = indented) { param, }
- * SymbolContentKind.Parameter(style = indented) { param }
- * }
- * ```
- * Wrapping and indentation of parameters is applied conditionally, see [shouldWrapParams]
- */
- public fun PageContentBuilder.DocumentableContentBuilder.parametersBlock(
- function: DFunction,
- paramBuilder: PageContentBuilder.DocumentableContentBuilder.(DParameter) -> Unit
- ) {
- group(kind = SymbolContentKind.Parameters, styles = emptySet()) {
- function.parameters.dropLast(1).forEach {
- group(kind = SymbolContentKind.Parameter) {
- paramBuilder(it)
- punctuation(", ")
- }
- }
- group(kind = SymbolContentKind.Parameter) {
- paramBuilder(function.parameters.last())
- }
- }
- }
-}
-
-public sealed class AtStrategy
-public object All : AtStrategy()
-public object OnlyOnce : AtStrategy()
-public object Never : AtStrategy()
diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt
deleted file mode 100644
index 2180e776..00000000
--- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.signatures
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.dri
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.driOrNull
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.*
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.Nullable
-import org.jetbrains.dokka.model.TypeConstructor
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.DokkaLogger
-import kotlin.text.Typography.nbsp
-
-public class KotlinSignatureProvider(
- ctcc: CommentsToContentConverter,
- logger: DokkaLogger
-) : SignatureProvider, JvmSignatureUtils by KotlinSignatureUtils {
-
- public constructor(context: DokkaContext) : this(
- context.plugin<DokkaBase>().querySingle { commentsToContentConverter },
- context.logger,
- )
-
- private val contentBuilder = PageContentBuilder(ctcc, this, logger)
-
- private val ignoredVisibilities = setOf(JavaVisibility.Public, KotlinVisibility.Public)
- private val ignoredModifiers = setOf(JavaModifier.Final, KotlinModifier.Final)
- private val ignoredExtraModifiers = setOf(
- ExtraModifiers.KotlinOnlyModifiers.TailRec,
- ExtraModifiers.KotlinOnlyModifiers.External
- )
- private val platformSpecificModifiers: Map<ExtraModifiers, Set<Platform>> = mapOf(
- ExtraModifiers.KotlinOnlyModifiers.External to setOf(Platform.js, Platform.wasm)
- )
-
- override fun signature(documentable: Documentable): List<ContentNode> = when (documentable) {
- is DFunction -> functionSignature(documentable)
- is DProperty -> propertySignature(documentable)
- is DClasslike -> classlikeSignature(documentable)
- is DTypeParameter -> signature(documentable)
- is DEnumEntry -> signature(documentable)
- is DTypeAlias -> signature(documentable)
- else -> throw NotImplementedError(
- "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}"
- )
- }
-
- private fun <T> PageContentBuilder.DocumentableContentBuilder.processExtraModifiers(t: T)
- where T : Documentable, T : WithExtraProperties<T> {
- sourceSetDependentText(
- t.modifiers()
- .mapValues { entry ->
- entry.value.filter {
- it !in ignoredExtraModifiers || entry.key.analysisPlatform in (platformSpecificModifiers[it]
- ?: emptySet())
- }
- }, styles = mainStyles + TokenStyle.Keyword
- ) {
- it.toSignatureString()
- }
- }
-
- private fun signature(e: DEnumEntry): List<ContentNode> =
- e.sourceSets.map {
- contentBuilder.contentFor(
- e,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = setOf(it)
- ) {
- group(styles = setOf(TextStyle.Block)) {
- annotationsBlock(e)
- link(e.name, e.dri, styles = mainStyles + e.stylesIfDeprecated(it))
- }
- }
- }
-
- private fun classlikeSignature(c: DClasslike): List<ContentNode> {
- @Suppress("UNCHECKED_CAST")
- val typeAlias = (c as? WithExtraProperties<DClasslike>)
- ?.extra
- ?.get(ActualTypealias)
- ?.typeAlias
-
- return c.sourceSets.map { sourceSetData ->
- if (typeAlias != null && sourceSetData in typeAlias.sourceSets) {
- regularSignature(typeAlias, sourceSetData)
- } else {
- regularSignature(c, sourceSetData)
- }
- }
- }
-
- private fun <T : Documentable> PageContentBuilder.DocumentableContentBuilder.defaultValueAssign(
- d: WithExtraProperties<T>,
- sourceSet: DokkaSourceSet
- ) {
- // a default value of parameter can be got from expect source set
- // but expect properties cannot have a default value
- d.extra[DefaultValue]?.expression?.let {
- it[sourceSet] ?: if (d is DParameter) it[d.expectPresentInSet] else null
- }?.let { expr ->
- operator(" = ")
- highlightValue(expr)
- }
- }
-
- private fun regularSignature(c: DClasslike, sourceSet: DokkaSourceSet): ContentGroup {
- @Suppress("UNCHECKED_CAST")
- val deprecationStyles = (c as? WithExtraProperties<out Documentable>)
- ?.stylesIfDeprecated(sourceSet)
- ?: emptySet()
-
- return contentBuilder.contentFor(
- c,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = setOf(sourceSet)
- ) {
- annotationsBlock(c)
- c.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") }
- if (c.isExpectActual) keyword(if (sourceSet == c.expectPresentInSet) "expect " else "actual ")
- if (c is DClass) {
- val modifier =
- if (c.modifier[sourceSet] !in ignoredModifiers) {
- when {
- c.extra[AdditionalModifiers]?.content?.get(sourceSet)?.contains(ExtraModifiers.KotlinOnlyModifiers.Data) == true -> ""
- c.modifier[sourceSet] is JavaModifier.Empty -> "${KotlinModifier.Open.name} "
- else -> c.modifier[sourceSet]?.name?.let { "$it " }
- }
- } else {
- null
- }
- modifier?.takeIf { it.isNotEmpty() }?.let { keyword(it) }
- }
- when (c) {
- is DClass -> {
- processExtraModifiers(c)
- keyword("class ")
- }
- is DInterface -> {
- processExtraModifiers(c)
- keyword("interface ")
- }
- is DEnum -> {
- processExtraModifiers(c)
- keyword("enum ")
- }
- is DObject -> {
- processExtraModifiers(c)
- keyword("object ")
- }
- is DAnnotation -> {
- processExtraModifiers(c)
- keyword("annotation class ")
- }
- }
- link(c.name!!, c.dri, styles = mainStyles + deprecationStyles)
- if (c is WithGenerics) {
- list(c.generics, prefix = "<", suffix = ">",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- annotationsInline(it)
- +buildSignature(it)
- }
- }
- if (c is WithConstructors) {
- val pConstructor = c.constructors.singleOrNull { it.extra[PrimaryConstructorExtra] != null }
- if (pConstructor?.sourceSets?.contains(sourceSet) == true) {
- if (pConstructor.annotations().values.any { it.isNotEmpty() }) {
- text(nbsp.toString())
- annotationsInline(pConstructor)
- keyword("constructor")
- }
-
- // for primary constructor, opening and closing parentheses
- // should be present only if it has parameters. If there are
- // no parameters, it should result in `class Example`
- if (pConstructor.parameters.isNotEmpty()) {
- val parameterPropertiesByName = c.properties
- .filter { it.isAlsoParameter(sourceSet) }
- .associateBy { it.name }
-
- punctuation("(")
- parametersBlock(pConstructor) { param ->
- annotationsInline(param)
- parameterPropertiesByName[param.name]?.let { property ->
- property.setter?.let { keyword("var ") } ?: keyword("val ")
- }
- text(param.name.orEmpty())
- operator(": ")
- signatureForProjection(param.type)
- defaultValueAssign(param, sourceSet)
- }
- punctuation(")")
- }
- }
- }
- if (c is WithSupertypes) {
- c.supertypes.filter { it.key == sourceSet }.map { (s, typeConstructors) ->
- list(typeConstructors, prefix = " : ", sourceSets = setOf(s)) {
- link(it.typeConstructor.dri.sureClassNames, it.typeConstructor.dri, sourceSets = setOf(s))
- list(it.typeConstructor.projections, prefix = "<", suffix = "> ",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- signatureForProjection(it)
- }
- }
- }
- }
- }
- }
-
- /**
- * An example would be a primary constructor `class A(val s: String)`,
- * where `s` is both a function parameter and a property
- */
- private fun DProperty.isAlsoParameter(sourceSet: DokkaSourceSet): Boolean {
- return this.extra[IsAlsoParameter]
- ?.inSourceSets
- ?.any { it.sourceSetID == sourceSet.sourceSetID }
- ?: false
- }
-
- private fun propertySignature(p: DProperty) =
- p.sourceSets.map { sourceSet ->
- contentBuilder.contentFor(
- p,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = setOf(sourceSet)
- ) {
- annotationsBlock(p)
- p.visibility[sourceSet].takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") }
- if (p.isExpectActual) keyword(if (sourceSet == p.expectPresentInSet) "expect " else "actual ")
- p.modifier[sourceSet].takeIf { it !in ignoredModifiers }?.let {
- if (it is JavaModifier.Empty) KotlinModifier.Open else it
- }?.name?.let { keyword("$it ") }
- p.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) }
- if (p.isMutable()) keyword("var ") else keyword("val ")
- list(p.generics, prefix = "<", suffix = "> ",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- annotationsInline(it)
- +buildSignature(it)
- }
- p.receiver?.also {
- signatureForProjection(it.type)
- punctuation(".")
- }
- link(p.name, p.dri, styles = mainStyles + p.stylesIfDeprecated(sourceSet))
- operator(": ")
- signatureForProjection(p.type)
-
- if (p.isNotMutable()) {
- defaultValueAssign(p, sourceSet)
- }
- }
- }
-
- private fun DProperty.isNotMutable(): Boolean = !isMutable()
-
- private fun DProperty.isMutable(): Boolean {
- return this.extra[IsVar] != null || this.setter != null
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.highlightValue(expr: Expression) = when (expr) {
- is IntegerConstant -> constant(expr.value.toString())
- is FloatConstant -> constant(expr.value.toString() + "f")
- is DoubleConstant -> constant(expr.value.toString())
- is BooleanConstant -> booleanLiteral(expr.value)
- is StringConstant -> stringLiteral("\"${expr.value}\"")
- is ComplexExpression -> text(expr.value)
- else -> Unit
- }
-
- private fun functionSignature(f: DFunction) =
- f.sourceSets.map { sourceSet ->
- contentBuilder.contentFor(
- f,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = setOf(sourceSet)
- ) {
- annotationsBlock(f)
- f.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") }
- if (f.isExpectActual) keyword(if (sourceSet == f.expectPresentInSet) "expect " else "actual ")
- if (f.isConstructor) {
- keyword("constructor")
- } else {
- f.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.let {
- if (it is JavaModifier.Empty) KotlinModifier.Open else it
- }?.name?.let { keyword("$it ") }
- f.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) }
- keyword("fun ")
- list(
- f.generics, prefix = "<", suffix = "> ",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator
- ) {
- annotationsInline(it)
- +buildSignature(it)
- }
- f.receiver?.also {
- signatureForProjection(it.type)
- punctuation(".")
- }
- link(f.name, f.dri, styles = mainStyles + TokenStyle.Function + f.stylesIfDeprecated(sourceSet))
- }
- // for a function, opening and closing parentheses must be present
- // anyway, even if it has no parameters, resulting in `fun test(): R`
- punctuation("(")
- if (f.parameters.isNotEmpty()) {
- parametersBlock(f) { param ->
- annotationsInline(param)
- processExtraModifiers(param)
- text(param.name!!)
- operator(": ")
- signatureForProjection(param.type)
- defaultValueAssign(param, sourceSet)
- }
- }
- punctuation(")")
- if (f.documentReturnType()) {
- operator(": ")
- signatureForProjection(f.type)
- }
- }
- }
-
- private fun DFunction.documentReturnType() = when {
- this.isConstructor -> false
- this.type is TypeConstructor && (this.type as TypeConstructor).dri == DriOfUnit -> false
- this.type is Void -> false
- else -> true
- }
-
- private fun signature(t: DTypeAlias) =
- t.sourceSets.map {
- regularSignature(t, it)
- }
-
- private fun regularSignature(
- t: DTypeAlias,
- sourceSet: DokkaSourceSet
- ) = contentBuilder.contentFor(t, sourceSets = setOf(sourceSet)) {
- t.underlyingType.entries.groupBy({ it.value }, { it.key }).map { (type, platforms) ->
- +contentBuilder.contentFor(
- t,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = platforms.toSet()
- ) {
- annotationsBlock(t)
- t.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") }
- if (t.expectPresentInSet != null) keyword("actual ")
- processExtraModifiers(t)
- keyword("typealias ")
- group(styles = mainStyles + t.stylesIfDeprecated(sourceSet)) {
- signatureForProjection(t.type)
- }
- operator(" = ")
- signatureForTypealiasTarget(t, type)
- }
- }
- }
-
- private fun signature(t: DTypeParameter) =
- t.sourceSets.map {
- contentBuilder.contentFor(t, sourceSets = setOf(it)) {
- group(styles = mainStyles + t.stylesIfDeprecated(it)) {
- signatureForProjection(t.variantTypeParameter.withDri(t.dri.withTargetToDeclaration()))
- }
- list(
- elements = t.nontrivialBounds,
- prefix = " : ",
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator
- ) { bound ->
- signatureForProjection(bound)
- }
- }
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.signatureForTypealiasTarget(
- typeAlias: DTypeAlias, bound: Bound
- ) {
- signatureForProjection(
- p = bound,
- showFullyQualifiedName = bound.driOrNull?.classNames == typeAlias.dri.classNames
- )
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.signatureForProjection(
- p: Projection, showFullyQualifiedName: Boolean = false
- ) {
- return when (p) {
- is TypeParameter -> {
- if (p.presentableName != null) {
- text(p.presentableName!!)
- operator(": ")
- }
- annotationsInline(p)
- link(p.name, p.dri)
- }
- is FunctionalTypeConstructor -> +funType(mainDRI.single(), mainSourcesetData, p)
- is GenericTypeConstructor ->
- group(styles = emptySet()) {
- val linkText = if (showFullyQualifiedName && p.dri.packageName != null) {
- "${p.dri.packageName}.${p.dri.classNames.orEmpty()}"
- } else p.dri.classNames.orEmpty()
- if (p.presentableName != null) {
- text(p.presentableName!!)
- operator(": ")
- }
- annotationsInline(p)
- link(linkText, p.dri)
- list(p.projections, prefix = "<", suffix = ">",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- signatureForProjection(it, showFullyQualifiedName)
- }
- }
-
- is Variance<*> -> group(styles = emptySet()) {
- keyword("$p ".takeIf { it.isNotBlank() } ?: "")
- signatureForProjection(p.inner, showFullyQualifiedName)
- }
-
- is Star -> operator("*")
-
- is Nullable -> group(styles = emptySet()) {
- signatureForProjection(p.inner, showFullyQualifiedName)
- operator("?")
- }
- is DefinitelyNonNullable -> group(styles = emptySet()) {
- signatureForProjection(p.inner, showFullyQualifiedName)
- operator(" & ")
- link("Any", DriOfAny)
- }
-
- is TypeAliased -> signatureForProjection(p.typeAlias)
- is JavaObject -> {
- annotationsInline(p)
- link("Any", DriOfAny)
- }
- is Void -> link("Unit", DriOfUnit)
- is PrimitiveJavaType -> signatureForProjection(p.translateToKotlin(), showFullyQualifiedName)
- is Dynamic -> text("dynamic")
- is UnresolvedBound -> text(p.name)
- }
- }
-
- private fun funType(dri: DRI, sourceSets: Set<DokkaSourceSet>, type: FunctionalTypeConstructor) =
- contentBuilder.contentFor(dri, sourceSets, ContentKind.Main) {
-
- if (type.presentableName != null) {
- text(type.presentableName!!)
- operator(": ")
- }
- annotationsInline(type)
- if (type.isSuspendable) keyword("suspend ")
-
- if (type.isExtensionFunction) {
- signatureForProjection(type.projections.first())
- punctuation(".")
- }
-
- val args = if (type.isExtensionFunction)
- type.projections.drop(1)
- else
- type.projections
-
- punctuation("(")
- args.subList(0, args.size - 1).forEachIndexed { i, arg ->
- signatureForProjection(arg)
- if (i < args.size - 2) punctuation(", ")
- }
- punctuation(")")
- operator(" -> ")
- signatureForProjection(args.last())
- }
-}
-
-private fun PrimitiveJavaType.translateToKotlin() = GenericTypeConstructor(
- dri = dri,
- projections = emptyList(),
- presentableName = null
-)
-
-private val DTypeParameter.nontrivialBounds: List<Bound>
- get() = bounds.filterNot { it is Nullable && it.inner.driOrNull == DriOfAny }
diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureUtils.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureUtils.kt
deleted file mode 100644
index f16fbeb0..00000000
--- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureUtils.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.signatures
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinTransformer
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.DriOfAny
-import org.jetbrains.dokka.links.DriOfUnit
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.AnnotationTarget
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.ContentKind
-
-public object KotlinSignatureUtils : JvmSignatureUtils {
-
- private const val classExtension = "::class"
- private val strategy = OnlyOnce
- private val listBrackets = Pair('[', ']')
- private val ignoredAnnotations = setOf(
- /**
- * Rendered separately, see [SinceKotlinTransformer]
- */
- Annotations.Annotation(DRI("kotlin", "SinceKotlin"), emptyMap()),
-
- /**
- * Rendered separately as its own block, see usage of [ContentKind.Deprecation]
- */
- Annotations.Annotation(DRI("kotlin", "Deprecated"), emptyMap()),
- Annotations.Annotation(DRI("kotlin", "DeprecatedSinceKotlin"), emptyMap()),
- Annotations.Annotation(DRI("java.lang", "Deprecated"), emptyMap()), // could be used as well for interop
- )
-
-
- override fun PageContentBuilder.DocumentableContentBuilder.annotationsBlock(d: AnnotationTarget) {
- annotationsBlockWithIgnored(d, ignoredAnnotations, strategy, listBrackets, classExtension)
- }
-
- override fun PageContentBuilder.DocumentableContentBuilder.annotationsInline(d: AnnotationTarget) {
- annotationsInlineWithIgnored(d, ignoredAnnotations, strategy, listBrackets, classExtension)
- }
-
- override fun <T : Documentable> WithExtraProperties<T>.modifiers(): SourceSetDependent<Set<ExtraModifiers>> {
- return extra[AdditionalModifiers]?.content?.entries?.associate {
- it.key to it.value.filterIsInstance<ExtraModifiers.KotlinOnlyModifiers>().toSet()
- } ?: emptyMap()
- }
-
-
- public val PrimitiveJavaType.dri: DRI get() = DRI("kotlin", name.capitalize())
-
- public val Bound.driOrNull: DRI?
- get() {
- return when (this) {
- is TypeParameter -> dri
- is TypeConstructor -> dri
- is Nullable -> inner.driOrNull
- is DefinitelyNonNullable -> inner.driOrNull
- is PrimitiveJavaType -> dri
- is Void -> DriOfUnit
- is JavaObject -> DriOfAny
- is Dynamic -> null
- is UnresolvedBound -> null
- is TypeAliased -> typeAlias.driOrNull
- }
- }
-
- public val Projection.drisOfAllNestedBounds: List<DRI> get() = when (this) {
- is TypeParameter -> listOf(dri)
- is TypeConstructor -> listOf(dri) + projections.flatMap { it.drisOfAllNestedBounds }
- is Nullable -> inner.drisOfAllNestedBounds
- is DefinitelyNonNullable -> inner.drisOfAllNestedBounds
- is PrimitiveJavaType -> listOf(dri)
- is Void -> listOf(DriOfUnit)
- is JavaObject -> listOf(DriOfAny)
- is Dynamic -> emptyList()
- is UnresolvedBound -> emptyList()
- is Variance<*> -> inner.drisOfAllNestedBounds
- is Star -> emptyList()
- is TypeAliased -> listOfNotNull(typeAlias.driOrNull, inner.driOrNull)
- }
-
-}
diff --git a/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt
deleted file mode 100644
index 76245a40..00000000
--- a/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.signatures
-
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.pages.ContentNode
-
-public fun interface SignatureProvider {
- public fun signature(documentable: Documentable): List<ContentNode>
-}
diff --git a/plugins/base/src/main/kotlin/templating/AddToNavigationCommand.kt b/plugins/base/src/main/kotlin/templating/AddToNavigationCommand.kt
deleted file mode 100644
index 03bf8e6a..00000000
--- a/plugins/base/src/main/kotlin/templating/AddToNavigationCommand.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-public class AddToNavigationCommand(
- public val moduleName: String
-) : Command
diff --git a/plugins/base/src/main/kotlin/templating/AddToSearch.kt b/plugins/base/src/main/kotlin/templating/AddToSearch.kt
deleted file mode 100644
index 8c2ccc79..00000000
--- a/plugins/base/src/main/kotlin/templating/AddToSearch.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-import org.jetbrains.dokka.base.renderers.html.SearchRecord
-
-public data class AddToSearch(
- val moduleName: String,
- val elements: List<SearchRecord>
-): Command
diff --git a/plugins/base/src/main/kotlin/templating/AddToSourcesetDependencies.kt b/plugins/base/src/main/kotlin/templating/AddToSourcesetDependencies.kt
deleted file mode 100644
index c9774e30..00000000
--- a/plugins/base/src/main/kotlin/templating/AddToSourcesetDependencies.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-public data class AddToSourcesetDependencies(
- val moduleName: String,
- val content: Map<String, List<String>>
-) : Command
diff --git a/plugins/base/src/main/kotlin/templating/Command.kt b/plugins/base/src/main/kotlin/templating/Command.kt
deleted file mode 100644
index 94ed00d4..00000000
--- a/plugins/base/src/main/kotlin/templating/Command.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-import com.fasterxml.jackson.annotation.JsonTypeInfo
-import com.fasterxml.jackson.annotation.JsonTypeInfo.Id.CLASS
-
-@JsonTypeInfo(use = CLASS)
-public interface Command
-
-public abstract class SubstitutionCommand : Command {
- public abstract val pattern: String
-}
diff --git a/plugins/base/src/main/kotlin/templating/ImmediateHtmlCommandConsumer.kt b/plugins/base/src/main/kotlin/templating/ImmediateHtmlCommandConsumer.kt
deleted file mode 100644
index f1735490..00000000
--- a/plugins/base/src/main/kotlin/templating/ImmediateHtmlCommandConsumer.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-import org.jetbrains.dokka.base.renderers.html.TemplateBlock
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
-
-public interface ImmediateHtmlCommandConsumer {
- public fun canProcess(command: Command): Boolean
-
- public fun <R> processCommand(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>)
-
- public fun <R> processCommandAndFinalize(command: Command, block: TemplateBlock, tagConsumer: ImmediateResolutionTagConsumer<R>): R
-}
-
diff --git a/plugins/base/src/main/kotlin/templating/InsertTemplateExtra.kt b/plugins/base/src/main/kotlin/templating/InsertTemplateExtra.kt
deleted file mode 100644
index b4316e0f..00000000
--- a/plugins/base/src/main/kotlin/templating/InsertTemplateExtra.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-import org.jetbrains.dokka.model.properties.ExtraProperty
-import org.jetbrains.dokka.pages.ContentNode
-
-public data class InsertTemplateExtra(val command: Command) : ExtraProperty<ContentNode> {
-
- public companion object : ExtraProperty.Key<ContentNode, InsertTemplateExtra>
-
- override val key: ExtraProperty.Key<ContentNode, *>
- get() = Companion
-}
diff --git a/plugins/base/src/main/kotlin/templating/PathToRootSubstitutionCommand.kt b/plugins/base/src/main/kotlin/templating/PathToRootSubstitutionCommand.kt
deleted file mode 100644
index 070a38ee..00000000
--- a/plugins/base/src/main/kotlin/templating/PathToRootSubstitutionCommand.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-public data class PathToRootSubstitutionCommand(
- override val pattern: String,
- val default: String
-): SubstitutionCommand()
diff --git a/plugins/base/src/main/kotlin/templating/ProjectNameSubstitutionCommand.kt b/plugins/base/src/main/kotlin/templating/ProjectNameSubstitutionCommand.kt
deleted file mode 100644
index 6218530e..00000000
--- a/plugins/base/src/main/kotlin/templating/ProjectNameSubstitutionCommand.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-public data class ProjectNameSubstitutionCommand(
- override val pattern: String,
- val default: String
-): SubstitutionCommand()
diff --git a/plugins/base/src/main/kotlin/templating/ReplaceVersionsCommand.kt b/plugins/base/src/main/kotlin/templating/ReplaceVersionsCommand.kt
deleted file mode 100644
index 62a51047..00000000
--- a/plugins/base/src/main/kotlin/templating/ReplaceVersionsCommand.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-public data class ReplaceVersionsCommand(val location: String = ""): Command
diff --git a/plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt b/plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt
deleted file mode 100644
index 1669b435..00000000
--- a/plugins/base/src/main/kotlin/templating/ResolveLinkCommand.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-import org.jetbrains.dokka.links.DRI
-
-public class ResolveLinkCommand(
- public val dri: DRI
-): Command
diff --git a/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt b/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt
deleted file mode 100644
index a679a23d..00000000
--- a/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.templating
-
-import com.fasterxml.jackson.core.JsonGenerator
-import com.fasterxml.jackson.databind.DeserializationFeature
-import com.fasterxml.jackson.databind.SerializerProvider
-import com.fasterxml.jackson.databind.module.SimpleModule
-import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer
-import com.fasterxml.jackson.databind.type.TypeFactory
-import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
-import com.fasterxml.jackson.module.kotlin.jacksonTypeRef
-import org.jetbrains.dokka.base.DokkaBase
-import java.io.File
-
-// TODO [beresnev] try to get rid of this copy-paste in #2933
-// THIS IS COPIED FROM BASE SINCE IT NEEDS TO BE INSTANTIATED ON THE SAME CLASS LOADER AS PLUGINS
-
-private val objectMapper = run {
- val module = SimpleModule().apply {
- addSerializer(FileSerializer)
- }
- jacksonObjectMapper()
- .apply {
- typeFactory = PluginTypeFactory()
- }
- .registerModule(module)
- .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
-}
-
-@PublishedApi
-internal class TypeReference<T> @PublishedApi internal constructor(
- internal val jackson: com.fasterxml.jackson.core.type.TypeReference<T>
-) {
- companion object {
- @PublishedApi
- internal inline operator fun <reified T> invoke(): TypeReference<T> = TypeReference(jacksonTypeRef())
- }
-}
-
-public fun toJsonString(value: Any): String = objectMapper.writeValueAsString(value)
-
-public inline fun <reified T : Any> parseJson(json: String): T = parseJson(json, TypeReference())
-
-@PublishedApi
-internal fun <T : Any> parseJson(json: String, typeReference: TypeReference<T>): T =
- objectMapper.readValue(json, typeReference.jackson)
-
-
-private object FileSerializer : StdScalarSerializer<File>(File::class.java) {
- override fun serialize(value: File, g: JsonGenerator, provider: SerializerProvider) {
- g.writeString(value.path)
- }
-}
-
-@Suppress("DEPRECATION") // for TypeFactory constructor, no way to use non-deprecated one, it's essentially identical
-private class PluginTypeFactory: TypeFactory(null) {
- override fun findClass(className: String): Class<out Any>? =
- Class.forName(className, true, DokkaBase::class.java.classLoader) ?: super.findClass(className)
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt b/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt
deleted file mode 100644
index dde1a2af..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-
-/**
- * Since we can not merge [DClasslike] with [DTypeAlias.underlyingType] and [DTypeAlias.extra],
- * we have this transformer to add [ActualTypealias] extra in expect [DClasslike]
- *
- * The transformer should be applied after merging all documentables
- */
-// TODO assign actual [DTypeAlias.expectPresentInSet] an expect source set, currently, [DTypeAlias.expectPresentInSet] always = null
-public class ActualTypealiasAdder : DocumentableTransformer {
-
- override fun invoke(original: DModule, context: DokkaContext): DModule {
- return original.generateTypealiasesMap().let { aliases ->
- original.copy(packages = original.packages.map {
- it.copy(classlikes = addActualTypeAliasToClasslikes(it.classlikes, aliases))
- })
- }
- }
-
- private fun DModule.generateTypealiasesMap(): Map<DRI, DTypeAlias> =
- packages.flatMap { pkg ->
- pkg.typealiases.map { typeAlias ->
- typeAlias.dri to typeAlias
- }
- }.toMap()
-
-
- private fun addActualTypeAliasToClasslikes(
- elements: Iterable<DClasslike>,
- typealiases: Map<DRI, DTypeAlias>
- ): List<DClasslike> = elements.flatMap {
- when (it) {
- is DClass -> addActualTypeAlias(
- it.copy(
- classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
- ).let(::listOf),
- typealiases
- )
- is DEnum -> addActualTypeAlias(
- it.copy(
- classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
- ).let(::listOf),
- typealiases
- )
- is DInterface -> addActualTypeAlias(
- it.copy(
- classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
- ).let(::listOf),
- typealiases
- )
- is DObject -> addActualTypeAlias(
- it.copy(
- classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
- ).let(::listOf),
- typealiases
- )
- is DAnnotation -> addActualTypeAlias(
- it.copy(
- classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
- ).let(::listOf),
- typealiases
- )
- else -> throw IllegalStateException("${it::class.qualifiedName} ${it.name} cannot have extra added")
- }
- }
-
- private fun <T> addActualTypeAlias(
- elements: Iterable<T>,
- typealiases: Map<DRI, DTypeAlias>
- ): List<T> where T : DClasslike, T : WithExtraProperties<T>, T : WithSources =
- elements.map { element ->
- if (element.expectPresentInSet != null) {
- typealiases[element.dri]?.let { ta ->
- val actualTypealiasExtra = ActualTypealias(ta.copy(expectPresentInSet = element.expectPresentInSet))
- val merged = element.withNewExtras(element.extra + actualTypealiasExtra).let {
- when (it) {
- is DClass -> it.copy(
- documentation = element.documentation + ta.documentation,
- sources = element.sources + ta.sources,
- sourceSets = element.sourceSets + ta.sourceSets
- )
-
- is DEnum -> it.copy(
- documentation = element.documentation + ta.documentation,
- sources = element.sources + ta.sources,
- sourceSets = element.sourceSets + ta.sourceSets
- )
-
- is DInterface -> it.copy(
- documentation = element.documentation + ta.documentation,
- sources = element.sources + ta.sources,
- sourceSets = element.sourceSets + ta.sourceSets
- )
-
- is DObject -> it.copy(
- documentation = element.documentation + ta.documentation,
- sources = element.sources + ta.sources,
- sourceSets = element.sourceSets + ta.sourceSets
- )
-
- is DAnnotation -> it.copy(
- documentation = element.documentation + ta.documentation,
- sources = element.sources + ta.sources,
- sourceSets = element.sourceSets + ta.sourceSets
- )
-
- else -> throw IllegalStateException("${it::class.qualifiedName} ${it.name} cannot have copy its sourceSets")
- }
- }
- @Suppress("UNCHECKED_CAST")
- merged as T
- } ?: element
- } else {
- element
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ClashingDriIdentifier.kt b/plugins/base/src/main/kotlin/transformers/documentables/ClashingDriIdentifier.kt
deleted file mode 100644
index e9c7342e..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/ClashingDriIdentifier.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-@Deprecated(
- message = "Declaration was moved to dokka-core",
- replaceWith = ReplaceWith("org.jetbrains.dokka.transformers.documentation.ClashingDriIdentifier"),
- level = DeprecationLevel.WARNING // TODO change to error after Kotlin 1.9.20
-)
-public typealias ClashingDriIdentifier = org.jetbrains.dokka.transformers.documentation.ClashingDriIdentifier
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/DeprecatedDocumentableFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/DeprecatedDocumentableFilterTransformer.kt
deleted file mode 100644
index 4905e876..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/DeprecatedDocumentableFilterTransformer.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfiguration.PackageOptions
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.EnumValue
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.perPackageOptions
-import org.jetbrains.dokka.transformers.documentation.sourceSet
-
-/**
- * If [PackageOptions.skipDeprecated] or [DokkaConfiguration.DokkaSourceSet.skipDeprecated] is set
- * to `true`, suppresses documentables marked with [kotlin.Deprecated] or [java.lang.Deprecated].
- * Package options are given preference over global options.
- *
- * Documentables with [kotlin.Deprecated.level] set to [DeprecationLevel.HIDDEN]
- * are suppressed regardless of global and package options.
- */
-public class DeprecatedDocumentableFilterTransformer(
- context: DokkaContext
-) : SuppressedByConditionDocumentableFilterTransformer(context) {
-
- override fun shouldBeSuppressed(d: Documentable): Boolean {
- val annotations = (d as? WithExtraProperties<*>)?.annotations() ?: return false
- if (annotations.isEmpty())
- return false
-
- val deprecatedAnnotations = filterDeprecatedAnnotations(annotations)
- if (deprecatedAnnotations.isEmpty())
- return false
-
- val kotlinDeprecated = deprecatedAnnotations.find { it.dri.packageName == "kotlin" }
- if (kotlinDeprecated?.isHidden() == true)
- return true
-
- return perPackageOptions(d)?.skipDeprecated ?: sourceSet(d).skipDeprecated
- }
-
- private fun WithExtraProperties<*>.annotations(): List<Annotations.Annotation> {
- return this.extra.allOfType<Annotations>().flatMap { annotations ->
- annotations.directAnnotations.values.singleOrNull() ?: emptyList()
- }
- }
-
- private fun filterDeprecatedAnnotations(annotations: List<Annotations.Annotation>): List<Annotations.Annotation> {
- return annotations.filter {
- (it.dri.packageName == "kotlin" && it.dri.classNames == "Deprecated") ||
- (it.dri.packageName == "java.lang" && it.dri.classNames == "Deprecated")
- }
- }
-
- private fun Annotations.Annotation.isHidden(): Boolean {
- val level = (this.params["level"] as? EnumValue) ?: return false
- return level.enumName == "DeprecationLevel.HIDDEN"
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/DocumentableReplacerTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/DocumentableReplacerTransformer.kt
deleted file mode 100644
index 10b25a20..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/DocumentableReplacerTransformer.kt
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-
-public abstract class DocumentableReplacerTransformer(
- public val context: DokkaContext
-) : PreMergeDocumentableTransformer {
- override fun invoke(modules: List<DModule>): List<DModule> =
- modules.map { module ->
- val (documentable, wasChanged) = processModule(module)
- documentable.takeIf { wasChanged } ?: module
- }
-
- protected open fun processModule(module: DModule): AnyWithChanges<DModule> {
- val afterProcessing = module.packages.map { processPackage(it) }
- val processedModule = module.takeIf { afterProcessing.none { it.changed } }
- ?: module.copy(packages = afterProcessing.mapNotNull { it.target })
- return AnyWithChanges(processedModule, afterProcessing.any { it.changed })
- }
-
- protected open fun processPackage(dPackage: DPackage): AnyWithChanges<DPackage> {
- val classlikes = dPackage.classlikes.map { processClassLike(it) }
- val typeAliases = dPackage.typealiases.map { processTypeAlias(it) }
- val functions = dPackage.functions.map { processFunction(it) }
- val properies = dPackage.properties.map { processProperty(it) }
-
- val wasChanged = (classlikes + typeAliases + functions + properies).any { it.changed }
- return (dPackage.takeIf { !wasChanged } ?: dPackage.copy(
- classlikes = classlikes.mapNotNull { it.target },
- typealiases = typeAliases.mapNotNull { it.target },
- functions = functions.mapNotNull { it.target },
- properties = properies.mapNotNull { it.target }
- )).let { processedPackage -> AnyWithChanges(processedPackage, wasChanged) }
- }
-
- protected open fun processClassLike(classlike: DClasslike): AnyWithChanges<DClasslike> {
- val functions = classlike.functions.map { processFunction(it) }
- val classlikes = classlike.classlikes.map { processClassLike(it) }
- val properties = classlike.properties.map { processProperty(it) }
- val companion = (classlike as? WithCompanion)?.companion?.let { processClassLike(it) }
-
- val wasClasslikeChanged = (functions + classlikes + properties).any { it.changed } || companion?.changed == true
- return when (classlike) {
- is DClass -> {
- val constructors = classlike.constructors.map { processFunction(it) }
- val generics = classlike.generics.map { processTypeParameter(it) }
- val wasClassChange =
- wasClasslikeChanged || constructors.any { it.changed } || generics.any { it.changed }
- (classlike.takeIf { !wasClassChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.target },
- classlikes = classlikes.mapNotNull { it.target },
- properties = properties.mapNotNull { it.target },
- constructors = constructors.mapNotNull { it.target },
- generics = generics.mapNotNull { it.target },
- companion = companion?.target as? DObject
- )).let { AnyWithChanges(it, wasClassChange) }
- }
- is DInterface -> {
- val generics = classlike.generics.map { processTypeParameter(it) }
- val wasInterfaceChange = wasClasslikeChanged || generics.any { it.changed }
- (classlike.takeIf { !wasInterfaceChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.target },
- classlikes = classlikes.mapNotNull { it.target },
- properties = properties.mapNotNull { it.target },
- generics = generics.mapNotNull { it.target },
- companion = companion?.target as? DObject
- )).let { AnyWithChanges(it, wasClasslikeChanged) }
- }
- is DObject -> (classlike.takeIf { !wasClasslikeChanged } ?: classlike.copy(
- functions = functions.mapNotNull { it.target },
- classlikes = classlikes.mapNotNull { it.target },
- properties = properties.mapNotNull { it.target },
- )).let { AnyWithChanges(it, wasClasslikeChanged) }
- is DAnnotation -> {
- val constructors = classlike.constructors.map { processFunction(it) }
- val generics = classlike.generics.map { processTypeParameter(it) }
- val wasClassChange =
- wasClasslikeChanged || constructors.any { it.changed } || generics.any { it.changed }
- (classlike.takeIf { !wasClassChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.target },
- classlikes = classlikes.mapNotNull { it.target },
- properties = properties.mapNotNull { it.target },
- constructors = constructors.mapNotNull { it.target },
- generics = generics.mapNotNull { it.target },
- companion = companion?.target as? DObject
- )).let { AnyWithChanges(it, wasClassChange) }
- }
- is DEnum -> {
- val constructors = classlike.constructors.map { processFunction(it) }
- val entries = classlike.entries.map { processEnumEntry(it) }
- val wasClassChange =
- wasClasslikeChanged || (constructors + entries).any { it.changed }
- (classlike.takeIf { !wasClassChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.target },
- classlikes = classlikes.mapNotNull { it.target },
- properties = properties.mapNotNull { it.target },
- constructors = constructors.mapNotNull { it.target },
- companion = companion?.target as? DObject,
- entries = entries.mapNotNull { it.target }
- )).let { AnyWithChanges(it, wasClassChange) }
- }
- }
- }
-
- protected open fun processEnumEntry(dEnumEntry: DEnumEntry): AnyWithChanges<DEnumEntry> {
- val functions = dEnumEntry.functions.map { processFunction(it) }
- val properties = dEnumEntry.properties.map { processProperty(it) }
- val classlikes = dEnumEntry.classlikes.map { processClassLike(it) }
-
- val wasChanged = (functions + properties + classlikes).any { it.changed }
- return (dEnumEntry.takeIf { !wasChanged } ?: dEnumEntry.copy(
- functions = functions.mapNotNull { it.target },
- classlikes = classlikes.mapNotNull { it.target },
- properties = properties.mapNotNull { it.target },
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processFunction(dFunction: DFunction): AnyWithChanges<DFunction> {
- val type = processBound(dFunction.type)
- val parameters = dFunction.parameters.map { processParameter(it) }
- val receiver = dFunction.receiver?.let { processParameter(it) }
- val generics = dFunction.generics.map { processTypeParameter(it) }
-
- val wasChanged = parameters.any { it.changed } || receiver?.changed == true
- || type.changed || generics.any { it.changed }
- return (dFunction.takeIf { !wasChanged } ?: dFunction.copy(
- type = type.target ?: dFunction.type,
- parameters = parameters.mapNotNull { it.target },
- receiver = receiver?.target,
- generics = generics.mapNotNull { it.target },
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processProperty(dProperty: DProperty): AnyWithChanges<DProperty> {
- val getter = dProperty.getter?.let { processFunction(it) }
- val setter = dProperty.setter?.let { processFunction(it) }
- val type = processBound(dProperty.type)
- val generics = dProperty.generics.map { processTypeParameter(it) }
-
- val wasChanged = getter?.changed == true || setter?.changed == true
- || type.changed || generics.any { it.changed }
- return (dProperty.takeIf { !wasChanged } ?: dProperty.copy(
- type = type.target ?: dProperty.type,
- setter = setter?.target,
- getter = getter?.target,
- generics = generics.mapNotNull { it.target }
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processParameter(dParameter: DParameter): AnyWithChanges<DParameter> {
- val type = processBound(dParameter.type)
-
- val wasChanged = type.changed
- return (dParameter.takeIf { !wasChanged } ?: dParameter.copy(
- type = type.target ?: dParameter.type,
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processTypeParameter(dTypeParameter: DTypeParameter): AnyWithChanges<DTypeParameter> {
- val bounds = dTypeParameter.bounds.map { processBound(it) }
-
- val wasChanged = bounds.any { it.changed }
- return (dTypeParameter.takeIf { !wasChanged } ?: dTypeParameter.copy(
- bounds = bounds.mapIndexed { i, v -> v.target ?: dTypeParameter.bounds[i] }
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processBound(bound: Bound): AnyWithChanges<Bound> {
- return when(bound) {
- is GenericTypeConstructor -> processGenericTypeConstructor(bound)
- is FunctionalTypeConstructor -> processFunctionalTypeConstructor(bound)
- else -> AnyWithChanges(bound, false)
- }
- }
-
- protected open fun processVariance(variance: Variance<*>): AnyWithChanges<Variance<*>> {
- val bound = processBound(variance.inner)
- if (!bound.changed)
- return AnyWithChanges(variance, false)
- return when (variance) {
- is Covariance<*> -> AnyWithChanges(
- Covariance(bound.target ?: variance.inner), true)
- is Contravariance<*> -> AnyWithChanges(
- Contravariance(bound.target ?: variance.inner), true)
- is Invariance<*> -> AnyWithChanges(
- Invariance(bound.target ?: variance.inner), true)
- else -> AnyWithChanges(variance, false)
- }
- }
-
- protected open fun processProjection(projection: Projection): AnyWithChanges<Projection> =
- when (projection) {
- is Bound -> processBound(projection)
- is Variance<Bound> -> processVariance(projection)
- else -> AnyWithChanges(projection, false)
- }
-
- protected open fun processGenericTypeConstructor(
- genericTypeConstructor: GenericTypeConstructor
- ): AnyWithChanges<GenericTypeConstructor> {
- val projections = genericTypeConstructor.projections.map { processProjection(it) }
-
- val wasChanged = projections.any { it.changed }
- return (genericTypeConstructor.takeIf { !wasChanged } ?: genericTypeConstructor.copy(
- projections = projections.mapNotNull { it.target }
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processFunctionalTypeConstructor(
- functionalTypeConstructor: FunctionalTypeConstructor
- ): AnyWithChanges<FunctionalTypeConstructor> {
- val projections = functionalTypeConstructor.projections.map { processProjection(it) }
-
- val wasChanged = projections.any { it.changed }
- return (functionalTypeConstructor.takeIf { !wasChanged } ?: functionalTypeConstructor.copy(
- projections = projections.mapNotNull { it.target }
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
- protected open fun processTypeAlias(dTypeAlias: DTypeAlias): AnyWithChanges<DTypeAlias> {
- val underlyingType = dTypeAlias.underlyingType.mapValues { processBound(it.value) }
- val generics = dTypeAlias.generics.map { processTypeParameter(it) }
-
- val wasChanged = underlyingType.any { it.value.changed } || generics.any { it.changed }
- return (dTypeAlias.takeIf { !wasChanged } ?: dTypeAlias.copy(
- underlyingType = underlyingType.mapValues { it.value.target ?: dTypeAlias.underlyingType.getValue(it.key) },
- generics = generics.mapNotNull { it.target }
- )).let { AnyWithChanges(it, wasChanged) }
- }
-
-
- protected data class AnyWithChanges<out T>(val target: T?, val changed: Boolean = false)
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilterTransformer.kt
deleted file mode 100644
index 6155a71f..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilterTransformer.kt
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.DokkaDefaults
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-
-public class DocumentableVisibilityFilterTransformer(
- public val context: DokkaContext
-) : PreMergeDocumentableTransformer {
-
- override fun invoke(modules: List<DModule>): List<DModule> {
- return modules.map { original ->
- val sourceSet = original.sourceSets.single()
- val packageOptions = sourceSet.perPackageOptions
- DocumentableVisibilityFilter(packageOptions, sourceSet).processModule(original)
- }
- }
-
- private class DocumentableVisibilityFilter(
- val packageOptions: List<DokkaConfiguration.PackageOptions>,
- val globalOptions: DokkaSourceSet
- ) {
- fun Visibility.isAllowedInPackage(packageName: String?) = when (this) {
- is JavaVisibility.Public,
- is KotlinVisibility.Public -> isAllowedInPackage(packageName, DokkaConfiguration.Visibility.PUBLIC)
- is JavaVisibility.Private,
- is KotlinVisibility.Private -> isAllowedInPackage(packageName, DokkaConfiguration.Visibility.PRIVATE)
- is JavaVisibility.Protected,
- is KotlinVisibility.Protected -> isAllowedInPackage(packageName, DokkaConfiguration.Visibility.PROTECTED)
- is KotlinVisibility.Internal -> isAllowedInPackage(packageName, DokkaConfiguration.Visibility.INTERNAL)
- is JavaVisibility.Default -> isAllowedInPackage(packageName, DokkaConfiguration.Visibility.PACKAGE)
- }
-
- private fun isAllowedInPackage(packageName: String?, visibility: DokkaConfiguration.Visibility): Boolean {
- val packageOpts = packageName.takeIf { it != null }?.let { name ->
- packageOptions.firstOrNull { Regex(it.matchingRegex).matches(name) }
- }
-
- val (documentedVisibilities, includeNonPublic) =
- @Suppress("DEPRECATION") // for includeNonPublic, preserve backwards compatibility
- when {
- packageOpts != null -> packageOpts.documentedVisibilities to packageOpts.includeNonPublic
- else -> globalOptions.documentedVisibilities to globalOptions.includeNonPublic
- }
-
- // if `documentedVisibilities` is explicitly overridden by the user (i.e. not default value by reference),
- // deprecated `includeNonPublic` should not be taken into account, so that only one setting prevails
- val isDocumentedVisibilitiesOverridden = documentedVisibilities !== DokkaDefaults.documentedVisibilities
- return documentedVisibilities.contains(visibility) || (!isDocumentedVisibilitiesOverridden && includeNonPublic)
- }
-
- fun processModule(original: DModule) =
- filterPackages(original.packages).let { (modified, packages) ->
- if (!modified) original
- else
- DModule(
- original.name,
- packages = packages,
- documentation = original.documentation,
- sourceSets = original.sourceSets,
- extra = original.extra
- )
- }
-
-
- private fun filterPackages(packages: List<DPackage>): Pair<Boolean, List<DPackage>> {
- var packagesListChanged = false
- val filteredPackages = packages.map {
- var modified = false
- val functions = filterFunctions(it.functions).let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- val properties = filterProperties(it.properties).let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- val classlikes = filterClasslikes(it.classlikes).let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- val typeAliases = filterTypeAliases(it.typealiases).let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- when {
- !modified -> it
- else -> {
- packagesListChanged = true
- DPackage(
- it.dri,
- functions,
- properties,
- classlikes,
- typeAliases,
- it.documentation,
- it.expectPresentInSet,
- it.sourceSets,
- it.extra
- )
- }
- }
- }
- return Pair(packagesListChanged, filteredPackages)
- }
-
- @Suppress("UNUSED_PARAMETER")
- private fun <T : WithVisibility> alwaysTrue(a: T, p: DokkaSourceSet) = true
- @Suppress("UNUSED_PARAMETER")
- private fun <T : WithVisibility> alwaysFalse(a: T, p: DokkaSourceSet) = false
- @Suppress("UNUSED_PARAMETER")
- private fun <T> alwaysNoModify(a: T, sourceSets: Set<DokkaSourceSet>) = false to a
-
- private fun WithVisibility.visibilityForPlatform(data: DokkaSourceSet): Visibility? = visibility[data]
-
- private fun <T> T.filterPlatforms(
- additionalCondition: (T, DokkaSourceSet) -> Boolean = ::alwaysTrue,
- alternativeCondition: (T, DokkaSourceSet) -> Boolean = ::alwaysFalse
- ) where T : Documentable, T : WithVisibility =
- sourceSets.filter { d ->
- visibilityForPlatform(d)?.isAllowedInPackage(dri.packageName) == true &&
- additionalCondition(this, d) ||
- alternativeCondition(this, d)
- }.toSet()
-
- private fun <T> List<T>.transform(
- additionalCondition: (T, DokkaSourceSet) -> Boolean = ::alwaysTrue,
- alternativeCondition: (T, DokkaSourceSet) -> Boolean = ::alwaysFalse,
- modify: (T, Set<DokkaSourceSet>) -> Pair<Boolean, T> = ::alwaysNoModify,
- recreate: (T, Set<DokkaSourceSet>) -> T,
- ): Pair<Boolean, List<T>> where T : Documentable, T : WithVisibility {
- var changed = false
- val values = mapNotNull { t ->
- val filteredPlatforms = t.filterPlatforms(additionalCondition, alternativeCondition)
- when (filteredPlatforms.size) {
- t.visibility.size -> {
- val (wasChanged, element) = modify(t, filteredPlatforms)
- changed = changed || wasChanged
- element
- }
- 0 -> {
- changed = true
- null
- }
- else -> {
- changed = true
- recreate(t, filteredPlatforms)
- }
- }
- }
- return Pair(changed, values)
- }
-
- private fun filterFunctions(
- functions: List<DFunction>,
- additionalCondition: (DFunction, DokkaSourceSet) -> Boolean = ::alwaysTrue
- ) =
- functions.transform(additionalCondition) { original, filteredPlatforms ->
- with(original) {
- copy(
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sources = sources.filtered(filteredPlatforms),
- visibility = visibility.filtered(filteredPlatforms),
- generics = generics.mapNotNull { it.filter(filteredPlatforms) },
- sourceSets = filteredPlatforms,
- )
- }
- }
-
- private fun hasVisibleAccessorsForPlatform(property: DProperty, data: DokkaSourceSet) =
- property.getter?.visibilityForPlatform(data)?.isAllowedInPackage(property.dri.packageName) == true ||
- property.setter?.visibilityForPlatform(data)?.isAllowedInPackage(property.dri.packageName) == true
-
- private fun filterProperties(
- properties: List<DProperty>,
- additionalCondition: (DProperty, DokkaSourceSet) -> Boolean = ::alwaysTrue,
- additionalConditionAccessors: (DFunction, DokkaSourceSet) -> Boolean = ::alwaysTrue
- ): Pair<Boolean, List<DProperty>> {
-
- val modifier: (DProperty, Set<DokkaSourceSet>) -> Pair<Boolean, DProperty> =
- { original, _ ->
- val setter = original.setter?.let { filterFunctions(listOf(it), additionalConditionAccessors) }
- val getter = original.getter?.let { filterFunctions(listOf(it), additionalConditionAccessors) }
-
- val modified = setter?.first == true || getter?.first == true
-
- val property =
- if (modified)
- original.copy(
- setter = setter?.second?.firstOrNull(),
- getter = getter?.second?.firstOrNull()
- )
- else original
- modified to property
- }
-
- return properties.transform(
- additionalCondition,
- ::hasVisibleAccessorsForPlatform,
- modifier
- ) { original, filteredPlatforms ->
- val setter = original.setter?.let { filterFunctions(listOf(it), additionalConditionAccessors) }
- val getter = original.getter?.let { filterFunctions(listOf(it), additionalConditionAccessors) }
-
- with(original) {
- copy(
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sources = sources.filtered(filteredPlatforms),
- visibility = visibility.filtered(filteredPlatforms),
- sourceSets = filteredPlatforms,
- generics = generics.mapNotNull { it.filter(filteredPlatforms) },
- setter = setter?.second?.firstOrNull(),
- getter = getter?.second?.firstOrNull()
- )
- }
- }
- }
-
- private fun filterEnumEntries(entries: List<DEnumEntry>, filteredPlatforms: Set<DokkaSourceSet>): Pair<Boolean, List<DEnumEntry>> =
- entries.fold(Pair(false, emptyList())) { acc, entry ->
- val intersection = filteredPlatforms.intersect(entry.sourceSets)
- if (intersection.isEmpty()) Pair(true, acc.second)
- else {
- val functions = filterFunctions(entry.functions) { _, data -> data in intersection }
- val properties = filterProperties(entry.properties) { _, data -> data in intersection }
- val classlikes = filterClasslikes(entry.classlikes) { _, data -> data in intersection }
-
- DEnumEntry(
- entry.dri,
- entry.name,
- entry.documentation.filtered(intersection),
- entry.expectPresentInSet.filtered(filteredPlatforms),
- functions.second,
- properties.second,
- classlikes.second,
- intersection,
- entry.extra
- ).let { Pair(functions.first || properties.first || classlikes.first, acc.second + it) }
- }
- }
-
- private fun filterClasslikes(
- classlikeList: List<DClasslike>,
- additionalCondition: (DClasslike, DokkaSourceSet) -> Boolean = ::alwaysTrue
- ): Pair<Boolean, List<DClasslike>> {
- var classlikesListChanged = false
- val filteredClasslikes: List<DClasslike> = classlikeList.mapNotNull {
- with(it) {
- val filteredPlatforms = filterPlatforms(additionalCondition)
- if (filteredPlatforms.isEmpty()) {
- classlikesListChanged = true
- null
- } else {
- var modified = sourceSets.size != filteredPlatforms.size
- val functions =
- filterFunctions(functions) { _, data -> data in filteredPlatforms }.let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- val properties =
- filterProperties(properties) { _, data -> data in filteredPlatforms }.let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- val classlikes =
- filterClasslikes(classlikes) { _, data -> data in filteredPlatforms }.let { (listModified, list) ->
- modified = modified || listModified
- list
- }
- val companion =
- if (this is WithCompanion) filterClasslikes(listOfNotNull(companion)) { _, data -> data in filteredPlatforms }.let { (listModified, list) ->
- modified = modified || listModified
- list.firstOrNull() as DObject?
- } else null
- val constructors = if (this is WithConstructors)
- filterFunctions(constructors) { _, data -> data in filteredPlatforms }.let { (listModified, list) ->
- modified = modified || listModified
- list
- } else emptyList()
- val generics =
- if (this is WithGenerics) generics.mapNotNull { param -> param.filter(filteredPlatforms) } else emptyList()
- val enumEntries =
- if (this is DEnum) filterEnumEntries(entries, filteredPlatforms).let { (listModified, list) ->
- modified = modified || listModified
- list
- } else emptyList()
- classlikesListChanged = classlikesListChanged || modified
- when {
- !modified -> this
- this is DClass -> copy(
- constructors = constructors,
- functions = functions,
- properties = properties,
- classlikes = classlikes,
- sources = sources.filtered(filteredPlatforms),
- visibility = visibility.filtered(filteredPlatforms),
- companion = companion,
- generics = generics,
- supertypes = supertypes.filtered(filteredPlatforms),
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sourceSets = filteredPlatforms
- )
- this is DAnnotation -> copy(
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sources = sources.filtered(filteredPlatforms),
- functions = functions,
- properties = properties,
- classlikes = classlikes,
- visibility = visibility.filtered(filteredPlatforms),
- companion = companion,
- constructors = constructors,
- generics = generics,
- sourceSets = filteredPlatforms
- )
- this is DEnum -> copy(
- entries = enumEntries,
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sources = sources.filtered(filteredPlatforms),
- functions = functions,
- properties = properties,
- classlikes = classlikes,
- visibility = visibility.filtered(filteredPlatforms),
- companion = companion,
- constructors = constructors,
- supertypes = supertypes.filtered(filteredPlatforms),
- sourceSets = filteredPlatforms
- )
- this is DInterface -> copy(
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sources = sources.filtered(filteredPlatforms),
- functions = functions,
- properties = properties,
- classlikes = classlikes,
- visibility = visibility.filtered(filteredPlatforms),
- companion = companion,
- generics = generics,
- supertypes = supertypes.filtered(filteredPlatforms),
- sourceSets = filteredPlatforms
- )
- this is DObject -> copy(
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- sources = sources.filtered(filteredPlatforms),
- functions = functions,
- properties = properties,
- classlikes = classlikes,
- supertypes = supertypes.filtered(filteredPlatforms),
- sourceSets = filteredPlatforms
- )
- else -> null
- }
- }
- }
- }
- return Pair(classlikesListChanged, filteredClasslikes)
- }
-
- private fun filterTypeAliases(
- typeAliases: List<DTypeAlias>,
- additionalCondition: (DTypeAlias, DokkaSourceSet) -> Boolean = ::alwaysTrue
- ) =
- typeAliases.transform(additionalCondition) { original, filteredPlatforms ->
- with(original) {
- copy(
- documentation = documentation.filtered(filteredPlatforms),
- expectPresentInSet = expectPresentInSet.filtered(filteredPlatforms),
- underlyingType = underlyingType.filtered(filteredPlatforms),
- visibility = visibility.filtered(filteredPlatforms),
- generics = generics.mapNotNull { it.filter(filteredPlatforms) },
- sourceSets = filteredPlatforms,
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/EmptyModulesFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/EmptyModulesFilterTransformer.kt
deleted file mode 100644
index 7a2387dc..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/EmptyModulesFilterTransformer.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-
-public class EmptyModulesFilterTransformer : PreMergeDocumentableTransformer {
- override fun invoke(modules: List<DModule>): List<DModule> {
- return modules.filter { it.children.isNotEmpty() }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/EmptyPackagesFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/EmptyPackagesFilterTransformer.kt
deleted file mode 100644
index 30ac8f70..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/EmptyPackagesFilterTransformer.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-import org.jetbrains.dokka.transformers.documentation.sourceSet
-
-public class EmptyPackagesFilterTransformer(
- public val context: DokkaContext
-) : PreMergeDocumentableTransformer {
- override fun invoke(modules: List<DModule>): List<DModule> {
- return modules.mapNotNull(::filterModule)
- }
-
- private fun filterModule(module: DModule): DModule? {
- val nonEmptyPackages = module.packages.filterNot { pkg ->
- sourceSet(pkg).skipEmptyPackages && pkg.children.isEmpty()
- }
-
- return when {
- nonEmptyPackages == module.packages -> module
- nonEmptyPackages.isEmpty() -> null
- else -> module.copy(packages = nonEmptyPackages)
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ExtensionExtractorTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/ExtensionExtractorTransformer.kt
deleted file mode 100644
index e6102622..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/ExtensionExtractorTransformer.kt
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import kotlinx.coroutines.*
-import kotlinx.coroutines.channels.*
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.DriOfAny
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.ExtraProperty
-import org.jetbrains.dokka.model.properties.MergeStrategy
-import org.jetbrains.dokka.model.properties.plus
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-import org.jetbrains.dokka.utilities.parallelForEach
-import org.jetbrains.dokka.utilities.parallelMap
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-public class ExtensionExtractorTransformer : DocumentableTransformer {
- override fun invoke(original: DModule, context: DokkaContext): DModule = runBlocking(Dispatchers.Default) {
- val classGraph = async {
- if (!context.configuration.suppressInheritedMembers)
- context.plugin<InternalKotlinAnalysisPlugin>().querySingle { fullClassHierarchyBuilder }.build(original)
- else
- emptyMap()
- }
-
- val channel = Channel<Pair<DRI, Callable>>(10)
- launch {
- original.packages.parallelForEach { collectExtensions(it, channel) }
- channel.close()
- }
- val extensionMap = channel.toList().toMultiMap()
-
- val newPackages = original.packages.parallelMap { it.addExtensionInformation(classGraph.await(), extensionMap) }
- original.copy(packages = newPackages)
- }
-
- private suspend fun <T : Documentable> T.addExtensionInformation(
- classGraph: SourceSetDependent<Map<DRI, List<DRI>>>,
- extensionMap: Map<DRI, List<Callable>>
- ): T = coroutineScope {
- val newClasslikes = (this@addExtensionInformation as? WithScope)
- ?.classlikes
- ?.map { async { it.addExtensionInformation(classGraph, extensionMap) } }
- .orEmpty()
-
- @Suppress("UNCHECKED_CAST")
- when (this@addExtensionInformation) {
- is DPackage -> {
- val newTypealiases = typealiases.map { async { it.addExtensionInformation(classGraph, extensionMap) } }
- copy(classlikes = newClasslikes.awaitAll(), typealiases = newTypealiases.awaitAll())
- }
-
- is DClass -> copy(
- classlikes = newClasslikes.awaitAll(),
- extra = extra + findExtensions(classGraph, extensionMap)
- )
-
- is DEnum -> copy(
- classlikes = newClasslikes.awaitAll(),
- extra = extra + findExtensions(classGraph, extensionMap)
- )
-
- is DInterface -> copy(
- classlikes = newClasslikes.awaitAll(),
- extra = extra + findExtensions(classGraph, extensionMap)
- )
-
- is DObject -> copy(
- classlikes = newClasslikes.awaitAll(),
- extra = extra + findExtensions(classGraph, extensionMap)
- )
-
- is DAnnotation -> copy(
- classlikes = newClasslikes.awaitAll(),
- extra = extra + findExtensions(classGraph, extensionMap)
- )
-
- is DTypeAlias -> copy(extra = extra + findExtensions(classGraph, extensionMap))
- else -> throw IllegalStateException(
- "${this@addExtensionInformation::class.simpleName} is not expected to have extensions"
- )
- } as T
- }
-
- private suspend fun collectExtensions(
- documentable: Documentable,
- channel: SendChannel<Pair<DRI, Callable>>
- ): Unit = coroutineScope {
- if (documentable is WithScope) {
- documentable.classlikes.forEach {
- launch { collectExtensions(it, channel) }
- }
-
- if (documentable is DObject || documentable is DPackage) {
- (documentable.properties.asSequence() + documentable.functions.asSequence())
- .flatMap { it.asPairsWithReceiverDRIs() }
- .forEach { channel.send(it) }
- }
- }
- }
-
- private fun <T : Documentable> T.findExtensions(
- classGraph: SourceSetDependent<Map<DRI, List<DRI>>>,
- extensionMap: Map<DRI, List<Callable>>
- ): CallableExtensions? {
- val resultSet = mutableSetOf<Callable>()
-
- fun collectFrom(element: DRI) {
- extensionMap[element]?.let { resultSet.addAll(it) }
- sourceSets.forEach { sourceSet -> classGraph[sourceSet]?.get(element)?.forEach { collectFrom(it) } }
- }
- collectFrom(dri)
-
- return if (resultSet.isEmpty()) null else CallableExtensions(resultSet)
- }
-
- private fun Callable.asPairsWithReceiverDRIs(): Sequence<Pair<DRI, Callable>> =
- receiver?.type?.let { findReceiverDRIs(it) }.orEmpty().map { it to this }
-
- // In normal cases we return at max one DRI, but sometimes receiver type can be bound by more than one type constructor
- // for example `fun <T> T.example() where T: A, T: B` is extension of both types A and B
- // another one `typealias A = B`
- // Note: in some cases returning empty sequence doesn't mean that we cannot determine the DRI but only that we don't
- // care about it since there is nowhere to put documentation of given extension.
- private fun Callable.findReceiverDRIs(bound: Bound): Sequence<DRI> = when (bound) {
- is Nullable -> findReceiverDRIs(bound.inner)
- is DefinitelyNonNullable -> findReceiverDRIs(bound.inner)
- is TypeParameter ->
- if (this is DFunction && bound.dri == this.dri)
- generics.find { it.name == bound.name }?.bounds?.asSequence()?.flatMap { findReceiverDRIs(it) }.orEmpty()
- else
- emptySequence()
-
- is TypeConstructor -> sequenceOf(bound.dri)
- is PrimitiveJavaType -> emptySequence()
- is Void -> emptySequence()
- is JavaObject -> sequenceOf(DriOfAny)
- is Dynamic -> sequenceOf(DriOfAny)
- is UnresolvedBound -> emptySequence()
- is TypeAliased -> findReceiverDRIs(bound.typeAlias) + findReceiverDRIs(bound.inner)
- }
-
- private fun <T, U> Iterable<Pair<T, U>>.toMultiMap(): Map<T, List<U>> =
- groupBy(Pair<T, *>::first, Pair<*, U>::second)
-}
-
-public data class CallableExtensions(val extensions: Set<Callable>) : ExtraProperty<Documentable> {
- public companion object Key : ExtraProperty.Key<Documentable, CallableExtensions> {
- override fun mergeStrategyFor(left: CallableExtensions, right: CallableExtensions): MergeStrategy<Documentable> =
- MergeStrategy.Replace(CallableExtensions(left.extensions + right.extensions))
- }
-
- override val key: Key = Key
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/InheritedEntriesDocumentableFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/InheritedEntriesDocumentableFilterTransformer.kt
deleted file mode 100644
index d9b7053a..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/InheritedEntriesDocumentableFilterTransformer.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.InheritedMember
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class InheritedEntriesDocumentableFilterTransformer(
- context: DokkaContext
-) : SuppressedByConditionDocumentableFilterTransformer(context) {
-
- override fun shouldBeSuppressed(d: Documentable): Boolean {
- @Suppress("UNCHECKED_CAST")
- val inheritedMember = (d as? WithExtraProperties<Documentable>)?.extra?.get(InheritedMember)
- val containsInheritedFrom = inheritedMember?.inheritedFrom?.any { entry -> entry.value != null } ?: false
-
- return context.configuration.suppressInheritedMembers && containsInheritedFrom
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt
deleted file mode 100644
index 2c7d6b89..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.ExtraProperty
-import org.jetbrains.dokka.model.properties.MergeStrategy
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-
-public class InheritorsExtractorTransformer : DocumentableTransformer {
- override fun invoke(original: DModule, context: DokkaContext): DModule =
- original.generateInheritanceMap().let { inheritanceMap -> original.appendInheritors(inheritanceMap) as DModule }
-
- private fun <T : Documentable> T.appendInheritors(inheritanceMap: Map<DokkaSourceSet, Map<DRI, List<DRI>>>): Documentable =
- InheritorsInfo(inheritanceMap.getForDRI(dri)).let { info ->
- when (this) {
- is DModule -> copy(packages = packages.map { it.appendInheritors(inheritanceMap) as DPackage })
- is DPackage -> copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- is DClass -> if (info.isNotEmpty()) {
- copy(
- extra = extra + info,
- classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- } else {
- copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- }
- is DEnum -> if (info.isNotEmpty()) {
- copy(
- extra = extra + info,
- classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- } else {
- copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- }
- is DInterface -> if (info.isNotEmpty()) {
- copy(
- extra = extra + info,
- classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- } else {
- copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- }
- is DObject -> copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- is DAnnotation -> copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike })
- else -> this
- }
- }
-
- private fun InheritorsInfo.isNotEmpty() = this.value.values.fold(0) { acc, list -> acc + list.size } > 0
-
- private fun Map<DokkaSourceSet, Map<DRI, List<DRI>>>.getForDRI(dri: DRI) =
- map { (v, k) ->
- v to k[dri]
- }.associate { (k, v) -> k to v.orEmpty() }
-
- private fun DModule.generateInheritanceMap() =
- getInheritanceEntriesRec().filterNot { it.second.isEmpty() }.groupBy({ it.first }) { it.second }
- .map { (k, v) ->
- k to v.flatMap { p -> p.groupBy({ it.first }) { it.second }.toList() }
- .groupBy({ it.first }) { it.second }.map { (k2, v2) -> k2 to v2.flatten() }.toMap()
- }.filter { it.second.values.isNotEmpty() }.toMap()
-
- private fun <T : Documentable> T.getInheritanceEntriesRec(): List<Pair<DokkaSourceSet, List<Pair<DRI, DRI>>>> =
- this.toInheritanceEntries() + children.flatMap { it.getInheritanceEntriesRec() }
-
- private fun <T : Documentable> T.toInheritanceEntries() =
- (this as? WithSupertypes)?.let {
- it.supertypes.map { (k, v) -> k to v.map { it.typeConstructor.dri to dri } }
- }.orEmpty()
-
-}
-
-public class InheritorsInfo(
- public val value: SourceSetDependent<List<DRI>>
-) : ExtraProperty<Documentable> {
- public companion object : ExtraProperty.Key<Documentable, InheritorsInfo> {
- override fun mergeStrategyFor(left: InheritorsInfo, right: InheritorsInfo): MergeStrategy<Documentable> =
- MergeStrategy.Replace(
- InheritorsInfo(
- (left.value.entries.toList() + right.value.entries.toList())
- .groupBy({ it.key }) { it.value }
- .map { (k, v) -> k to v.flatten() }.toMap()
- )
- )
- }
-
- override val key: ExtraProperty.Key<Documentable, *> = InheritorsInfo
-}
-
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/KotlinArrayDocumentableReplacerTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/KotlinArrayDocumentableReplacerTransformer.kt
deleted file mode 100644
index 7a360cb8..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/KotlinArrayDocumentableReplacerTransformer.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class KotlinArrayDocumentableReplacerTransformer(
- context: DokkaContext
-): DocumentableReplacerTransformer(context) {
-
- private fun Documentable.isJVM() =
- sourceSets.any{ it.analysisPlatform == Platform.jvm }
-
- override fun processGenericTypeConstructor(genericTypeConstructor: GenericTypeConstructor): AnyWithChanges<GenericTypeConstructor> =
- genericTypeConstructor.takeIf { genericTypeConstructor.dri == DRI("kotlin", "Array") }
- ?.let {
- with(it.projections.firstOrNull() as? Variance<Bound>) {
- with(this?.inner as? GenericTypeConstructor) {
- when (this?.dri) {
- DRI("kotlin", "Int") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
- true)
- DRI("kotlin", "Boolean") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
- true)
- DRI("kotlin", "Float") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "FloatArray"), emptyList()),
- true)
- DRI("kotlin", "Double") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "DoubleArray"), emptyList()),
- true)
- DRI("kotlin", "Long") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "LongArray"), emptyList()),
- true)
- DRI("kotlin", "Short") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "ShortArray"), emptyList()),
- true)
- DRI("kotlin", "Char") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "CharArray"), emptyList()),
- true)
- DRI("kotlin", "Byte") ->
- AnyWithChanges(
- GenericTypeConstructor(DRI("kotlin", "ByteArray"), emptyList()),
- true)
- else -> null
- }
- }
- }
- }
- ?: super.processGenericTypeConstructor(genericTypeConstructor)
-
- override fun processModule(module: DModule): AnyWithChanges<DModule> =
- if(module.isJVM())
- super.processModule(module)
- else AnyWithChanges(module)
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt
deleted file mode 100644
index c19bc15e..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.model.SourceSetDependent
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import org.jetbrains.dokka.analysis.kotlin.internal.ModuleAndPackageDocumentationReader
-
-internal class ModuleAndPackageDocumentationTransformer(
- private val moduleAndPackageDocumentationReader: ModuleAndPackageDocumentationReader
-) : PreMergeDocumentableTransformer {
-
- constructor(context: DokkaContext) : this(
- context.plugin<InternalKotlinAnalysisPlugin>().querySingle { moduleAndPackageDocumentationReader }
- )
-
- override fun invoke(modules: List<DModule>): List<DModule> {
- return modules.map { module ->
- module.copy(
- documentation = module.documentation + moduleAndPackageDocumentationReader.read(module),
- packages = module.packages.map { pkg ->
- pkg.copy(
- documentation = pkg.documentation + moduleAndPackageDocumentationReader.read(pkg)
- )
- }
- )
- }
- }
-
- private operator fun SourceSetDependent<DocumentationNode>.plus(
- other: SourceSetDependent<DocumentationNode>
- ): Map<DokkaSourceSet, DocumentationNode> =
- (asSequence() + other.asSequence())
- .distinct()
- .groupBy({ it.key }, { it.value })
- .mapValues { (_, values) -> DocumentationNode(values.flatMap { it.children }) }
-
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ObviousFunctionsDocumentableFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/ObviousFunctionsDocumentableFilterTransformer.kt
deleted file mode 100644
index 09c6ac87..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/ObviousFunctionsDocumentableFilterTransformer.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.ObviousMember
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class ObviousFunctionsDocumentableFilterTransformer(
- context: DokkaContext
-) : SuppressedByConditionDocumentableFilterTransformer(context) {
- override fun shouldBeSuppressed(d: Documentable): Boolean =
- context.configuration.suppressObviousFunctions && d is DFunction && d.extra[ObviousMember] != null
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ReportUndocumentedTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/ReportUndocumentedTransformer.kt
deleted file mode 100644
index 2b270f18..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/ReportUndocumentedTransformer.kt
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-internal class ReportUndocumentedTransformer : DocumentableTransformer {
-
- override fun invoke(original: DModule, context: DokkaContext): DModule = original.apply {
- withDescendants().forEach { documentable -> invoke(documentable, context) }
- }
-
- private fun invoke(documentable: Documentable, context: DokkaContext) {
- documentable.sourceSets.forEach { sourceSet ->
- if (shouldBeReportedIfNotDocumented(documentable, sourceSet, context)) {
- reportIfUndocumented(context, documentable, sourceSet)
- }
- }
- }
-
- private fun shouldBeReportedIfNotDocumented(
- documentable: Documentable, sourceSet: DokkaSourceSet, context: DokkaContext
- ): Boolean {
- val packageOptionsOrNull = packageOptionsOrNull(sourceSet, documentable)
-
- if (!(packageOptionsOrNull?.reportUndocumented ?: sourceSet.reportUndocumented)) {
- return false
- }
-
- if (documentable is DParameter || documentable is DPackage || documentable is DModule) {
- return false
- }
-
- if (isConstructor(documentable)) {
- return false
- }
-
- val syntheticDetector = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { syntheticDocumentableDetector }
- if (syntheticDetector.isSynthetic(documentable, sourceSet)) {
- return false
- }
-
- if (isPrivateOrInternalApi(documentable, sourceSet)) {
- return false
- }
-
- return true
- }
-
- private fun reportIfUndocumented(
- context: DokkaContext,
- documentable: Documentable,
- sourceSet: DokkaSourceSet
- ) {
- if (isUndocumented(documentable, sourceSet)) {
- val documentableDescription = with(documentable) {
- buildString {
- dri.packageName?.run {
- append(this)
- append("/")
- }
-
- dri.classNames?.run {
- append(this)
- append("/")
- }
-
- dri.callable?.run {
- append(name)
- append("/")
- append(signature())
- append("/")
- }
-
- val sourceSetName = sourceSet.displayName
- if (sourceSetName != null.toString()) {
- append(" ($sourceSetName)")
- }
- }
- }
-
- context.logger.warn("Undocumented: $documentableDescription")
- }
- }
-
- private fun isUndocumented(documentable: Documentable, sourceSet: DokkaSourceSet): Boolean {
- fun resolveDependentSourceSets(sourceSet: DokkaSourceSet): List<DokkaSourceSet> {
- return sourceSet.dependentSourceSets.mapNotNull { sourceSetID ->
- documentable.sourceSets.singleOrNull { it.sourceSetID == sourceSetID }
- }
- }
-
- fun withAllDependentSourceSets(sourceSet: DokkaSourceSet): Sequence<DokkaSourceSet> = sequence {
- yield(sourceSet)
- for (dependentSourceSet in resolveDependentSourceSets(sourceSet)) {
- yieldAll(withAllDependentSourceSets(dependentSourceSet))
- }
- }
-
-
- return withAllDependentSourceSets(sourceSet).all { sourceSetOrDependentSourceSet ->
- documentable.documentation[sourceSetOrDependentSourceSet]?.children?.isEmpty() ?: true
- }
- }
-
- private fun isConstructor(documentable: Documentable): Boolean {
- if (documentable !is DFunction) return false
- return documentable.isConstructor
- }
-
- private fun isPrivateOrInternalApi(documentable: Documentable, sourceSet: DokkaSourceSet): Boolean {
- return when ((documentable as? WithVisibility)?.visibility?.get(sourceSet)) {
- KotlinVisibility.Public -> false
- KotlinVisibility.Private -> true
- KotlinVisibility.Protected -> true
- KotlinVisibility.Internal -> true
- JavaVisibility.Public -> false
- JavaVisibility.Private -> true
- JavaVisibility.Protected -> true
- JavaVisibility.Default -> true
- null -> false
- }
- }
-
- private fun packageOptionsOrNull(
- dokkaSourceSet: DokkaSourceSet,
- documentable: Documentable
- ): DokkaConfiguration.PackageOptions? {
- val packageName = documentable.dri.packageName ?: return null
- return dokkaSourceSet.perPackageOptions
- .filter { packageOptions -> Regex(packageOptions.matchingRegex).matches(packageName) }
- .maxByOrNull { packageOptions -> packageOptions.matchingRegex.length }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/SuppressTagDocumentableFilter.kt b/plugins/base/src/main/kotlin/transformers/documentables/SuppressTagDocumentableFilter.kt
deleted file mode 100644
index 1dbf1262..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/SuppressTagDocumentableFilter.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.Suppress
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class SuppressTagDocumentableFilter(
- public val dokkaContext: DokkaContext
-) : SuppressedByConditionDocumentableFilterTransformer(dokkaContext) {
- override fun shouldBeSuppressed(d: Documentable): Boolean =
- d.documentation.any { (_, docs) -> docs.dfs { it is Suppress } != null }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer.kt
deleted file mode 100644
index 4631cece..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConditionDocumentableFilterTransformer.kt
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-
-public abstract class SuppressedByConditionDocumentableFilterTransformer(
- public val context: DokkaContext
-) : PreMergeDocumentableTransformer {
- override fun invoke(modules: List<DModule>): List<DModule> =
- modules.map { module ->
- val (documentable, wasChanged) = processModule(module)
- documentable.takeIf { wasChanged } ?: module
- }
-
- public abstract fun shouldBeSuppressed(d: Documentable): Boolean
-
- private fun processModule(module: DModule): DocumentableWithChanges<DModule> {
- val afterProcessing = module.packages.map { processPackage(it) }
- val processedModule = module.takeIf { afterProcessing.none { it.changed } }
- ?: module.copy(packages = afterProcessing.mapNotNull { it.documentable })
- return DocumentableWithChanges(processedModule, afterProcessing.any { it.changed })
- }
-
- private fun processPackage(dPackage: DPackage): DocumentableWithChanges<DPackage> {
- if (shouldBeSuppressed(dPackage)) return DocumentableWithChanges.filteredDocumentable()
-
- val classlikes = dPackage.classlikes.map { processClassLike(it) }
- val typeAliases = dPackage.typealiases.map { processMember(it) }
- val functions = dPackage.functions.map { processMember(it) }
- val properies = dPackage.properties.map { processProperty(it) }
-
- val wasChanged = (classlikes + typeAliases + functions + properies).any { it.changed }
- return (dPackage.takeIf { !wasChanged } ?: dPackage.copy(
- classlikes = classlikes.mapNotNull { it.documentable },
- typealiases = typeAliases.mapNotNull { it.documentable },
- functions = functions.mapNotNull { it.documentable },
- properties = properies.mapNotNull { it.documentable }
- )).let { processedPackage -> DocumentableWithChanges(processedPackage, wasChanged) }
- }
-
- private fun processClassLike(classlike: DClasslike): DocumentableWithChanges<DClasslike> {
- if (shouldBeSuppressed(classlike)) return DocumentableWithChanges.filteredDocumentable()
-
- val functions = classlike.functions.map { processMember(it) }
- val classlikes = classlike.classlikes.map { processClassLike(it) }
- val properties = classlike.properties.map { processProperty(it) }
- val companion = (classlike as? WithCompanion)?.companion?.let { processClassLike(it) }
-
- val wasClasslikeChanged = (functions + classlikes + properties).any { it.changed } || companion?.changed == true
- return when (classlike) {
- is DClass -> {
- val constructors = classlike.constructors.map { processMember(it) }
- val wasClassChange =
- wasClasslikeChanged || constructors.any { it.changed }
- (classlike.takeIf { !wasClassChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.documentable },
- classlikes = classlikes.mapNotNull { it.documentable },
- properties = properties.mapNotNull { it.documentable },
- constructors = constructors.mapNotNull { it.documentable },
- companion = companion?.documentable as? DObject
- )).let { DocumentableWithChanges(it, wasClassChange) }
- }
- is DInterface -> (classlike.takeIf { !wasClasslikeChanged } ?: classlike.copy(
- functions = functions.mapNotNull { it.documentable },
- classlikes = classlikes.mapNotNull { it.documentable },
- properties = properties.mapNotNull { it.documentable },
- companion = companion?.documentable as? DObject
- )).let { DocumentableWithChanges(it, wasClasslikeChanged) }
- is DObject -> (classlike.takeIf { !wasClasslikeChanged } ?: classlike.copy(
- functions = functions.mapNotNull { it.documentable },
- classlikes = classlikes.mapNotNull { it.documentable },
- properties = properties.mapNotNull { it.documentable },
- )).let { DocumentableWithChanges(it, wasClasslikeChanged) }
- is DAnnotation -> {
- val constructors = classlike.constructors.map { processMember(it) }
- val wasClassChange =
- wasClasslikeChanged || constructors.any { it.changed }
- (classlike.takeIf { !wasClassChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.documentable },
- classlikes = classlikes.mapNotNull { it.documentable },
- properties = properties.mapNotNull { it.documentable },
- constructors = constructors.mapNotNull { it.documentable },
- companion = companion?.documentable as? DObject
- )).let { DocumentableWithChanges(it, wasClassChange) }
- }
- is DEnum -> {
- val constructors = classlike.constructors.map { processMember(it) }
- val entries = classlike.entries.map { processEnumEntry(it) }
- val wasClassChange =
- wasClasslikeChanged || (constructors + entries).any { it.changed }
- (classlike.takeIf { !wasClassChange } ?: classlike.copy(
- functions = functions.mapNotNull { it.documentable },
- classlikes = classlikes.mapNotNull { it.documentable },
- properties = properties.mapNotNull { it.documentable },
- constructors = constructors.mapNotNull { it.documentable },
- companion = companion?.documentable as? DObject,
- entries = entries.mapNotNull { it.documentable }
- )).let { DocumentableWithChanges(it, wasClassChange) }
- }
- }
- }
-
- private fun processEnumEntry(dEnumEntry: DEnumEntry): DocumentableWithChanges<DEnumEntry> {
- if (shouldBeSuppressed(dEnumEntry)) return DocumentableWithChanges.filteredDocumentable()
-
- val functions = dEnumEntry.functions.map { processMember(it) }
- val properties = dEnumEntry.properties.map { processProperty(it) }
- val classlikes = dEnumEntry.classlikes.map { processClassLike(it) }
-
- val wasChanged = (functions + properties + classlikes).any { it.changed }
- return (dEnumEntry.takeIf { !wasChanged } ?: dEnumEntry.copy(
- functions = functions.mapNotNull { it.documentable },
- classlikes = classlikes.mapNotNull { it.documentable },
- properties = properties.mapNotNull { it.documentable },
- )).let { DocumentableWithChanges(it, wasChanged) }
- }
-
- private fun processProperty(dProperty: DProperty): DocumentableWithChanges<DProperty> {
- if (shouldBeSuppressed(dProperty)) return DocumentableWithChanges.filteredDocumentable()
-
- val getter = dProperty.getter?.let { processMember(it) } ?: DocumentableWithChanges(null, false)
- val setter = dProperty.setter?.let { processMember(it) } ?: DocumentableWithChanges(null, false)
-
- val wasChanged = getter.changed || setter.changed
- return (dProperty.takeIf { !wasChanged } ?: dProperty.copy(
- getter = getter.documentable,
- setter = setter.documentable
- )).let { DocumentableWithChanges(it, wasChanged) }
- }
-
- private fun <T : Documentable> processMember(member: T): DocumentableWithChanges<T> =
- if (shouldBeSuppressed(member)) DocumentableWithChanges.filteredDocumentable()
- else DocumentableWithChanges(member, false)
-
- private data class DocumentableWithChanges<T : Documentable>(val documentable: T?, val changed: Boolean = false) {
- companion object {
- fun <T : Documentable> filteredDocumentable(): DocumentableWithChanges<T> =
- DocumentableWithChanges(null, true)
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConfigurationDocumentableFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConfigurationDocumentableFilterTransformer.kt
deleted file mode 100644
index 3195f88d..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/SuppressedByConfigurationDocumentableFilterTransformer.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-import org.jetbrains.dokka.transformers.documentation.perPackageOptions
-import org.jetbrains.dokka.transformers.documentation.source
-import org.jetbrains.dokka.transformers.documentation.sourceSet
-import java.io.File
-
-public class SuppressedByConfigurationDocumentableFilterTransformer(
- public val context: DokkaContext
-) : PreMergeDocumentableTransformer {
- override fun invoke(modules: List<DModule>): List<DModule> {
- return modules.mapNotNull(::filterModule)
- }
-
- private fun filterModule(module: DModule): DModule? {
- val packages = module.packages.mapNotNull { pkg -> filterPackage(pkg) }
- return when {
- packages == module.packages -> module
- packages.isEmpty() -> null
- else -> module.copy(packages = packages)
- }
- }
-
- private fun filterPackage(pkg: DPackage): DPackage? {
- val options = perPackageOptions(pkg)
- if (options?.suppress == true) {
- return null
- }
-
- val filteredChildren = pkg.children.filterNot(::isSuppressed)
- return when {
- filteredChildren == pkg.children -> pkg
- filteredChildren.isEmpty() -> null
- else -> pkg.copy(
- functions = filteredChildren.filterIsInstance<DFunction>(),
- classlikes = filteredChildren.filterIsInstance<DClasslike>(),
- typealiases = filteredChildren.filterIsInstance<DTypeAlias>(),
- properties = filteredChildren.filterIsInstance<DProperty>()
- )
- }
- }
-
- private fun isSuppressed(documentable: Documentable): Boolean {
- if (documentable !is WithSources) return false
- val sourceFile = File(source(documentable).path).absoluteFile
- return sourceSet(documentable).suppressedFiles.any { suppressedFile ->
- sourceFile.startsWith(suppressedFile.absoluteFile)
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/utils.kt b/plugins/base/src/main/kotlin/transformers/documentables/utils.kt
deleted file mode 100644
index 60a6396a..00000000
--- a/plugins/base/src/main/kotlin/transformers/documentables/utils.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.documentables
-
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.ExceptionInSupertypes
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-public val <T : Documentable> WithExtraProperties<T>.isException: Boolean
- get() = extra[ExceptionInSupertypes] != null
-
-
-public val <T : Documentable> WithExtraProperties<T>.deprecatedAnnotation: Annotations.Annotation?
- get() = extra[Annotations]?.let { annotations ->
- annotations.directAnnotations.values.flatten().firstOrNull {
- it.isDeprecated()
- }
- }
-
-/**
- * @return true if [T] has [kotlin.Deprecated] or [java.lang.Deprecated]
- * annotation for **any** source set
- */
-public fun <T : Documentable> WithExtraProperties<T>.isDeprecated(): Boolean = deprecatedAnnotation != null
-
-/**
- * @return true for [kotlin.Deprecated] and [java.lang.Deprecated]
- */
-public fun Annotations.Annotation.isDeprecated(): Boolean {
- return (this.dri.packageName == "kotlin" && this.dri.classNames == "Deprecated") ||
- (this.dri.packageName == "java.lang" && this.dri.classNames == "Deprecated")
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/DefaultSamplesTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/DefaultSamplesTransformer.kt
deleted file mode 100644
index 1ba049c8..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/DefaultSamplesTransformer.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages
-
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.doc.Sample
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import org.jetbrains.dokka.analysis.kotlin.internal.SampleProvider
-import org.jetbrains.dokka.analysis.kotlin.internal.SampleProviderFactory
-
-internal const val KOTLIN_PLAYGROUND_SCRIPT = "https://unpkg.com/kotlin-playground@1/dist/playground.min.js"
-
-internal class DefaultSamplesTransformer(val context: DokkaContext) : PageTransformer {
-
- private val sampleProviderFactory: SampleProviderFactory = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { sampleProviderFactory }
-
- override fun invoke(input: RootPageNode): RootPageNode {
- return sampleProviderFactory.build().use { sampleProvider ->
- input.transformContentPagesTree { page ->
- val samples = (page as? WithDocumentables)?.documentables?.flatMap {
- it.documentation.entries.flatMap { entry ->
- entry.value.children.filterIsInstance<Sample>().map { entry.key to it }
- }
- } ?: return@transformContentPagesTree page
-
- val newContent = samples.fold(page.content) { acc, (sampleSourceSet, sample) ->
- sampleProvider.getSample(sampleSourceSet, sample.name)
- ?.let {
- acc.addSample(page, sample.name, it)
- } ?: acc
- }
-
- page.modified(
- content = newContent,
- embeddedResources = page.embeddedResources + KOTLIN_PLAYGROUND_SCRIPT
- )
- }
- }
- }
-
-
- private fun ContentNode.addSample(
- contentPage: ContentPage,
- fqLink: String,
- sample: SampleProvider.SampleSnippet,
- ): ContentNode {
- val node = contentCode(contentPage.content.sourceSets, contentPage.dri, createSampleBody(sample.imports, sample.body), "kotlin")
- return dfs(fqLink, node)
- }
-
- fun createSampleBody(imports: String, body: String) =
- """ |$imports
- |fun main() {
- | //sampleStart
- | $body
- | //sampleEnd
- |}""".trimMargin()
-
- private fun ContentNode.dfs(fqName: String, node: ContentCodeBlock): ContentNode {
- return when (this) {
- is ContentHeader -> copy(children.map { it.dfs(fqName, node) })
- is ContentDivergentGroup -> @Suppress("UNCHECKED_CAST") copy(children.map {
- it.dfs(fqName, node)
- } as List<ContentDivergentInstance>)
- is ContentDivergentInstance -> copy(
- before.let { it?.dfs(fqName, node) },
- divergent.dfs(fqName, node),
- after.let { it?.dfs(fqName, node) })
- is ContentCodeBlock -> copy(children.map { it.dfs(fqName, node) })
- is ContentCodeInline -> copy(children.map { it.dfs(fqName, node) })
- is ContentDRILink -> copy(children.map { it.dfs(fqName, node) })
- is ContentResolvedLink -> copy(children.map { it.dfs(fqName, node) })
- is ContentEmbeddedResource -> copy(children.map { it.dfs(fqName, node) })
- is ContentTable -> copy(children = children.map { it.dfs(fqName, node) as ContentGroup })
- is ContentList -> copy(children.map { it.dfs(fqName, node) })
- is ContentGroup -> copy(children.map { it.dfs(fqName, node) })
- is PlatformHintedContent -> copy(inner.dfs(fqName, node))
- is ContentText -> if (text == fqName) node else this
- is ContentBreakLine -> this
- else -> this.also { context.logger.error("Could not recognize $this ContentNode in SamplesTransformer") }
- }
- }
-
- private fun contentCode(
- sourceSets: Set<DisplaySourceSet>,
- dri: Set<DRI>,
- content: String,
- language: String,
- styles: Set<Style> = emptySet(),
- extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
- ) =
- ContentCodeBlock(
- children = listOf(
- ContentText(
- text = content,
- dci = DCI(dri, ContentKind.Sample),
- sourceSets = sourceSets,
- style = emptySet(),
- extra = PropertyContainer.empty()
- )
- ),
- language = language,
- dci = DCI(dri, ContentKind.Sample),
- sourceSets = sourceSets,
- style = styles + ContentStyle.RunnableSample + TextStyle.Monospace,
- extra = extra
- )
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/annotations/SinceKotlinTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/annotations/SinceKotlinTransformer.kt
deleted file mode 100644
index 9ff5960d..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/annotations/SinceKotlinTransformer.kt
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.annotations
-
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.analysis.markdown.jb.MARKDOWN_ELEMENT_FILE_NAME
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.annotations
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.CustomDocTag
-import org.jetbrains.dokka.model.doc.CustomTagWrapper
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-import org.jetbrains.dokka.utilities.associateWithNotNull
-
-public class SinceKotlinVersion(str: String) : Comparable<SinceKotlinVersion> {
- private val parts: List<Int> = str.split(".").map { it.toInt() }
-
- /**
- * Corner case: 1.0 == 1.0.0
- */
- override fun compareTo(other: SinceKotlinVersion): Int {
- val i1 = parts.listIterator()
- val i2 = other.parts.listIterator()
-
- while (i1.hasNext() || i2.hasNext()) {
- val diff = (if (i1.hasNext()) i1.next() else 0) - (if (i2.hasNext()) i2.next() else 0)
- if (diff != 0) return diff
- }
-
- return 0
- }
-
- override fun toString(): String = parts.joinToString(".")
-}
-
-public class SinceKotlinTransformer(
- public val context: DokkaContext
-) : DocumentableTransformer {
-
- private val minSinceKotlinVersionOfPlatform = mapOf(
- Platform.common to SinceKotlinVersion("1.0"),
- Platform.jvm to SinceKotlinVersion("1.0"),
- Platform.js to SinceKotlinVersion("1.1"),
- Platform.native to SinceKotlinVersion("1.3"),
- Platform.wasm to SinceKotlinVersion("1.8"),
- )
-
- override fun invoke(original: DModule, context: DokkaContext): DModule = original.transform() as DModule
-
- private fun <T : Documentable> T.transform(parent: SourceSetDependent<SinceKotlinVersion>? = null): Documentable {
- val versions = calculateVersions(parent)
- return when (this) {
- is DModule -> copy(
- packages = packages.map { it.transform() as DPackage }
- )
-
- is DPackage -> copy(
- classlikes = classlikes.map { it.transform() as DClasslike },
- functions = functions.map { it.transform() as DFunction },
- properties = properties.map { it.transform() as DProperty },
- typealiases = typealiases.map { it.transform() as DTypeAlias }
- )
-
- is DClass -> copy(
- documentation = appendSinceKotlin(versions),
- classlikes = classlikes.map { it.transform(versions) as DClasslike },
- functions = functions.map { it.transform(versions) as DFunction },
- properties = properties.map { it.transform(versions) as DProperty }
- )
-
- is DEnum -> copy(
- documentation = appendSinceKotlin(versions),
- classlikes = classlikes.map { it.transform(versions) as DClasslike },
- functions = functions.map { it.transform(versions) as DFunction },
- properties = properties.map { it.transform(versions) as DProperty }
- )
-
- is DInterface -> copy(
- documentation = appendSinceKotlin(versions),
- classlikes = classlikes.map { it.transform(versions) as DClasslike },
- functions = functions.map { it.transform(versions) as DFunction },
- properties = properties.map { it.transform(versions) as DProperty }
- )
-
- is DObject -> copy(
- documentation = appendSinceKotlin(versions),
- classlikes = classlikes.map { it.transform(versions) as DClasslike },
- functions = functions.map { it.transform(versions) as DFunction },
- properties = properties.map { it.transform(versions) as DProperty }
- )
-
- is DTypeAlias -> copy(
- documentation = appendSinceKotlin(versions)
- )
-
- is DAnnotation -> copy(
- documentation = appendSinceKotlin(versions),
- classlikes = classlikes.map { it.transform(versions) as DClasslike },
- functions = functions.map { it.transform(versions) as DFunction },
- properties = properties.map { it.transform(versions) as DProperty }
- )
-
- is DFunction -> copy(
- documentation = appendSinceKotlin(versions)
- )
-
- is DProperty -> copy(
- documentation = appendSinceKotlin(versions)
- )
-
- is DParameter -> copy(
- documentation = appendSinceKotlin(versions)
- )
-
- else -> this.also { context.logger.warn("Unrecognized documentable $this while SinceKotlin transformation") }
- }
- }
-
- private fun List<Annotations.Annotation>.findSinceKotlinAnnotation(): Annotations.Annotation? =
- this.find { it.dri.packageName == "kotlin" && it.dri.classNames == "SinceKotlin" }
-
- private fun Documentable.getVersion(sourceSet: DokkaConfiguration.DokkaSourceSet): SinceKotlinVersion {
- val annotatedVersion =
- annotations()[sourceSet]
- ?.findSinceKotlinAnnotation()
- ?.params?.let { it["version"] as? StringValue }?.value
- ?.let { SinceKotlinVersion(it) }
-
- val minSinceKotlin = minSinceKotlinVersionOfPlatform[sourceSet.analysisPlatform]
- ?: throw IllegalStateException("No value for platform: ${sourceSet.analysisPlatform}")
-
- return annotatedVersion?.takeIf { version -> version >= minSinceKotlin } ?: minSinceKotlin
- }
-
-
- private fun Documentable.calculateVersions(parent: SourceSetDependent<SinceKotlinVersion>?): SourceSetDependent<SinceKotlinVersion> {
- return sourceSets.associateWithNotNull { sourceSet ->
- val version = getVersion(sourceSet)
- val parentVersion = parent?.get(sourceSet)
- if (parentVersion != null)
- maxOf(version, parentVersion)
- else
- version
- }
- }
-
- private fun Documentable.appendSinceKotlin(versions: SourceSetDependent<SinceKotlinVersion>) =
- sourceSets.fold(documentation) { acc, sourceSet ->
-
- val version = versions[sourceSet]
-
- val sinceKotlinCustomTag = CustomTagWrapper(
- CustomDocTag(
- listOf(
- Text(
- version.toString()
- )
- ),
- name = MARKDOWN_ELEMENT_FILE_NAME
- ),
- "Since Kotlin"
- )
- if (acc[sourceSet] == null)
- acc + (sourceSet to DocumentationNode(listOf(sinceKotlinCustomTag)))
- else
- acc.mapValues {
- if (it.key == sourceSet) it.value.copy(
- it.value.children + listOf(
- sinceKotlinCustomTag
- )
- ) else it.value
- }
- }
-
- internal companion object {
- internal const val SHOULD_DISPLAY_SINCE_KOTLIN_SYS_PROP = "dokka.shouldDisplaySinceKotlin"
- internal fun shouldDisplaySinceKotlin() =
- System.getProperty(SHOULD_DISPLAY_SINCE_KOTLIN_SYS_PROP) in listOf("true", "1")
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt b/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt
deleted file mode 100644
index 6ca3f8d0..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.comments
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.model.doc.DocTag
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.pages.DCI
-import org.jetbrains.dokka.pages.Style
-
-public interface CommentsToContentConverter {
- public fun buildContent(
- docTag: DocTag,
- dci: DCI,
- sourceSets: Set<DokkaSourceSet>,
- styles: Set<Style> = emptySet(),
- extras: PropertyContainer<ContentNode> = PropertyContainer.empty()
- ): List<ContentNode>
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt b/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt
deleted file mode 100644
index e4e0f53f..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.comments
-
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.analysis.markdown.jb.MARKDOWN_ELEMENT_FILE_NAME
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.model.properties.plus
-import org.jetbrains.dokka.model.toDisplaySourceSets
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.firstIsInstanceOrNull
-
-public open class DocTagToContentConverter : CommentsToContentConverter {
- override fun buildContent(
- docTag: DocTag,
- dci: DCI,
- sourceSets: Set<DokkaSourceSet>,
- styles: Set<Style>,
- extras: PropertyContainer<ContentNode>
- ): List<ContentNode> {
-
- fun buildChildren(docTag: DocTag, newStyles: Set<Style> = emptySet(), newExtras: SimpleAttr? = null) =
- docTag.children.flatMap {
- buildContent(it, dci, sourceSets, styles + newStyles, newExtras?.let { extras + it } ?: extras)
- }
-
- fun buildTableRows(rows: List<DocTag>, newStyle: Style): List<ContentGroup> =
- rows.flatMap {
- @Suppress("UNCHECKED_CAST")
- buildContent(it, dci, sourceSets, styles + newStyle, extras) as List<ContentGroup>
- }
-
- fun buildHeader(level: Int) =
- listOf(
- ContentHeader(
- buildChildren(docTag),
- level,
- dci,
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
-
- fun buildList(ordered: Boolean, newStyles: Set<Style> = emptySet(), start: Int = 1) =
- listOf(
- ContentList(
- buildChildren(docTag),
- ordered,
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + newStyles,
- ((PropertyContainer.empty<ContentNode>()) + SimpleAttr("start", start.toString()))
- )
- )
-
- fun buildNewLine() = listOf(
- ContentBreakLine(
- sourceSets.toDisplaySourceSets()
- )
- )
-
- fun P.collapseParagraphs(): P =
- if (children.size == 1 && children.first() is P) (children.first() as P).collapseParagraphs() else this
-
- return when (docTag) {
- is H1 -> buildHeader(1)
- is H2 -> buildHeader(2)
- is H3 -> buildHeader(3)
- is H4 -> buildHeader(4)
- is H5 -> buildHeader(5)
- is H6 -> buildHeader(6)
- is Ul -> buildList(false)
- is Ol -> buildList(true, start = docTag.params["start"]?.toInt() ?: 1)
- is Li -> listOf(
- ContentGroup(buildChildren(docTag), dci, sourceSets.toDisplaySourceSets(), styles, extras)
- )
- is Dl -> buildList(false, newStyles = setOf(ListStyle.DescriptionList))
- is Dt -> listOf(
- ContentGroup(
- buildChildren(docTag),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + ListStyle.DescriptionTerm
- )
- )
- is Dd -> listOf(
- ContentGroup(
- buildChildren(docTag),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + ListStyle.DescriptionDetails
- )
- )
- is Br -> buildNewLine()
- is B -> buildChildren(docTag, setOf(TextStyle.Strong))
- is I -> buildChildren(docTag, setOf(TextStyle.Italic))
- is P -> listOf(
- ContentGroup(
- buildChildren(docTag.collapseParagraphs()),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + setOf(TextStyle.Paragraph),
- extras
- )
- )
- is A -> listOf(
- ContentResolvedLink(
- buildChildren(docTag),
- docTag.params.getValue("href"),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
- is DocumentationLink -> listOf(
- ContentDRILink(
- buildChildren(docTag),
- docTag.dri,
- DCI(
- setOf(docTag.dri),
- ContentKind.Main
- ),
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
- is BlockQuote -> listOf(
- ContentGroup(
- buildChildren(docTag),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + TextStyle.Quotation,
- )
- )
- is Pre, is CodeBlock -> listOf(
- ContentCodeBlock(
- buildChildren(docTag),
- docTag.params.getOrDefault("lang", ""),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
- is CodeInline -> listOf(
- ContentCodeInline(
- buildChildren(docTag),
- "",
- dci,
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
- is Img -> listOf(
- ContentEmbeddedResource(
- address = docTag.params["href"]!!,
- altText = docTag.params["alt"],
- dci = dci,
- sourceSets = sourceSets.toDisplaySourceSets(),
- style = styles,
- extra = extras
- )
- )
- is HorizontalRule -> listOf(
- ContentText(
- "",
- dci,
- sourceSets.toDisplaySourceSets(),
- setOf()
- )
- )
- is Text -> listOf(
- ContentText(
- docTag.body,
- dci,
- sourceSets.toDisplaySourceSets(),
- styles,
- extras + HtmlContent.takeIf { docTag.params["content-type"] == "html" }
- )
- )
- is Strikethrough -> buildChildren(docTag, setOf(TextStyle.Strikethrough))
- is Table -> {
- //https://html.spec.whatwg.org/multipage/tables.html#the-caption-element
- if (docTag.children.any { it is TBody }) {
- val head = docTag.children.filterIsInstance<THead>().flatMap { it.children }
- val body = docTag.children.filterIsInstance<TBody>().flatMap { it.children }
- listOf(
- ContentTable(
- header = buildTableRows(head.filterIsInstance<Th>(), CommentTable),
- caption = docTag.children.firstIsInstanceOrNull<Caption>()?.let {
- ContentGroup(
- buildContent(it, dci, sourceSets),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles,
- extras
- )
- },
- buildTableRows(body.filterIsInstance<Tr>(), CommentTable),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + CommentTable
- )
- )
- } else {
- listOf(
- ContentTable(
- header = buildTableRows(docTag.children.filterIsInstance<Th>(), CommentTable),
- caption = null,
- buildTableRows(docTag.children.filterIsInstance<Tr>(), CommentTable),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + CommentTable
- )
- )
- }
- }
- is Th,
- is Tr -> listOf(
- ContentGroup(
- docTag.children.map {
- ContentGroup(buildChildren(it), dci, sourceSets.toDisplaySourceSets(), styles, extras)
- },
- dci,
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
- is Index -> listOf(
- ContentGroup(
- buildChildren(docTag, newStyles = styles + ContentStyle.InDocumentationAnchor),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles
- )
- )
- is CustomDocTag -> if (docTag.isNonemptyFile()) {
- listOf(
- ContentGroup(
- buildChildren(docTag),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles,
- extra = extras
- )
- )
- } else {
- buildChildren(docTag)
- }
- is Caption -> listOf(
- ContentGroup(
- buildChildren(docTag),
- dci,
- sourceSets.toDisplaySourceSets(),
- styles + ContentStyle.Caption,
- extra = extras
- )
- )
- is Var -> buildChildren(docTag, setOf(TextStyle.Var))
- is U -> buildChildren(docTag, setOf(TextStyle.Underlined))
-
- else -> buildChildren(docTag)
- }
- }
-
- private fun CustomDocTag.isNonemptyFile() = name == MARKDOWN_ELEMENT_FILE_NAME && children.size > 1
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/FallbackPageMergerStrategy.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/FallbackPageMergerStrategy.kt
deleted file mode 100644
index 80886cc5..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/merger/FallbackPageMergerStrategy.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.merger
-
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.utilities.DokkaLogger
-
-public class FallbackPageMergerStrategy(
- private val logger: DokkaLogger
-) : PageMergerStrategy {
- override fun tryMerge(pages: List<PageNode>, path: List<String>): List<PageNode> {
- pages.map {
- (it as? ContentPage)
- }
- val renderedPath = path.joinToString(separator = "/")
- if (pages.size != 1) logger.warn("For $renderedPath: expected 1 page, but got ${pages.size}")
- return listOf(pages.first())
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/PageMerger.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/PageMerger.kt
deleted file mode 100644
index e52c233c..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/merger/PageMerger.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.merger
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class PageMerger(context: DokkaContext) : PageTransformer {
-
- private val strategies: Iterable<PageMergerStrategy> = context.plugin<DokkaBase>().query { pageMergerStrategy }
-
- override fun invoke(input: RootPageNode): RootPageNode =
- input.modified(children = input.children.map { it.mergeChildren(emptyList()) })
-
- private fun PageNode.mergeChildren(path: List<String>): PageNode = children.groupBy { it::class }.map {
- it.value.groupBy { it.name }.map { (n, v) -> mergePageNodes(v, path + n) }.map { it.assertSingle(path) }
- }.let { pages ->
- modified(children = pages.flatten().map { it.mergeChildren(path + it.name) })
- }
-
- private fun mergePageNodes(pages: List<PageNode>, path: List<String>): List<PageNode> =
- strategies.fold(pages) { acc, strategy -> tryMerge(strategy, acc, path) }
-
- private fun tryMerge(strategy: PageMergerStrategy, pages: List<PageNode>, path: List<String>) =
- if (pages.size > 1) strategy.tryMerge(pages, path) else pages
-}
-
-private fun <T> Iterable<T>.assertSingle(path: List<String>): T = try {
- single()
- } catch (e: Exception) {
- val renderedPath = path.joinToString(separator = "/")
- throw IllegalStateException("Page merger is misconfigured. Error for $renderedPath: ${e.message}")
- }
diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/PageMergerStrategy.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/PageMergerStrategy.kt
deleted file mode 100644
index ea1b1f03..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/merger/PageMergerStrategy.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.merger
-
-import org.jetbrains.dokka.pages.PageNode
-
-public fun interface PageMergerStrategy {
-
- public fun tryMerge(pages: List<PageNode>, path: List<String>): List<PageNode>
-
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt
deleted file mode 100644
index 864545e6..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.merger
-
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.base.transformers.documentables.isDeprecated
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.DokkaLogger
-
-/**
- * Merges [MemberPage] elements that have the same name.
- * That includes **both** properties and functions.
- */
-public class SameMethodNamePageMergerStrategy(
- public val logger: DokkaLogger
-) : PageMergerStrategy {
- override fun tryMerge(pages: List<PageNode>, path: List<String>): List<PageNode> {
- val members = pages
- .filterIsInstance<MemberPageNode>()
- .takeIf { it.isNotEmpty() }
- ?.sortedBy { it.containsDeprecatedDocumentables() } // non-deprecated first
- ?: return pages
-
- val name = pages.first().name.also {
- if (pages.any { page -> page.name != it }) { // Is this even possible?
- logger.error("Page names for $it do not match!")
- }
- }
- val dri = members.flatMap { it.dri }.toSet()
-
-
- val merged = MemberPageNode(
- dri = dri,
- name = name,
- children = members.flatMap { it.children }.distinct(),
- content = squashDivergentInstances(members).withSourceSets(members.allSourceSets()),
- embeddedResources = members.flatMap { it.embeddedResources }.distinct(),
- documentables = members.flatMap { it.documentables }
- )
-
- return (pages - members) + listOf(merged)
- }
-
- @Suppress("UNCHECKED_CAST")
- private fun MemberPageNode.containsDeprecatedDocumentables() =
- this.documentables.any { (it as? WithExtraProperties<Documentable>)?.isDeprecated() == true }
-
- private fun List<MemberPageNode>.allSourceSets(): Set<DisplaySourceSet> =
- fold(emptySet()) { acc, e -> acc + e.sourceSets() }
-
- private fun squashDivergentInstances(nodes: List<MemberPageNode>): ContentNode =
- nodes.map { it.content }
- .reduce { acc, node ->
- acc.mapTransform<ContentDivergentGroup, ContentNode> { g ->
- g.copy(children = (g.children +
- ((node.dfs { it is ContentDivergentGroup && it.groupID == g.groupID } as? ContentDivergentGroup)
- ?.children ?: emptyList())
- )
- )
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt
deleted file mode 100644
index 8d52a39d..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.merger
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.toDisplaySourceSets
-import org.jetbrains.dokka.pages.ContentComposite
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class SourceSetMergingPageTransformer(context: DokkaContext) : PageTransformer {
-
- private val mergedSourceSets = context.configuration.sourceSets.toDisplaySourceSets()
- .associateBy { sourceSet -> sourceSet.key }
-
- override fun invoke(input: RootPageNode): RootPageNode {
- return input.transformContentPagesTree { contentPage ->
- val content: ContentNode = contentPage.content
- contentPage.modified(content = transformWithMergedSourceSets(content))
- }
- }
-
- private fun transformWithMergedSourceSets(
- contentNode: ContentNode
- ): ContentNode {
- val mergedSourceSets = contentNode.sourceSets.map { mergedSourceSets.getValue(it.key) }.toSet()
- return when (contentNode) {
- is ContentComposite -> contentNode
- .transformChildren(::transformWithMergedSourceSets)
- .withSourceSets(mergedSourceSets)
- else -> contentNode.withSourceSets(mergedSourceSets.toSet())
- }
- }
-}
-
-private val DisplaySourceSet.key get() = SourceSetMergingKey(name, platform)
-
-private data class SourceSetMergingKey(private val displayName: String, private val platform: Platform)
diff --git a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt
deleted file mode 100644
index 80eeca7e..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.sourcelinks
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import java.io.File
-
-public class SourceLinksTransformer(
- public val context: DokkaContext
-) : PageTransformer {
-
- private val builder : PageContentBuilder = PageContentBuilder(
- context.plugin<DokkaBase>().querySingle { commentsToContentConverter },
- context.plugin<DokkaBase>().querySingle { signatureProvider },
- context.logger
- )
-
- override fun invoke(input: RootPageNode): RootPageNode {
- val sourceLinks = getSourceLinksFromConfiguration()
- if (sourceLinks.isEmpty()) {
- return input
- }
- return input.transformContentPagesTree { node ->
- when (node) {
- is WithDocumentables -> {
- val sources = node.documentables
- .filterIsInstance<WithSources>()
- .fold(mutableMapOf<DRI, List<Pair<DokkaSourceSet, String>>>()) { acc, documentable ->
- val dri = (documentable as Documentable).dri
- acc.compute(dri) { _, v ->
- val sources = resolveSources(sourceLinks, documentable)
- v?.plus(sources) ?: sources
- }
- acc
- }
- if (sources.isNotEmpty())
- node.modified(content = transformContent(node.content, sources))
- else
- node
- }
- else -> node
- }
- }
- }
-
- private fun getSourceLinksFromConfiguration(): List<SourceLink> {
- return context.configuration.sourceSets
- .flatMap { it.sourceLinks.map { sl -> SourceLink(sl, it) } }
- }
-
- private fun resolveSources(
- sourceLinks: List<SourceLink>, documentable: WithSources
- ): List<Pair<DokkaSourceSet, String>> {
- return documentable.sources.mapNotNull { (sourceSet, documentableSource) ->
- val sourceLink = sourceLinks.find { sourceLink ->
- File(documentableSource.path).startsWith(sourceLink.path) && sourceLink.sourceSetData == sourceSet
- } ?: return@mapNotNull null
-
- sourceSet to documentableSource.toLink(sourceLink)
- }
- }
-
- private fun DocumentableSource.toLink(sourceLink: SourceLink): String {
- val sourcePath = File(this.path).invariantSeparatorsPath
- val sourceLinkPath = File(sourceLink.path).invariantSeparatorsPath
-
- val lineNumber = this.computeLineNumber()
- return sourceLink.url +
- sourcePath.split(sourceLinkPath)[1] +
- sourceLink.lineSuffix +
- "${lineNumber ?: 1}"
- }
-
- private fun ContentNode.signatureGroupOrNull() =
- (this as? ContentGroup)?.takeIf { it.dci.kind == ContentKind.Symbol }
-
- private fun transformContent(
- contentNode: ContentNode, sources: Map<DRI, List<Pair<DokkaSourceSet, String>>>
- ): ContentNode =
- contentNode.signatureGroupOrNull()?.let { sg ->
- val sgIds = sg.sourceSets.computeSourceSetIds()
- sources[sg.dci.dri.singleOrNull()]?.let { sourceLinks ->
- sourceLinks
- .filter { it.first.sourceSetID in sgIds }
- .takeIf { it.isNotEmpty() }
- ?.let { filteredSourcesLinks ->
- sg.copy(children = sg.children + filteredSourcesLinks.map {
- buildContentLink(
- sg.dci.dri.first(),
- it.first,
- it.second
- )
- })
- }
- }
- } ?: when (contentNode) {
- is ContentComposite -> contentNode.transformChildren { transformContent(it, sources) }
- else -> contentNode
- }
-
- private fun buildContentLink(dri: DRI, sourceSet: DokkaSourceSet, link: String) = builder.contentFor(
- dri,
- setOf(sourceSet),
- ContentKind.Source,
- setOf(TextStyle.FloatingRight)
- ) {
- text("(")
- link("source", link)
- text(")")
- }
-}
-
-public data class SourceLink(
- val path: String,
- val url: String,
- val lineSuffix: String?,
- val sourceSetData: DokkaSourceSet
-) {
- public constructor(
- sourceLinkDefinition: DokkaConfiguration.SourceLinkDefinition,
- sourceSetData: DokkaSourceSet
- ) : this(
- sourceLinkDefinition.localDirectory,
- sourceLinkDefinition.remoteUrl.toExternalForm(),
- sourceLinkDefinition.remoteLineSuffix,
- sourceSetData
- )
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/tags/CustomTagContentProvider.kt b/plugins/base/src/main/kotlin/transformers/pages/tags/CustomTagContentProvider.kt
deleted file mode 100644
index fcec234f..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/tags/CustomTagContentProvider.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.tags
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder.DocumentableContentBuilder
-import org.jetbrains.dokka.model.doc.CustomTagWrapper
-import org.jetbrains.dokka.model.doc.DocTag
-
-/**
- * Provides an ability to render custom doc tags
- *
- * Custom tags can be generated during build, for instance via transformers from converting an annotation
- * (such as in [org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinTransformer])
- *
- * Also, custom tags can come from the kdoc itself, where "custom" is defined as unknown to the compiler/spec.
- * `@property` and `@throws` are not custom tags - they are defined by the spec and have special meaning
- * and separate blocks on the documentation page, it's clear how to render it. Whereas `@usesMathJax` is
- * a custom tag - it's application/plugin specific and is not handled by dokka by default.
- *
- * Using this provider, we can map custom tags (such as `@usesMathJax`) and generate content for it that
- * will be displayed on the pages.
- */
-public interface CustomTagContentProvider {
-
- /**
- * Whether this content provider supports given [CustomTagWrapper].
- *
- * Tags can be filtered out either by name or by nested [DocTag] type
- */
- public fun isApplicable(customTag: CustomTagWrapper): Boolean
-
- /**
- * Full blown content description, most likely to be on a separate page
- * dedicated to just one element (i.e one class/function), so any
- * amount of detail should be fine.
- */
- public fun DocumentableContentBuilder.contentForDescription(
- sourceSet: DokkaSourceSet,
- customTag: CustomTagWrapper
- ) {}
-
- /**
- * Brief comment section, usually displayed as a summary/preview.
- *
- * For instance, when listing all functions of a class on one page,
- * it'll be too much to display complete documentation for each function.
- * Instead, a small brief is shown for each one (i.e the first paragraph
- * or some other important information) - the user can go to the dedicated
- * page for more details if they find the brief interesting.
- *
- * Tag-wise, it would make sense to include `Since Kotlin`, since it's
- * important information for the users of stdlib. It would make little
- * sense to include `@usesMathjax` here, as this information seems
- * to be more specific and detailed than is needed for a brief.
- */
- public fun DocumentableContentBuilder.contentForBrief(
- sourceSet: DokkaSourceSet,
- customTag: CustomTagWrapper
- ) {}
-}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/tags/SinceKotlinTagContentProvider.kt b/plugins/base/src/main/kotlin/transformers/pages/tags/SinceKotlinTagContentProvider.kt
deleted file mode 100644
index 7c35f719..00000000
--- a/plugins/base/src/main/kotlin/transformers/pages/tags/SinceKotlinTagContentProvider.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.transformers.pages.tags
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.translators.documentables.KDOC_TAG_HEADER_LEVEL
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder.DocumentableContentBuilder
-import org.jetbrains.dokka.model.doc.CustomTagWrapper
-import org.jetbrains.dokka.pages.TextStyle
-
-public object SinceKotlinTagContentProvider : CustomTagContentProvider {
-
- private const val SINCE_KOTLIN_TAG_NAME = "Since Kotlin"
-
- override fun isApplicable(customTag: CustomTagWrapper): Boolean = customTag.name == SINCE_KOTLIN_TAG_NAME
-
- override fun DocumentableContentBuilder.contentForDescription(
- sourceSet: DokkaConfiguration.DokkaSourceSet,
- customTag: CustomTagWrapper
- ) {
- group(sourceSets = setOf(sourceSet), styles = emptySet()) {
- header(KDOC_TAG_HEADER_LEVEL, customTag.name)
- comment(customTag.root)
- }
- }
-
- override fun DocumentableContentBuilder.contentForBrief(
- sourceSet: DokkaConfiguration.DokkaSourceSet,
- customTag: CustomTagWrapper
- ) {
- group(sourceSets = setOf(sourceSet), styles = setOf(TextStyle.InlineComment)) {
- text(customTag.name + " ", styles = setOf(TextStyle.Bold))
- comment(customTag.root, styles = emptySet())
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt
deleted file mode 100644
index 0b2597d5..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.pages.ModulePageNode
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-public class DefaultDocumentableToPageTranslator(
- context: DokkaContext
-) : DocumentableToPageTranslator {
- private val configuration = configuration<DokkaBase, DokkaBaseConfiguration>(context)
- private val commentsToContentConverter = context.plugin<DokkaBase>().querySingle { commentsToContentConverter }
- private val signatureProvider = context.plugin<DokkaBase>().querySingle { signatureProvider }
- private val customTagContentProviders = context.plugin<DokkaBase>().query { customTagContentProvider }
- private val documentableSourceLanguageParser = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { documentableSourceLanguageParser }
- private val logger = context.logger
-
- override fun invoke(module: DModule): ModulePageNode =
- DefaultPageCreator(
- configuration,
- commentsToContentConverter,
- signatureProvider,
- logger,
- customTagContentProviders,
- documentableSourceLanguageParser
- ).pageForModule(module)
-}
diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt
deleted file mode 100644
index 5c8ac512..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.documentables.CallableExtensions
-import org.jetbrains.dokka.transformers.documentation.ClashingDriIdentifier
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder.DocumentableContentBuilder
-import org.jetbrains.dokka.base.utils.canonicalAlphabeticalOrder
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.analysis.kotlin.internal.DocumentableSourceLanguageParser
-import org.jetbrains.dokka.analysis.kotlin.internal.DocumentableLanguage
-import kotlin.reflect.KClass
-
-internal typealias GroupedTags = Map<KClass<out TagWrapper>, List<Pair<DokkaSourceSet?, TagWrapper>>>
-
-public open class DefaultPageCreator(
- configuration: DokkaBaseConfiguration?,
- commentsToContentConverter: CommentsToContentConverter,
- signatureProvider: SignatureProvider,
- public val logger: DokkaLogger,
- public val customTagContentProviders: List<CustomTagContentProvider> = emptyList(),
- public val documentableAnalyzer: DocumentableSourceLanguageParser
-) {
- protected open val contentBuilder: PageContentBuilder = PageContentBuilder(
- commentsToContentConverter, signatureProvider, logger
- )
-
- protected val mergeImplicitExpectActualDeclarations: Boolean =
- configuration?.mergeImplicitExpectActualDeclarations
- ?: DokkaBaseConfiguration.mergeImplicitExpectActualDeclarationsDefault
-
- protected val separateInheritedMembers: Boolean =
- configuration?.separateInheritedMembers ?: DokkaBaseConfiguration.separateInheritedMembersDefault
-
- public open fun pageForModule(m: DModule): ModulePageNode =
- ModulePageNode(m.name.ifEmpty { "<root>" }, contentForModule(m), listOf(m), m.packages.map(::pageForPackage))
-
- /**
- * We want to generate separated pages for no-actual typealias.
- * Actual typealias are displayed on pages for their expect class (trough [ActualTypealias] extra).
- *
- * @see ActualTypealias
- */
- private fun List<Documentable>.filterOutActualTypeAlias(): List<Documentable> {
- fun List<Documentable>.hasExpectClass(dri: DRI) = find { it is DClasslike && it.dri == dri && it.expectPresentInSet != null } != null
- return this.filterNot { it is DTypeAlias && this.hasExpectClass(it.dri) }
- }
-
- public open fun pageForPackage(p: DPackage): PackagePageNode {
- val children = if (mergeImplicitExpectActualDeclarations) {
- (p.classlikes + p.typealiases).filterOutActualTypeAlias()
- .mergeClashingDocumentable().map(::pageForClasslikes) +
- p.functions.mergeClashingDocumentable().map(::pageForFunctions) +
- p.properties.mergeClashingDocumentable().map(::pageForProperties)
- } else {
- (p.classlikes + p.typealiases).filterOutActualTypeAlias()
- .renameClashingDocumentable().map(::pageForClasslike) +
- p.functions.renameClashingDocumentable().map(::pageForFunction) +
- p.properties.mapNotNull(::pageForProperty)
- }
- return PackagePageNode(
- name = p.name,
- content = contentForPackage(p),
- dri = setOf(p.dri),
- documentables = listOf(p),
- children = children
- )
- }
-
- public open fun pageForEnumEntry(e: DEnumEntry): ClasslikePageNode = pageForEnumEntries(listOf(e))
-
- public open fun pageForClasslike(c: Documentable): ClasslikePageNode = pageForClasslikes(listOf(c))
-
- public open fun pageForEnumEntries(documentables: List<DEnumEntry>): ClasslikePageNode {
- val dri = documentables.dri.also {
- if (it.size != 1) {
- logger.error("Documentable dri should have the same one ${it.first()} inside the one page!")
- }
- }
-
- val classlikes = documentables.flatMap { it.classlikes }
- val functions = documentables.flatMap { it.filteredFunctions }
- val props = documentables.flatMap { it.filteredProperties }
-
- val childrenPages = if (mergeImplicitExpectActualDeclarations)
- functions.mergeClashingDocumentable().map(::pageForFunctions) +
- props.mergeClashingDocumentable().map(::pageForProperties)
- else
- classlikes.renameClashingDocumentable().map(::pageForClasslike) +
- functions.renameClashingDocumentable().map(::pageForFunction) +
- props.renameClashingDocumentable().mapNotNull(::pageForProperty)
-
- return ClasslikePageNode(
- documentables.first().nameAfterClash(), contentForClasslikesAndEntries(documentables), dri, documentables,
- childrenPages
- )
- }
-
- /**
- * @param documentables a list of [DClasslike] and [DTypeAlias] with the same dri in different sourceSets
- */
- public open fun pageForClasslikes(documentables: List<Documentable>): ClasslikePageNode {
- val dri = documentables.dri.also {
- if (it.size != 1) {
- logger.error("Documentable dri should have the same one ${it.first()} inside the one page!")
- }
- }
-
- val classlikes = documentables.filterIsInstance<DClasslike>()
-
- val constructors =
- if (classlikes.shouldDocumentConstructors()) {
- classlikes.flatMap { (it as? WithConstructors)?.constructors ?: emptyList() }
- } else {
- emptyList()
- }
-
- val nestedClasslikes = classlikes.flatMap { it.classlikes }
- val functions = classlikes.flatMap { it.filteredFunctions }
- val props = classlikes.flatMap { it.filteredProperties }
- val entries = classlikes.flatMap { if (it is DEnum) it.entries else emptyList() }
-
- val childrenPages = constructors.map(::pageForFunction) +
- if (mergeImplicitExpectActualDeclarations)
- nestedClasslikes.mergeClashingDocumentable().map(::pageForClasslikes) +
- functions.mergeClashingDocumentable().map(::pageForFunctions) +
- props.mergeClashingDocumentable().map(::pageForProperties) +
- entries.mergeClashingDocumentable().map(::pageForEnumEntries)
- else
- nestedClasslikes.renameClashingDocumentable().map(::pageForClasslike) +
- functions.renameClashingDocumentable().map(::pageForFunction) +
- props.renameClashingDocumentable().mapNotNull(::pageForProperty) +
- entries.renameClashingDocumentable().map(::pageForEnumEntry)
-
-
- return ClasslikePageNode(
- documentables.first().nameAfterClash(), contentForClasslikesAndEntries(documentables), dri, documentables,
- childrenPages
- )
- }
-
- private fun <T> T.toClashedName() where T : Documentable, T : WithExtraProperties<T> =
- (extra[ClashingDriIdentifier]?.value?.joinToString(", ", "[", "]") { it.displayName } ?: "") + name.orEmpty()
-
- private fun <T : Documentable> List<T>.renameClashingDocumentable(): List<T> =
- groupBy { it.dri }.values.flatMap { elements ->
- if (elements.size == 1) elements else elements.mapNotNull { element ->
- element.renameClashingDocumentable()
- }
- }
-
- @Suppress("UNCHECKED_CAST")
- private fun <T : Documentable> T.renameClashingDocumentable(): T? = when (this) {
- is DClass -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DObject -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DAnnotation -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DInterface -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DEnum -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DFunction -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DProperty -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- is DTypeAlias -> copy(extra = this.extra + DriClashAwareName(this.toClashedName()))
- else -> null
- } as? T?
-
- private fun <T : Documentable> List<T>.mergeClashingDocumentable(): List<List<T>> =
- groupBy { it.dri }.values.toList()
-
- public open fun pageForFunction(f: DFunction): MemberPageNode =
- MemberPageNode(f.nameAfterClash(), contentForFunction(f), setOf(f.dri), listOf(f))
-
- public open fun pageForFunctions(fs: List<DFunction>): MemberPageNode {
- val dri = fs.dri.also {
- if (it.size != 1) {
- logger.error("Function dri should have the same one ${it.first()} inside the one page!")
- }
- }
- return MemberPageNode(fs.first().nameAfterClash(), contentForMembers(fs), dri, fs)
- }
-
- public open fun pageForProperty(p: DProperty): MemberPageNode? =
- MemberPageNode(p.nameAfterClash(), contentForProperty(p), setOf(p.dri), listOf(p))
-
- public open fun pageForProperties(ps: List<DProperty>): MemberPageNode {
- val dri = ps.dri.also {
- if (it.size != 1) {
- logger.error("Property dri should have the same one ${it.first()} inside the one page!")
- }
- }
- return MemberPageNode(ps.first().nameAfterClash(), contentForMembers(ps), dri, ps)
- }
-
- private fun <T> T.isInherited(): Boolean where T : Documentable, T : WithExtraProperties<T> =
- sourceSets.all { sourceSet -> extra[InheritedMember]?.isInherited(sourceSet) == true }
-
- private val WithScope.filteredFunctions: List<DFunction>
- get() = functions.filterNot { it.isInherited() }
-
- private val WithScope.filteredProperties: List<DProperty>
- get() = properties.filterNot { it.isInherited() }
-
- private fun Collection<Documentable>.splitPropsAndFuns(): Pair<List<DProperty>, List<DFunction>> {
- val first = ArrayList<DProperty>()
- val second = ArrayList<DFunction>()
- for (element in this) {
- when (element) {
- is DProperty -> first.add(element)
- is DFunction -> second.add(element)
- else -> throw IllegalStateException("Expected only properties or functions")
- }
- }
- return Pair(first, second)
- }
-
- private fun <T> Collection<T>.splitInheritedExtension(dri: Set<DRI>): Pair<List<T>, List<T>> where T : org.jetbrains.dokka.model.Callable =
- partition { it.receiver?.dri !in dri }
-
- private fun <T> Collection<T>.splitInherited(): Pair<List<T>, List<T>> where T : Documentable, T : WithExtraProperties<T> =
- partition { it.isInherited() }
-
- protected open fun contentForModule(m: DModule): ContentGroup {
- return contentBuilder.contentFor(m) {
- group(kind = ContentKind.Cover) {
- cover(m.name)
- if (contentForDescription(m).isNotEmpty()) {
- sourceSetDependentHint(
- m.dri,
- m.sourceSets.toSet(),
- kind = ContentKind.SourceSetDependentHint,
- styles = setOf(TextStyle.UnderCoverText)
- ) {
- +contentForDescription(m)
- }
- }
- }
-
- block(
- name = "Packages",
- level = 2,
- kind = ContentKind.Packages,
- elements = m.packages,
- sourceSets = m.sourceSets.toSet(),
- needsAnchors = true,
- headers = listOf(
- headers("Name")
- )
- ) {
- val documentations = it.sourceSets.map { platform ->
- it.descriptions[platform]?.also { it.root }
- }
- val haveSameContent =
- documentations.all { it?.root == documentations.firstOrNull()?.root && it?.root != null }
-
- link(it.name, it.dri)
- if (it.sourceSets.size == 1 || (documentations.isNotEmpty() && haveSameContent)) {
- documentations.first()?.let { firstParagraphComment(kind = ContentKind.Comment, content = it.root) }
- }
- }
- }
- }
-
- protected open fun contentForPackage(p: DPackage): ContentGroup {
- return contentBuilder.contentFor(p) {
- group(kind = ContentKind.Cover) {
- cover("Package-level declarations")
- if (contentForDescription(p).isNotEmpty()) {
- sourceSetDependentHint(
- dri = p.dri,
- sourcesetData = p.sourceSets.toSet(),
- kind = ContentKind.SourceSetDependentHint,
- styles = setOf(TextStyle.UnderCoverText)
- ) {
- +contentForDescription(p)
- }
- }
- }
- group(styles = setOf(ContentStyle.TabbedContent), extra = mainExtra) {
- +contentForScope(p, p.dri, p.sourceSets)
- }
- }
- }
-
- protected open fun contentForScopes(
- scopes: List<WithScope>,
- sourceSets: Set<DokkaSourceSet>,
- extensions: List<Documentable> = emptyList()
- ): ContentGroup {
- val types = scopes.flatMap { it.classlikes } + scopes.filterIsInstance<DPackage>().flatMap { it.typealiases }
- return contentForScope(
- @Suppress("UNCHECKED_CAST")
- (scopes as List<Documentable>).dri,
- sourceSets,
- types,
- scopes.flatMap { it.functions },
- scopes.flatMap { it.properties },
- extensions
- )
- }
-
- protected open fun contentForScope(
- s: WithScope,
- dri: DRI,
- sourceSets: Set<DokkaSourceSet>,
- extensions: List<Documentable> = emptyList()
- ): ContentGroup {
- val types = listOf(
- s.classlikes,
- (s as? DPackage)?.typealiases ?: emptyList()
- ).flatten()
- return contentForScope(setOf(dri), sourceSets, types, s.functions, s.properties, extensions)
- }
-
- private fun contentForScope(
- dri: Set<DRI>,
- sourceSets: Set<DokkaSourceSet>,
- types: List<Documentable>,
- functions: List<DFunction>,
- properties: List<DProperty>,
- extensions: List<Documentable>
- ) = contentBuilder.contentFor(dri, sourceSets) {
- divergentBlock(
- "Types",
- types,
- ContentKind.Classlikes
- )
- val (extensionProps, extensionFuns) = extensions.splitPropsAndFuns()
- if (separateInheritedMembers) {
- val (inheritedFunctions, memberFunctions) = functions.splitInherited()
- val (inheritedProperties, memberProperties) = properties.splitInherited()
-
- val (inheritedExtensionFunctions, extensionFunctions) = extensionFuns.splitInheritedExtension(dri)
- val (inheritedExtensionProperties, extensionProperties) = extensionProps.splitInheritedExtension(dri)
- propertiesBlock(
- "Properties", memberProperties + extensionProperties
- )
- propertiesBlock(
- "Inherited properties", inheritedProperties + inheritedExtensionProperties
- )
- functionsBlock("Functions", memberFunctions + extensionFunctions)
- functionsBlock(
- "Inherited functions", inheritedFunctions + inheritedExtensionFunctions
- )
- } else {
- propertiesBlock(
- "Properties", properties + extensionProps
- )
- functionsBlock("Functions", functions + extensionFuns)
- }
- }
-
- private fun Iterable<DFunction>.sorted() =
- sortedWith(compareBy({ it.name }, { it.parameters.size }, { it.dri.toString() }))
-
- /**
- * @param documentables a list of [DClasslike] and [DEnumEntry] and [DTypeAlias] with the same dri in different sourceSets
- */
- protected open fun contentForClasslikesAndEntries(documentables: List<Documentable>): ContentGroup =
- contentBuilder.contentFor(documentables.dri, documentables.sourceSets) {
- val classlikes = documentables.filterIsInstance<DClasslike>()
-
- @Suppress("UNCHECKED_CAST")
- val extensions = (classlikes as List<WithExtraProperties<DClasslike>>).flatMap {
- it.extra[CallableExtensions]?.extensions
- ?.filterIsInstance<Documentable>().orEmpty()
- }
- .distinctBy { it.sourceSets to it.dri } // [Documentable] has expensive equals/hashCode at the moment, see #2620
-
- // Extensions are added to sourceSets since they can be placed outside the sourceSets from classlike
- // Example would be an Interface in common and extension function in jvm
- group(kind = ContentKind.Cover, sourceSets = mainSourcesetData + extensions.sourceSets) {
- cover(documentables.first().name.orEmpty())
- sourceSetDependentHint(documentables.dri, documentables.sourceSets) {
- documentables.forEach {
- +buildSignature(it)
- +contentForDescription(it)
- }
- }
- }
- val csEnum = classlikes.filterIsInstance<DEnum>()
- val csWithConstructor = classlikes.filterIsInstance<WithConstructors>()
- val scopes = documentables.filterIsInstance<WithScope>()
- val constructorsToDocumented = csWithConstructor.flatMap { it.constructors }
-
- group(
- styles = setOf(ContentStyle.TabbedContent),
- sourceSets = mainSourcesetData + extensions.sourceSets,
- extra = mainExtra
- ) {
- if (constructorsToDocumented.isNotEmpty() && documentables.shouldDocumentConstructors()) {
- +contentForConstructors(constructorsToDocumented, classlikes.dri, classlikes.sourceSets)
- }
- if (csEnum.isNotEmpty()) {
- +contentForEntries(csEnum.flatMap { it.entries }, csEnum.dri, csEnum.sourceSets)
- }
- +contentForScopes(scopes, documentables.sourceSets, extensions)
- }
- }
- protected open fun contentForConstructors(
- constructorsToDocumented: List<DFunction>,
- dri: Set<DRI>,
- sourceSets: Set<DokkaSourceSet>
- ): ContentGroup {
- return contentBuilder.contentFor(dri, sourceSets) {
- multiBlock(
- name = "Constructors",
- level = 2,
- kind = ContentKind.Constructors,
- groupedElements = constructorsToDocumented.groupBy { it.name }
- .map { (_, v) -> v.first().name to v },
- sourceSets = (constructorsToDocumented as List<Documentable>).sourceSets,
- needsAnchors = true,
- extra = PropertyContainer.empty<ContentNode>() + TabbedContentTypeExtra(
- BasicTabbedContentType.CONSTRUCTOR
- ),
- ) { key, ds ->
- link(key, ds.first().dri, kind = ContentKind.Main, styles = setOf(ContentStyle.RowTitle))
- sourceSetDependentHint(
- dri = ds.dri,
- sourceSets = ds.sourceSets,
- kind = ContentKind.SourceSetDependentHint,
- styles = emptySet(),
- extra = PropertyContainer.empty()
- ) {
- ds.forEach {
- +buildSignature(it)
- contentForBrief(it)
- }
- }
- }
- }
- }
-
- protected open fun contentForEntries(
- entries: List<DEnumEntry>,
- dri: Set<DRI>,
- sourceSets: Set<DokkaSourceSet>
- ): ContentGroup {
- return contentBuilder.contentFor(dri, sourceSets) {
- multiBlock(
- name = "Entries",
- level = 2,
- kind = ContentKind.Classlikes,
- groupedElements = entries.groupBy { it.name }.toList(),
- sourceSets = entries.sourceSets,
- needsSorting = false,
- needsAnchors = true,
- extra = mainExtra + TabbedContentTypeExtra(BasicTabbedContentType.ENTRY),
- styles = emptySet()
- ) { key, ds ->
- link(key, ds.first().dri)
- sourceSetDependentHint(
- dri = ds.dri,
- sourceSets = ds.sourceSets,
- kind = ContentKind.SourceSetDependentHint,
- extra = PropertyContainer.empty<ContentNode>()
- ) {
- ds.forEach {
- +buildSignature(it)
- contentForBrief(it)
- }
- }
- }
- }
- }
-
-
-
- protected open fun contentForDescription(
- d: Documentable
- ): List<ContentNode> {
- val sourceSets = d.sourceSets.toSet()
- val tags = d.groupedTags
-
- return contentBuilder.contentFor(d) {
- deprecatedSectionContent(d, sourceSets)
-
- descriptionSectionContent(d, sourceSets)
- customTagSectionContent(d, sourceSets, customTagContentProviders)
- unnamedTagSectionContent(d, sourceSets) { toHeaderString() }
-
- paramsSectionContent(tags)
- seeAlsoSectionContent(tags)
- throwsSectionContent(tags)
- samplesSectionContent(tags)
-
- inheritorsSectionContent(d, logger)
- }.children
- }
-
- protected open fun DocumentableContentBuilder.contentForBrief(
- documentable: Documentable
- ) {
- documentable.sourceSets.forEach { sourceSet ->
- documentable.documentation[sourceSet]?.let {
- /*
- Get description or a tag that holds documentation.
- This tag can be either property or constructor but constructor tags are handled already in analysis so we
- only need to keep an eye on property
-
- We purposefully ignore all other tags as they should not be visible in brief
- */
- it.firstMemberOfTypeOrNull<Description>() ?: it.firstMemberOfTypeOrNull<Property>()
- .takeIf { documentable is DProperty }
- }?.let {
- group(sourceSets = setOf(sourceSet), kind = ContentKind.BriefComment) {
- createBriefComment(documentable, sourceSet, it)
- }
- }
- }
- }
-
- private fun DocumentableContentBuilder.createBriefComment(
- documentable: Documentable,
- sourceSet: DokkaSourceSet,
- tag: TagWrapper
- ) {
- val language = documentableAnalyzer.getLanguage(documentable, sourceSet)
- when(language) {
- DocumentableLanguage.JAVA -> firstSentenceComment(tag.root)
- DocumentableLanguage.KOTLIN -> firstParagraphComment(tag.root)
- else -> firstParagraphComment(tag.root)
- }
- }
-
- protected open fun contentForFunction(f: DFunction): ContentGroup = contentForMember(f)
-
- protected open fun contentForProperty(p: DProperty): ContentGroup = contentForMember(p)
-
- protected open fun contentForMember(d: Documentable): ContentGroup = contentForMembers(listOf(d))
-
- protected open fun contentForMembers(doumentables: List<Documentable>): ContentGroup =
- contentBuilder.contentFor(doumentables.dri, doumentables.sourceSets) {
- group(kind = ContentKind.Cover) {
- cover(doumentables.first().name.orEmpty())
- }
- divergentGroup(ContentDivergentGroup.GroupID("member")) {
- doumentables.forEach { d ->
- instance(setOf(d.dri), d.sourceSets) {
- divergent {
- +buildSignature(d)
- }
- after {
- +contentForDescription(d)
- }
- }
- }
- }
- }
-
- private fun DocumentableContentBuilder.functionsBlock(
- name: String,
- list: Collection<DFunction>
- ) {
- divergentBlock(
- name,
- list.sorted(),
- ContentKind.Functions,
- extra = mainExtra
- )
- }
-
- private fun DocumentableContentBuilder.propertiesBlock(
- name: String,
- list: Collection<DProperty>
- ) {
- divergentBlock(
- name,
- list,
- ContentKind.Properties,
- extra = mainExtra
- )
-
- }
- private data class NameAndIsExtension(val name:String?, val isExtension: Boolean)
-
- private fun groupAndSortDivergentCollection(collection: Collection<Documentable>): List<Map.Entry<NameAndIsExtension, List<Documentable>>> {
- val groupKeyComparator: Comparator<Map.Entry<NameAndIsExtension, List<Documentable>>> =
- compareBy<Map.Entry<NameAndIsExtension, List<Documentable>>, String?>(
- nullsFirst(canonicalAlphabeticalOrder)
- ) { it.key.name }
- .thenBy { it.key.isExtension }
-
- return collection
- .groupBy {
- NameAndIsExtension(
- it.name,
- it.isExtension()
- )
- } // This groupBy should probably use LocationProvider
- // This hacks displaying actual typealias signatures along classlike ones
- .mapValues { if (it.value.any { it is DClasslike }) it.value.filter { it !is DTypeAlias } else it.value }
- .entries.sortedWith(groupKeyComparator)
- }
-
- protected open fun DocumentableContentBuilder.divergentBlock(
- name: String,
- collection: Collection<Documentable>,
- kind: ContentKind,
- extra: PropertyContainer<ContentNode> = mainExtra
- ) {
- if (collection.any()) {
- val onlyExtensions = collection.all { it.isExtension() }
- val groupExtra = when(kind) {
- ContentKind.Functions -> extra + TabbedContentTypeExtra(if (onlyExtensions) BasicTabbedContentType.EXTENSION_FUNCTION else BasicTabbedContentType.FUNCTION)
- ContentKind.Properties -> extra + TabbedContentTypeExtra(if (onlyExtensions) BasicTabbedContentType.EXTENSION_PROPERTY else BasicTabbedContentType.PROPERTY)
- ContentKind.Classlikes -> extra + TabbedContentTypeExtra(BasicTabbedContentType.TYPE)
- else -> extra
- }
-
- group(extra = groupExtra) {
- // be careful: groupExtra will be applied for children by default
- header(2, name, kind = kind, extra = extra) { }
- val isFunctions = collection.any { it is DFunction }
- table(kind, extra = extra, styles = emptySet()) {
- header {
- group { text("Name") }
- group { text("Summary") }
- }
- groupAndSortDivergentCollection(collection)
- .forEach { (elementNameAndIsExtension, elements) -> // This groupBy should probably use LocationProvider
- val elementName = elementNameAndIsExtension.name
- val isExtension = elementNameAndIsExtension.isExtension
- val rowExtra =
- if (isExtension) extra + TabbedContentTypeExtra(if(isFunctions) BasicTabbedContentType.EXTENSION_FUNCTION else BasicTabbedContentType.EXTENSION_PROPERTY) else extra
- val rowKind = if (isExtension) ContentKind.Extensions else kind
- val sortedElements = sortDivergentElementsDeterministically(elements)
- row(
- dri = sortedElements.map { it.dri }.toSet(),
- sourceSets = sortedElements.flatMap { it.sourceSets }.toSet(),
- kind = rowKind,
- styles = emptySet(),
- extra = elementName?.let { name -> rowExtra + SymbolAnchorHint(name, kind) } ?: rowExtra
- ) {
- link(
- text = elementName.orEmpty(),
- address = sortedElements.first().dri,
- kind = rowKind,
- styles = setOf(ContentStyle.RowTitle),
- sourceSets = sortedElements.sourceSets.toSet(),
- extra = extra
- )
- divergentGroup(
- ContentDivergentGroup.GroupID(name),
- sortedElements.map { it.dri }.toSet(),
- kind = rowKind,
- extra = extra
- ) {
- sortedElements.map { element ->
- instance(
- setOf(element.dri),
- element.sourceSets.toSet(),
- extra = PropertyContainer.withAll(
- SymbolAnchorHint(element.name ?: "", rowKind)
- )
- ) {
- divergent(extra = PropertyContainer.empty()) {
- group {
- +buildSignature(element)
- }
- }
- after(
- extra = PropertyContainer.empty()
- ) {
- contentForBrief(element)
- contentForCustomTagsBrief(element)
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- /**
- * Divergent elements, such as extensions for the same receiver, can have identical signatures
- * if they are declared in different places. If such elements are shown on the same page together,
- * they need to be rendered deterministically to have reproducible builds.
- *
- * For example, you can have three identical extensions, if they are declared as:
- * 1) top-level in package A
- * 2) top-level in package B
- * 3) inside a companion object in package A/B
- *
- * @see divergentBlock
- *
- * @param elements can contain types (annotation/class/interface/object/typealias), functions and properties
- * @return the original list if it has one or zero elements
- */
- private fun sortDivergentElementsDeterministically(elements: List<Documentable>): List<Documentable> =
- elements.takeIf { it.size > 1 } // the majority are single-element lists, but no real benchmarks done
- ?.sortedWith(divergentDocumentableComparator)
- ?: elements
-
- private fun DocumentableContentBuilder.contentForCustomTagsBrief(documentable: Documentable) {
- val customTags = documentable.customTags
- if (customTags.isEmpty()) return
-
- documentable.sourceSets.forEach { sourceSet ->
- customTags.forEach { (_, sourceSetTag) ->
- sourceSetTag[sourceSet]?.let { tag ->
- customTagContentProviders.filter { it.isApplicable(tag) }.forEach { provider ->
- with(provider) {
- contentForBrief(sourceSet, tag)
- }
- }
- }
- }
- }
- }
-
- protected open fun TagWrapper.toHeaderString(): String = this.javaClass.toGenericString().split('.').last()
-}
-
-internal val List<Documentable>.sourceSets: Set<DokkaSourceSet>
- get() = flatMap { it.sourceSets }.toSet()
-
-internal val List<Documentable>.dri: Set<DRI>
- get() = map { it.dri }.toSet()
-
-internal val Documentable.groupedTags: GroupedTags
- get() = documentation.flatMap { (pd, doc) ->
- doc.children.map { pd to it }.toList()
- }.groupBy { it.second::class }
-
-internal val Documentable.descriptions: SourceSetDependent<Description>
- get() = groupedTags.withTypeUnnamed()
-
-internal val Documentable.customTags: Map<String, SourceSetDependent<CustomTagWrapper>>
- get() = groupedTags.withTypeNamed()
-
-/**
- * @see DefaultPageCreator.sortDivergentElementsDeterministically for usage
- */
-private val divergentDocumentableComparator =
- compareBy<Documentable, String?>(nullsLast()) { it.dri.packageName }
- .thenBy(nullsFirst()) { it.dri.classNames } // nullsFirst for top level to be first
- .thenBy(
- nullsLast(
- compareBy<Callable> { it.params.size }
- .thenBy { it.signature() }
- )
- ) { it.dri.callable }
-
-@Suppress("UNCHECKED_CAST")
-private fun <T : Documentable> T.nameAfterClash(): String =
- ((this as? WithExtraProperties<Documentable>)?.extra?.get(DriClashAwareName)?.value ?: name).orEmpty()
-
-@Suppress("UNCHECKED_CAST")
-internal inline fun <reified T : TagWrapper> GroupedTags.withTypeUnnamed(): SourceSetDependent<T> =
- (this[T::class] as List<Pair<DokkaSourceSet, T>>?)?.toMap().orEmpty()
-
-@Suppress("UNCHECKED_CAST")
-internal inline fun <reified T : NamedTagWrapper> GroupedTags.withTypeNamed(): Map<String, SourceSetDependent<T>> =
- (this[T::class] as List<Pair<DokkaSourceSet, T>>?)
- ?.groupByTo(linkedMapOf()) { it.second.name }
- ?.mapValues { (_, v) -> v.toMap() }
- .orEmpty()
-
-// Annotations might have constructors to substitute reflection invocations
-// and for internal/compiler purposes, but they are not expected to be documented
-// and instantiated directly under normal circumstances, so constructors should not be rendered.
-internal fun List<Documentable>.shouldDocumentConstructors() = !this.any { it is DAnnotation }
diff --git a/plugins/base/src/main/kotlin/translators/documentables/DeprecationSectionCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DeprecationSectionCreator.kt
deleted file mode 100644
index 0f51578f..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/DeprecationSectionCreator.kt
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.annotations
-import org.jetbrains.dokka.base.transformers.documentables.isDeprecated
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder.DocumentableContentBuilder
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.ContentStyle
-import org.jetbrains.dokka.pages.TextStyle
-
-/**
- * Main header for [Deprecated] section
- */
-private const val DEPRECATED_HEADER_LEVEL = 3
-
-/**
- * Header for a direct parameter of [Deprecated] annotation,
- * such as [Deprecated.message] and [Deprecated.replaceWith]
- */
-private const val DIRECT_PARAM_HEADER_LEVEL = 4
-
-internal fun PageContentBuilder.DocumentableContentBuilder.deprecatedSectionContent(
- documentable: Documentable,
- platforms: Set<DokkaConfiguration.DokkaSourceSet>
-) {
- val allAnnotations = documentable.annotations()
- if (allAnnotations.isEmpty()) {
- return
- }
-
- platforms.forEach { platform ->
- val platformAnnotations = allAnnotations[platform] ?: emptyList()
- val deprecatedPlatformAnnotations = platformAnnotations.filter { it.isDeprecated() }
-
- if (deprecatedPlatformAnnotations.isNotEmpty()) {
- group(kind = ContentKind.Deprecation, sourceSets = setOf(platform), styles = emptySet()) {
- val kotlinAnnotation = deprecatedPlatformAnnotations.find { it.dri.packageName == "kotlin" }
- val javaAnnotation = deprecatedPlatformAnnotations.find { it.dri.packageName == "java.lang" }
-
- // If both annotations are present, priority is given to Kotlin's annotation since it
- // contains more useful information, and Java's annotation is probably there
- // for interop with Java callers, so it should be OK to ignore it
- if (kotlinAnnotation != null) {
- createKotlinDeprecatedSectionContent(kotlinAnnotation, platformAnnotations)
- } else if (javaAnnotation != null) {
- createJavaDeprecatedSectionContent(javaAnnotation)
- }
- }
- }
- }
-}
-
-/**
- * @see [DeprecatedSinceKotlin]
- */
-private fun findDeprecatedSinceKotlinAnnotation(annotations: List<Annotations.Annotation>): Annotations.Annotation? {
- return annotations.firstOrNull {
- it.dri.packageName == "kotlin" && it.dri.classNames == "DeprecatedSinceKotlin"
- }
-}
-
-/**
- * Section with details for Kotlin's [kotlin.Deprecated] annotation
- */
-private fun DocumentableContentBuilder.createKotlinDeprecatedSectionContent(
- deprecatedAnnotation: Annotations.Annotation,
- allAnnotations: List<Annotations.Annotation>
-) {
- val deprecatedSinceKotlinAnnotation = findDeprecatedSinceKotlinAnnotation(allAnnotations)
- header(
- level = DEPRECATED_HEADER_LEVEL,
- text = createKotlinDeprecatedHeaderText(deprecatedAnnotation, deprecatedSinceKotlinAnnotation)
- )
-
- deprecatedSinceKotlinAnnotation?.let {
- createDeprecatedSinceKotlinFootnoteContent(it)
- }
-
- deprecatedAnnotation.takeStringParam("message")?.let {
- group(styles = setOf(TextStyle.Paragraph)) {
- text(it)
- }
- }
-
- createReplaceWithSectionContent(deprecatedAnnotation)
-}
-
-private fun createKotlinDeprecatedHeaderText(
- kotlinDeprecatedAnnotation: Annotations.Annotation,
- deprecatedSinceKotlinAnnotation: Annotations.Annotation?
-): String {
- if (deprecatedSinceKotlinAnnotation != null) {
- // In this case there's no single level, it's dynamic based on api version,
- // so there should be a footnote with levels and their respective versions
- return "Deprecated"
- }
-
- val deprecationLevel = kotlinDeprecatedAnnotation.params["level"]?.let { (it as? EnumValue)?.enumName }
- return when (deprecationLevel) {
- "DeprecationLevel.ERROR" -> "Deprecated (with error)"
- "DeprecationLevel.HIDDEN" -> "Deprecated (hidden)"
- else -> "Deprecated"
- }
-}
-
-/**
- * Footnote for [DeprecatedSinceKotlin] annotation used in stdlib
- *
- * Notice that values are empty by default, so it's not guaranteed that all three will be set
- */
-private fun DocumentableContentBuilder.createDeprecatedSinceKotlinFootnoteContent(
- deprecatedSinceKotlinAnnotation: Annotations.Annotation
-) {
- group(styles = setOf(ContentStyle.Footnote)) {
- deprecatedSinceKotlinAnnotation.takeStringParam("warningSince")?.let {
- group(styles = setOf(TextStyle.Paragraph)) {
- text("Warning since $it")
- }
- }
- deprecatedSinceKotlinAnnotation.takeStringParam("errorSince")?.let {
- group(styles = setOf(TextStyle.Paragraph)) {
- text("Error since $it")
- }
- }
- deprecatedSinceKotlinAnnotation.takeStringParam("hiddenSince")?.let {
- group(styles = setOf(TextStyle.Paragraph)) {
- text("Hidden since $it")
- }
- }
- }
-}
-
-/**
- * Section for [ReplaceWith] parameter of [kotlin.Deprecated] annotation
- */
-private fun DocumentableContentBuilder.createReplaceWithSectionContent(kotlinDeprecatedAnnotation: Annotations.Annotation) {
- val replaceWithAnnotation = (kotlinDeprecatedAnnotation.params["replaceWith"] as? AnnotationValue)?.annotation
- ?: return
-
- header(
- level = DIRECT_PARAM_HEADER_LEVEL,
- text = "Replace with"
- )
-
- // Signature: vararg val imports: String
- val imports = (replaceWithAnnotation.params["imports"] as? ArrayValue)
- ?.value
- ?.mapNotNull { (it as? StringValue)?.value }
- ?: emptyList()
-
- if (imports.isNotEmpty()) {
- codeBlock(language = "kotlin", styles = setOf(TextStyle.Monospace)) {
- imports.forEach {
- text("import $it")
- breakLine()
- }
- }
- }
-
- replaceWithAnnotation.takeStringParam("expression")?.removeSurrounding("`")?.let {
- codeBlock(language = "kotlin", styles = setOf(TextStyle.Monospace)) {
- text(it)
- }
- }
-}
-
-/**
- * Section with details for Java's [java.lang.Deprecated] annotation
- */
-private fun DocumentableContentBuilder.createJavaDeprecatedSectionContent(
- deprecatedAnnotation: Annotations.Annotation,
-) {
- val isForRemoval = deprecatedAnnotation.takeBooleanParam("forRemoval", default = false)
- header(
- level = DEPRECATED_HEADER_LEVEL,
- text = if (isForRemoval) "Deprecated (for removal)" else "Deprecated"
- )
- deprecatedAnnotation.takeStringParam("since")?.let {
- group(styles = setOf(ContentStyle.Footnote)) {
- text("Since version $it")
- }
- }
-}
-
-private fun Annotations.Annotation.takeBooleanParam(name: String, default: Boolean): Boolean =
- (this.params[name] as? BooleanValue)?.value ?: default
-
-private fun Annotations.Annotation.takeStringParam(name: String): String? =
- (this.params[name] as? StringValue)?.takeIf { it.value.isNotEmpty() }?.value
diff --git a/plugins/base/src/main/kotlin/translators/documentables/DescriptionSections.kt b/plugins/base/src/main/kotlin/translators/documentables/DescriptionSections.kt
deleted file mode 100644
index e2489260..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/DescriptionSections.kt
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.transformers.documentables.InheritorsInfo
-import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.SourceSetDependent
-import org.jetbrains.dokka.model.WithScope
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.orEmpty
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.ContentStyle
-import org.jetbrains.dokka.pages.TextStyle
-import org.jetbrains.dokka.utilities.DokkaLogger
-import kotlin.reflect.KClass
-import kotlin.reflect.full.isSubclassOf
-
-internal const val KDOC_TAG_HEADER_LEVEL = 4
-
-private val unnamedTagsExceptions: Set<KClass<out TagWrapper>> =
- setOf(Property::class, Description::class, Constructor::class, Param::class, See::class)
-
-internal fun PageContentBuilder.DocumentableContentBuilder.descriptionSectionContent(
- documentable: Documentable,
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet>,
-) {
- val descriptions = documentable.descriptions
- if (descriptions.any { it.value.root.children.isNotEmpty() }) {
- sourceSets.forEach { sourceSet ->
- descriptions[sourceSet]?.also {
- group(sourceSets = setOf(sourceSet), styles = emptySet()) {
- comment(it.root)
- }
- }
- }
- }
-}
-
-/**
- * Custom tags are tags which are not part of the [KDoc specification](https://kotlinlang.org/docs/kotlin-doc.html). For instance, a user-defined tag
- * which is specific to the user's code base would be considered a custom tag.
- *
- * For details, see [CustomTagContentProvider]
- */
-internal fun PageContentBuilder.DocumentableContentBuilder.customTagSectionContent(
- documentable: Documentable,
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet>,
- customTagContentProviders: List<CustomTagContentProvider>,
-) {
- val customTags = documentable.customTags
- if (customTags.isEmpty()) return
-
- sourceSets.forEach { sourceSet ->
- customTags.forEach { (_, sourceSetTag) ->
- sourceSetTag[sourceSet]?.let { tag ->
- customTagContentProviders.filter { it.isApplicable(tag) }.forEach { provider ->
- group(sourceSets = setOf(sourceSet), styles = setOf(ContentStyle.KDocTag)) {
- with(provider) {
- contentForDescription(sourceSet, tag)
- }
- }
- }
- }
- }
- }
-}
-
-/**
- * Tags in KDoc are used in form of "@tag name value".
- * This function handles tags that have only value parameter without name.
- * List of such tags: `@return`, `@author`, `@since`, `@receiver`
- */
-internal fun PageContentBuilder.DocumentableContentBuilder.unnamedTagSectionContent(
- documentable: Documentable,
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet>,
- toHeaderString: TagWrapper.() -> String,
-) {
- val unnamedTags = documentable.groupedTags
- .filterNot { (k, _) -> k.isSubclassOf(NamedTagWrapper::class) || k in unnamedTagsExceptions }
- .values.flatten().groupBy { it.first }
- .mapValues { it.value.map { it.second } }
- .takeIf { it.isNotEmpty() } ?: return
-
- sourceSets.forEach { sourceSet ->
- unnamedTags[sourceSet]?.let { tags ->
- if (tags.isNotEmpty()) {
- tags.groupBy { it::class }.forEach { (_, sameCategoryTags) ->
- group(sourceSets = setOf(sourceSet), styles = setOf(ContentStyle.KDocTag)) {
- header(
- level = KDOC_TAG_HEADER_LEVEL,
- text = sameCategoryTags.first().toHeaderString(),
- styles = setOf()
- )
- sameCategoryTags.forEach { comment(it.root, styles = setOf()) }
- }
- }
- }
- }
- }
-}
-
-
-internal fun PageContentBuilder.DocumentableContentBuilder.paramsSectionContent(tags: GroupedTags) {
- val params = tags.withTypeNamed<Param>()
- if (params.isEmpty()) return
-
- val availableSourceSets = params.availableSourceSets()
- tableSectionContentBlock(
- blockName = "Parameters",
- kind = ContentKind.Parameters,
- sourceSets = availableSourceSets
- ) {
- availableSourceSets.forEach { sourceSet ->
- val possibleFallbacks = availableSourceSets.getPossibleFallback(sourceSet)
- params.mapNotNull { (_, param) ->
- (param[sourceSet] ?: param.fallback(possibleFallbacks))?.let {
- row(sourceSets = setOf(sourceSet), kind = ContentKind.Parameters) {
- text(
- it.name,
- kind = ContentKind.Parameters,
- styles = mainStyles + setOf(ContentStyle.RowTitle, TextStyle.Underlined)
- )
- if (it.isNotEmpty()) {
- comment(it.root)
- }
- }
- }
- }
- }
- }
-}
-
-internal fun PageContentBuilder.DocumentableContentBuilder.seeAlsoSectionContent(tags: GroupedTags) {
- val seeAlsoTags = tags.withTypeNamed<See>()
- if (seeAlsoTags.isEmpty()) return
-
- val availableSourceSets = seeAlsoTags.availableSourceSets()
- tableSectionContentBlock(
- blockName = "See also",
- kind = ContentKind.Comment,
- sourceSets = availableSourceSets
- ) {
- availableSourceSets.forEach { sourceSet ->
- val possibleFallbacks = availableSourceSets.getPossibleFallback(sourceSet)
- seeAlsoTags.forEach { (_, see) ->
- (see[sourceSet] ?: see.fallback(possibleFallbacks))?.let { seeTag ->
- row(
- sourceSets = setOf(sourceSet),
- kind = ContentKind.Comment
- ) {
- seeTag.address?.let { dri ->
- link(
- text = seeTag.name.removePrefix("${dri.packageName}."),
- address = dri,
- kind = ContentKind.Comment,
- styles = mainStyles + ContentStyle.RowTitle
- )
- } ?: text(
- text = seeTag.name,
- kind = ContentKind.Comment,
- styles = mainStyles + ContentStyle.RowTitle
- )
- if (seeTag.isNotEmpty()) {
- comment(seeTag.root)
- }
- }
- }
- }
- }
- }
-}
-
-/**
- * Used for multi-value tags (e.g. params) when values are missed on some platforms.
- * It this case description is inherited from parent platform.
- * E.g. if param hasn't description in JVM, the description is taken from common.
- */
-private fun Set<DokkaConfiguration.DokkaSourceSet>.getPossibleFallback(sourceSet: DokkaConfiguration.DokkaSourceSet) =
- this.filter { it.sourceSetID in sourceSet.dependentSourceSets }
-
-private fun <V> Map<DokkaConfiguration.DokkaSourceSet, V>.fallback(sourceSets: List<DokkaConfiguration.DokkaSourceSet>): V? =
- sourceSets.firstOrNull { it in this.keys }.let { this[it] }
-
-internal fun PageContentBuilder.DocumentableContentBuilder.throwsSectionContent(tags: GroupedTags) {
- val throwsTags = tags.withTypeNamed<Throws>()
- if (throwsTags.isEmpty()) return
-
- val availableSourceSets = throwsTags.availableSourceSets()
- tableSectionContentBlock(
- blockName = "Throws",
- kind = ContentKind.Main,
- sourceSets = availableSourceSets
- ) {
- throwsTags.forEach { (throwsName, throwsPerSourceSet) ->
- throwsPerSourceSet.forEach { (sourceSet, throws) ->
- row(sourceSets = setOf(sourceSet)) {
- group(styles = mainStyles + ContentStyle.RowTitle) {
- throws.exceptionAddress?.let {
- val className = it.takeIf { it.target is PointingToDeclaration }?.classNames
- link(text = className ?: throwsName, address = it)
- } ?: text(throwsName)
- }
- if (throws.isNotEmpty()) {
- comment(throws.root)
- }
- }
- }
- }
- }
-}
-
-private fun TagWrapper.isNotEmpty() = this.children.isNotEmpty()
-
-internal fun PageContentBuilder.DocumentableContentBuilder.samplesSectionContent(tags: GroupedTags) {
- val samples = tags.withTypeNamed<Sample>()
- if (samples.isEmpty()) return
-
- val availableSourceSets = samples.availableSourceSets()
-
- header(KDOC_TAG_HEADER_LEVEL, "Samples", kind = ContentKind.Sample, sourceSets = availableSourceSets)
- availableSourceSets.forEach { sourceSet ->
- group(
- sourceSets = setOf(sourceSet),
- kind = ContentKind.Sample,
- styles = setOf(TextStyle.Monospace, ContentStyle.RunnableSample),
- ) {
- samples.filter { it.value.isEmpty() || sourceSet in it.value }
- .forEach { text(text = it.key, sourceSets = setOf(sourceSet)) }
- }
- }
-}
-
-internal fun PageContentBuilder.DocumentableContentBuilder.inheritorsSectionContent(
- documentable: Documentable,
- logger: DokkaLogger,
-) {
- val inheritors = if (documentable is WithScope) documentable.inheritors() else return
- if (inheritors.values.none()) return
-
- // split content section for the case:
- // parent is in the shared source set (without expect-actual) and inheritor is in the platform code
- if (documentable.isDefinedInSharedSourceSetOnly(inheritors.keys.toSet()))
- sharedSourceSetOnlyInheritorsSectionContent(inheritors, logger)
- else
- multiplatformInheritorsSectionContent(documentable, inheritors, logger)
-}
-
-private fun WithScope.inheritors(): SourceSetDependent<List<DRI>> {
- @Suppress("UNCHECKED_CAST")
- val withExtra = this as? WithExtraProperties<Documentable>
-
- return withExtra
- ?.let { it.extra[InheritorsInfo] }
- ?.let { inheritors -> inheritors.value.filter { it.value.isNotEmpty() } }
- .orEmpty()
-}
-
-/**
- * Detect that documentable is located only in the shared code without expect-actuals
- * Value of `analysisPlatform` will be [Platform.common] in cases if a source set shared between 2 different platforms.
- * But if it shared between 2 same platforms (e.g. jvm("awt") and jvm("android"))
- * then the source set will be still marked as jvm platform.
- *
- * So, we also try to check if any of inheritors source sets depends on current documentable source set.
- * that will mean that the source set is shared.
- */
-private fun Documentable.isDefinedInSharedSourceSetOnly(inheritorsSourceSets: Set<DokkaConfiguration.DokkaSourceSet>) =
- sourceSets.size == 1 &&
- (sourceSets.first().analysisPlatform == Platform.common
- || sourceSets.first().hasDependentSourceSet(inheritorsSourceSets))
-
-private fun DokkaConfiguration.DokkaSourceSet.hasDependentSourceSet(
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet>,
-) =
- sourceSets.any { sourceSet -> sourceSet.dependentSourceSets.any { it == this.sourceSetID } }
-
-private fun PageContentBuilder.DocumentableContentBuilder.multiplatformInheritorsSectionContent(
- documentable: Documentable,
- inheritors: Map<DokkaConfiguration.DokkaSourceSet, List<DRI>>,
- logger: DokkaLogger,
-) {
- // intersect is used for removing duplication in case of merged classlikes from different platforms
- val availableSourceSets = inheritors.keys.toSet().intersect(documentable.sourceSets)
-
- tableSectionContentBlock(
- blockName = "Inheritors",
- kind = ContentKind.Inheritors,
- sourceSets = availableSourceSets
- ) {
- availableSourceSets.forEach { sourceSet ->
- inheritors[sourceSet]?.forEach { classlike: DRI ->
- inheritorRow(classlike, logger, sourceSet)
- }
- }
- }
-}
-
-private fun PageContentBuilder.DocumentableContentBuilder.sharedSourceSetOnlyInheritorsSectionContent(
- inheritors: Map<DokkaConfiguration.DokkaSourceSet, List<DRI>>,
- logger: DokkaLogger,
-) {
- val uniqueInheritors = inheritors.values.flatten().toSet()
- tableSectionContentBlock(
- blockName = "Inheritors",
- kind = ContentKind.Inheritors,
- ) {
- uniqueInheritors.forEach { classlike ->
- inheritorRow(classlike, logger)
- }
- }
-}
-
-private fun PageContentBuilder.TableBuilder.inheritorRow(
- classlike: DRI, logger: DokkaLogger, sourceSet: DokkaConfiguration.DokkaSourceSet? = null,
-) = row {
- link(
- text = classlike.friendlyClassName()
- ?: classlike.toString().also { logger.warn("No class name found for DRI $classlike") },
- address = classlike,
- sourceSets = sourceSet?.let { setOf(it) } ?: mainSourcesetData
- )
-}
-
-private fun PageContentBuilder.DocumentableContentBuilder.tableSectionContentBlock(
- blockName: String,
- kind: ContentKind,
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet> = mainSourcesetData,
- body: PageContentBuilder.TableBuilder.() -> Unit,
-) {
- header(KDOC_TAG_HEADER_LEVEL, text = blockName, kind = kind, sourceSets = sourceSets)
- table(
- kind = kind,
- sourceSets = sourceSets,
- ) {
- body()
- }
-}
-
-private fun DRI.friendlyClassName() = classNames?.substringAfterLast(".")
-
-private fun <T> Map<String, SourceSetDependent<T>>.availableSourceSets() = values.flatMap { it.keys }.toSet()
diff --git a/plugins/base/src/main/kotlin/translators/documentables/DriClashAwareName.kt b/plugins/base/src/main/kotlin/translators/documentables/DriClashAwareName.kt
deleted file mode 100644
index 362bb9b9..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/DriClashAwareName.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.ExtraProperty
-
-public data class DriClashAwareName(val value: String?): ExtraProperty<Documentable> {
- public companion object : ExtraProperty.Key<Documentable, DriClashAwareName>
- override val key: ExtraProperty.Key<Documentable, *> = Companion
-}
diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
deleted file mode 100644
index 4ddda674..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
+++ /dev/null
@@ -1,781 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.SourceSetDependent
-import org.jetbrains.dokka.model.doc.DocTag
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.model.properties.plus
-import org.jetbrains.dokka.model.toDisplaySourceSets
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.DokkaLogger
-
-@DslMarker
-public annotation class ContentBuilderMarker
-
-public open class PageContentBuilder(
- public val commentsConverter: CommentsToContentConverter,
- public val signatureProvider: SignatureProvider,
- public val logger: DokkaLogger
-) {
- public fun contentFor(
- dri: DRI,
- sourceSets: Set<DokkaSourceSet>,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = emptySet(),
- extra: PropertyContainer<ContentNode> = PropertyContainer.empty(),
- block: DocumentableContentBuilder.() -> Unit
- ): ContentGroup =
- DocumentableContentBuilder(setOf(dri), sourceSets, styles, extra)
- .apply(block)
- .build(sourceSets, kind, styles, extra)
-
- public fun contentFor(
- dri: Set<DRI>,
- sourceSets: Set<DokkaSourceSet>,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = emptySet(),
- extra: PropertyContainer<ContentNode> = PropertyContainer.empty(),
- block: DocumentableContentBuilder.() -> Unit
- ): ContentGroup =
- DocumentableContentBuilder(dri, sourceSets, styles, extra)
- .apply(block)
- .build(sourceSets, kind, styles, extra)
-
- public fun contentFor(
- d: Documentable,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = emptySet(),
- extra: PropertyContainer<ContentNode> = PropertyContainer.empty(),
- sourceSets: Set<DokkaSourceSet> = d.sourceSets.toSet(),
- block: DocumentableContentBuilder.() -> Unit = {}
- ): ContentGroup =
- DocumentableContentBuilder(setOf(d.dri), sourceSets, styles, extra)
- .apply(block)
- .build(sourceSets, kind, styles, extra)
-
- @ContentBuilderMarker
- public open inner class DocumentableContentBuilder(
- public val mainDRI: Set<DRI>,
- public val mainSourcesetData: Set<DokkaSourceSet>,
- public val mainStyles: Set<Style>,
- public val mainExtra: PropertyContainer<ContentNode>
- ) {
- protected val contents: MutableList<ContentNode> = mutableListOf<ContentNode>()
-
- public fun build(
- sourceSets: Set<DokkaSourceSet>,
- kind: Kind,
- styles: Set<Style>,
- extra: PropertyContainer<ContentNode>
- ): ContentGroup {
- return ContentGroup(
- children = contents.toList(),
- dci = DCI(mainDRI, kind),
- sourceSets = sourceSets.toDisplaySourceSets(),
- style = styles,
- extra = extra
- )
- }
-
- public operator fun ContentNode.unaryPlus() {
- contents += this
- }
-
- public operator fun Collection<ContentNode>.unaryPlus() {
- contents += this
- }
-
- public fun header(
- level: Int,
- text: String,
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit = {}
- ) {
- contents += ContentHeader(
- level,
- contentFor(
- mainDRI,
- sourceSets,
- kind,
- styles,
- extra + SymbolAnchorHint(text.replace("\\s".toRegex(), "").toLowerCase(), kind)
- ) {
- text(text, kind = kind)
- block()
- }
- )
- }
-
- public fun cover(
- text: String,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles + TextStyle.Cover,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit = {}
- ) {
- header(1, text, sourceSets = sourceSets, styles = styles, extra = extra, block = block)
- }
-
- public fun constant(text: String) {
- text(text, styles = mainStyles + TokenStyle.Constant)
- }
-
- public fun keyword(text: String) {
- text(text, styles = mainStyles + TokenStyle.Keyword)
- }
-
- public fun stringLiteral(text: String) {
- text(text, styles = mainStyles + TokenStyle.String)
- }
-
- public fun booleanLiteral(value: Boolean) {
- text(value.toString(), styles = mainStyles + TokenStyle.Boolean)
- }
-
- public fun punctuation(text: String) {
- text(text, styles = mainStyles + TokenStyle.Punctuation)
- }
-
- public fun operator(text: String) {
- text(text, styles = mainStyles + TokenStyle.Operator)
- }
-
- public fun text(
- text: String,
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ) {
- contents += createText(text, kind, sourceSets, styles, extra)
- }
-
- public fun breakLine(sourceSets: Set<DokkaSourceSet> = mainSourcesetData) {
- contents += ContentBreakLine(sourceSets.toDisplaySourceSets())
- }
-
- public fun buildSignature(d: Documentable): List<ContentNode> = signatureProvider.signature(d)
-
- public fun table(
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- operation: TableBuilder.() -> Unit = {}
- ) {
- contents += TableBuilder(mainDRI, sourceSets, kind, styles, extra).apply {
- operation()
- }.build()
- }
-
- public fun unorderedList(
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- operation: ListBuilder.() -> Unit = {}
- ) {
- contents += ListBuilder(false, mainDRI, sourceSets, kind, styles, extra).apply(operation).build()
- }
-
- public fun orderedList(
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- operation: ListBuilder.() -> Unit = {}
- ) {
- contents += ListBuilder(true, mainDRI, sourceSets, kind, styles, extra).apply(operation).build()
- }
-
- public fun descriptionList(
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- operation: ListBuilder.() -> Unit = {}
- ) {
- contents += ListBuilder(false, mainDRI, sourceSets, kind, styles + ListStyle.DescriptionList, extra)
- .apply(operation)
- .build()
- }
-
- internal fun headers(vararg label: String) = contentFor(mainDRI, mainSourcesetData) {
- label.forEach { text(it) }
- }
-
- public fun <T : Documentable> block(
- name: String,
- level: Int,
- kind: Kind = ContentKind.Main,
- elements: Iterable<T>,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- renderWhenEmpty: Boolean = false,
- needsSorting: Boolean = true,
- headers: List<ContentGroup> = emptyList(),
- needsAnchors: Boolean = false,
- operation: DocumentableContentBuilder.(T) -> Unit
- ) {
- if (renderWhenEmpty || elements.any()) {
- header(level, name, kind = kind) { }
- contents += ContentTable(
- header = headers,
- children = elements
- .let {
- if (needsSorting)
- it.sortedWith(compareBy(nullsLast(String.CASE_INSENSITIVE_ORDER)) { it.name })
- else it
- }
- .map {
- val newExtra = if (needsAnchors) extra + SymbolAnchorHint.from(it, kind) else extra
- buildGroup(setOf(it.dri), it.sourceSets.toSet(), kind, styles, newExtra) {
- operation(it)
- }
- },
- dci = DCI(mainDRI, kind),
- sourceSets = sourceSets.toDisplaySourceSets(),
- style = styles,
- extra = extra
- )
- }
- }
-
- public fun <T : Pair<String, List<Documentable>>> multiBlock(
- name: String,
- level: Int,
- kind: Kind = ContentKind.Main,
- groupedElements: Iterable<T>,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- renderWhenEmpty: Boolean = false,
- needsSorting: Boolean = true,
- headers: List<ContentGroup> = emptyList(),
- needsAnchors: Boolean = false,
- operation: DocumentableContentBuilder.(String, List<Documentable>) -> Unit
- ) {
-
- if (renderWhenEmpty || groupedElements.any()) {
- group(extra = extra) {
- header(level, name, kind = kind) { }
- contents += ContentTable(
- header = headers,
- children = groupedElements
- .let {
- if (needsSorting)
- it.sortedWith(compareBy(nullsLast(String.CASE_INSENSITIVE_ORDER)) { it.first })
- else it
- }
- .map {
- val documentables = it.second
- val newExtra = if (needsAnchors) extra + SymbolAnchorHint(
- it.first,
- kind
- ) else extra
- buildGroup(
- documentables.map { it.dri }.toSet(),
- documentables.flatMap { it.sourceSets }.toSet(),
- kind,
- styles,
- newExtra
- ) {
- operation(it.first, documentables)
- }
- },
- dci = DCI(mainDRI, kind),
- sourceSets = sourceSets.toDisplaySourceSets(),
- style = styles,
- extra = extra
- )
- }
- }
- }
-
- public fun <T> list(
- elements: List<T>,
- prefix: String = "",
- suffix: String = "",
- separator: String = ", ",
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData, // TODO: children should be aware of this platform data
- surroundingCharactersStyle: Set<Style> = mainStyles,
- separatorStyles: Set<Style> = mainStyles,
- operation: DocumentableContentBuilder.(T) -> Unit
- ) {
- if (elements.isNotEmpty()) {
- if (prefix.isNotEmpty()) text(prefix, sourceSets = sourceSets, styles = surroundingCharactersStyle)
- elements.dropLast(1).forEach {
- operation(it)
- text(separator, sourceSets = sourceSets, styles = separatorStyles)
- }
- operation(elements.last())
- if (suffix.isNotEmpty()) text(suffix, sourceSets = sourceSets, styles = surroundingCharactersStyle)
- }
- }
-
- public fun link(
- text: String,
- address: DRI,
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ) {
- contents += linkNode(text, address, DCI(mainDRI, kind), sourceSets, styles, extra)
- }
-
- public fun linkNode(
- text: String,
- address: DRI,
- dci: DCI = DCI(mainDRI, ContentKind.Main),
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ): ContentLink {
- return ContentDRILink(
- listOf(createText(text, dci.kind, sourceSets, styles, extra)),
- address,
- dci,
- sourceSets.toDisplaySourceSets(),
- extra = extra
- )
- }
-
- public fun link(
- text: String,
- address: String,
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ) {
- contents += ContentResolvedLink(
- children = listOf(createText(text, kind, sourceSets, styles, extra)),
- address = address,
- extra = PropertyContainer.empty(),
- dci = DCI(mainDRI, kind),
- sourceSets = sourceSets.toDisplaySourceSets(),
- style = emptySet()
- )
- }
-
- public fun link(
- address: DRI,
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contents += ContentDRILink(
- contentFor(mainDRI, sourceSets, kind, styles, extra, block).children,
- address,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- extra = extra
- )
- }
-
- public fun comment(
- docTag: DocTag,
- kind: Kind = ContentKind.Comment,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ) {
- val content = commentsConverter.buildContent(
- docTag,
- DCI(mainDRI, kind),
- sourceSets
- )
- contents += ContentGroup(content, DCI(mainDRI, kind), sourceSets.toDisplaySourceSets(), styles, extra)
- }
-
- public fun codeBlock(
- language: String = "",
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contents += ContentCodeBlock(
- contentFor(mainDRI, sourceSets, kind, styles, extra, block).children,
- language,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles,
- extra
- )
- }
-
- public fun codeInline(
- language: String = "",
- kind: Kind = ContentKind.Main,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contents += ContentCodeInline(
- contentFor(mainDRI, sourceSets, kind, styles, extra, block).children,
- language,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles,
- extra
- )
- }
-
- public fun firstParagraphComment(
- content: DocTag,
- kind: Kind = ContentKind.Comment,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ) {
- firstParagraphBrief(content)?.let { brief ->
- val builtDescription = commentsConverter.buildContent(
- brief,
- DCI(mainDRI, kind),
- sourceSets
- )
-
- contents += ContentGroup(
- builtDescription,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles,
- extra
- )
- }
- }
-
- public fun firstSentenceComment(
- content: DocTag,
- kind: Kind = ContentKind.Comment,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ){
- val builtDescription = commentsConverter.buildContent(
- content,
- DCI(mainDRI, kind),
- sourceSets
- )
-
- contents += ContentGroup(
- firstSentenceBriefFromContentNodes(builtDescription),
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles,
- extra
- )
- }
-
- public fun group(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contents += buildGroup(dri, sourceSets, kind, styles, extra, block)
- }
-
- public fun divergentGroup(
- groupID: ContentDivergentGroup.GroupID,
- dri: Set<DRI> = mainDRI,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- implicitlySourceSetHinted: Boolean = true,
- block: DivergentBuilder.() -> Unit
- ) {
- contents +=
- DivergentBuilder(dri, kind, styles, extra)
- .apply(block)
- .build(groupID = groupID, implicitlySourceSetHinted = implicitlySourceSetHinted)
- }
-
- public fun buildGroup(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ): ContentGroup = contentFor(dri, sourceSets, kind, styles, extra, block)
-
- public fun sourceSetDependentHint(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourcesetData,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contents += PlatformHintedContent(
- buildGroup(dri, sourceSets, kind, styles, extra, block),
- sourceSets.toDisplaySourceSets()
- )
- }
-
- public fun sourceSetDependentHint(
- dri: DRI,
- sourcesetData: Set<DokkaSourceSet> = mainSourcesetData,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contents += PlatformHintedContent(
- buildGroup(setOf(dri), sourcesetData, kind, styles, extra, block),
- sourcesetData.toDisplaySourceSets()
- )
- }
-
- protected fun createText(
- text: String,
- kind: Kind,
- sourceSets: Set<DokkaSourceSet>,
- styles: Set<Style>,
- extra: PropertyContainer<ContentNode>
- ): ContentText {
- return ContentText(text, DCI(mainDRI, kind), sourceSets.toDisplaySourceSets(), styles, extra)
- }
-
- public fun <T> sourceSetDependentText(
- value: SourceSetDependent<T>,
- sourceSets: Set<DokkaSourceSet> = value.keys,
- styles: Set<Style> = mainStyles,
- transform: (T) -> String
- ) {
- value.entries
- .filter { it.key in sourceSets }
- .mapNotNull { (p, v) -> transform(v).takeIf { it.isNotBlank() }?.let { it to p } }
- .groupBy({ it.first }) { it.second }
- .forEach { text(it.key, sourceSets = it.value.toSet(), styles = styles) }
- }
- }
-
- @ContentBuilderMarker
- public open inner class TableBuilder(
- private val mainDRI: Set<DRI>,
- private val mainSourceSets: Set<DokkaSourceSet>,
- private val mainKind: Kind,
- private val mainStyles: Set<Style>,
- private val mainExtra: PropertyContainer<ContentNode>
- ) {
- private val headerRows: MutableList<ContentGroup> = mutableListOf()
- private val rows: MutableList<ContentGroup> = mutableListOf()
- private var caption: ContentGroup? = null
-
- public fun header(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- headerRows += contentFor(dri, sourceSets, kind, styles, extra, block)
- }
-
- public fun row(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- rows += contentFor(dri, sourceSets, kind, styles, extra, block)
- }
-
- public fun caption(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- caption = contentFor(dri, sourceSets, kind, styles, extra, block)
- }
-
- public fun build(
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ): ContentTable {
- return ContentTable(
- headerRows,
- caption,
- rows,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles, extra
- )
- }
- }
-
- @ContentBuilderMarker
- public open inner class DivergentBuilder(
- private val mainDRI: Set<DRI>,
- private val mainKind: Kind,
- private val mainStyles: Set<Style>,
- private val mainExtra: PropertyContainer<ContentNode>
- ) {
- private val instances: MutableList<ContentDivergentInstance> = mutableListOf()
-
- public fun instance(
- dri: Set<DRI>,
- sourceSets: Set<DokkaSourceSet>, // Having correct sourcesetData is crucial here, that's why there's no default
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DivergentInstanceBuilder.() -> Unit
- ) {
- instances += DivergentInstanceBuilder(dri, sourceSets, styles, extra)
- .apply(block)
- .build(kind)
- }
-
- public fun build(
- groupID: ContentDivergentGroup.GroupID,
- implicitlySourceSetHinted: Boolean,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ): ContentDivergentGroup {
- return ContentDivergentGroup(
- children = instances.toList(),
- dci = DCI(mainDRI, kind),
- style = styles,
- extra = extra,
- groupID = groupID,
- implicitlySourceSetHinted = implicitlySourceSetHinted
- )
- }
- }
-
- @ContentBuilderMarker
- public open inner class DivergentInstanceBuilder(
- private val mainDRI: Set<DRI>,
- private val mainSourceSets: Set<DokkaSourceSet>,
- private val mainStyles: Set<Style>,
- private val mainExtra: PropertyContainer<ContentNode>
- ) {
- private var before: ContentNode? = null
- private var divergent: ContentNode? = null
- private var after: ContentNode? = null
-
- public fun before(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contentFor(dri, sourceSets, kind, styles, extra, block)
- .takeIf { it.hasAnyContent() }
- .also { before = it }
- }
-
- public fun divergent(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- divergent = contentFor(dri, sourceSets, kind, styles, extra, block)
- }
-
- public fun after(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = ContentKind.Main,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contentFor(dri, sourceSets, kind, styles, extra, block)
- .takeIf { it.hasAnyContent() }
- .also { after = it }
- }
-
- public fun build(
- kind: Kind,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ): ContentDivergentInstance {
- return ContentDivergentInstance(
- before,
- divergent ?: throw IllegalStateException("Divergent block needs divergent part"),
- after,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles,
- extra
- )
- }
- }
-
- @ContentBuilderMarker
- public open inner class ListBuilder(
- public val ordered: Boolean,
- private val mainDRI: Set<DRI>,
- private val mainSourceSets: Set<DokkaSourceSet>,
- private val mainKind: Kind,
- private val mainStyles: Set<Style>,
- private val mainExtra: PropertyContainer<ContentNode>
- ) {
- private val contentNodes: MutableList<ContentNode> = mutableListOf()
-
- public fun item(
- dri: Set<DRI> = mainDRI,
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: DocumentableContentBuilder.() -> Unit
- ) {
- contentNodes += contentFor(dri, sourceSets, kind, styles, extra, block)
- }
-
- public fun build(
- sourceSets: Set<DokkaSourceSet> = mainSourceSets,
- kind: Kind = mainKind,
- styles: Set<Style> = mainStyles,
- extra: PropertyContainer<ContentNode> = mainExtra
- ): ContentList {
- return ContentList(
- contentNodes,
- ordered,
- DCI(mainDRI, kind),
- sourceSets.toDisplaySourceSets(),
- styles, extra
- )
- }
- }
-}
diff --git a/plugins/base/src/main/kotlin/translators/documentables/briefFromContentNodes.kt b/plugins/base/src/main/kotlin/translators/documentables/briefFromContentNodes.kt
deleted file mode 100644
index a073f73a..00000000
--- a/plugins/base/src/main/kotlin/translators/documentables/briefFromContentNodes.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.translators.documentables
-
-import org.jetbrains.dokka.base.utils.firstNotNullOfOrNull
-import org.jetbrains.dokka.model.doc.CustomDocTag
-import org.jetbrains.dokka.model.doc.DocTag
-import org.jetbrains.dokka.model.doc.P
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.*
-
-public fun firstParagraphBrief(docTag: DocTag): DocTag? =
- when(docTag){
- is P -> docTag
- is CustomDocTag -> docTag.children.firstNotNullOfOrNull { firstParagraphBrief(it) }
- is Text -> docTag
- else -> null
- }
-
-public fun firstSentenceBriefFromContentNodes(description: List<ContentNode>): List<ContentNode> {
- val firstSentenceRegex = """^((?:[^.?!]|[.!?](?!\s))*[.!?])""".toRegex()
-
- //Description that is entirely based on html content. In html it is hard to define a brief so we render all of it
- if(description.all { it.withDescendants().all { it is ContentGroup || (it as? ContentText)?.isHtml == true } }){
- return description
- }
-
- var sentenceFound = false
- fun lookthrough(node: ContentNode, neighbours: List<ContentNode>, currentIndex: Int): ContentNode =
- if (node.finishesWithSentenceNotFollowedByHtml(firstSentenceRegex, neighbours, currentIndex) || node.containsSentenceFinish(firstSentenceRegex)) {
- node as ContentText
- sentenceFound = true
- node.copy(text = firstSentenceRegex.find(node.text)?.value.orEmpty())
- } else if (node is ContentGroup) {
- node.copy(children = node.children.mapIndexedNotNull { i, element ->
- if (!sentenceFound) lookthrough(element, node.children, i) else null
- }, style = node.style - TextStyle.Paragraph)
- } else {
- node
- }
- return description.mapIndexedNotNull { i, element ->
- if (!sentenceFound) lookthrough(element, description, i) else null
- }
-}
-
-private fun ContentNode.finishesWithSentenceNotFollowedByHtml(firstSentenceRegex: Regex, neighbours: List<ContentNode>, currentIndex: Int): Boolean =
- this is ContentText && !isHtml && matchContainsEnd(this, firstSentenceRegex) && !neighbours.nextElementIsHtml(currentIndex)
-
-private fun ContentNode.containsSentenceFinish(firstSentenceRegex: Regex): Boolean =
- this is ContentText && !isHtml && firstSentenceRegex.containsMatchIn(text) && !matchContainsEnd(this, firstSentenceRegex)
-
-private fun matchContainsEnd(node: ContentText, regex: Regex): Boolean =
- regex.find(node.text)?.let { node.text.endsWith(it.value) } ?: false
-
-private fun List<ContentNode>.nextElementIsHtml(currentElementIndex: Int): Boolean =
- currentElementIndex != lastIndex && get(currentElementIndex + 1).isHtml
-
-private val ContentNode.isHtml
- get() = extra[HtmlContent] != null
diff --git a/plugins/base/src/main/kotlin/utils/CollectionExtensions.kt b/plugins/base/src/main/kotlin/utils/CollectionExtensions.kt
deleted file mode 100644
index 96a0a039..00000000
--- a/plugins/base/src/main/kotlin/utils/CollectionExtensions.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.utils
-
-// TODO [beresnev] remove this copy-paste and use the same method from stdlib instead after updating to 1.5
-internal inline fun <T, R : Any> Iterable<T>.firstNotNullOfOrNull(transform: (T) -> R?): R? {
- for (element in this) {
- val result = transform(element)
- if (result != null) {
- return result
- }
- }
- return null
-}
diff --git a/plugins/base/src/main/kotlin/utils/alphabeticalOrder.kt b/plugins/base/src/main/kotlin/utils/alphabeticalOrder.kt
deleted file mode 100644
index ed620b34..00000000
--- a/plugins/base/src/main/kotlin/utils/alphabeticalOrder.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.base.utils
-
-
-/**
- * Canonical alphabetical order to sort named elements
- */
-internal val canonicalAlphabeticalOrder: Comparator<in String> = String.CASE_INSENSITIVE_ORDER.thenBy { it }
diff --git a/plugins/base/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/base/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index a014a209..00000000
--- a/plugins/base/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.base.DokkaBase
diff --git a/plugins/base/src/main/resources/dokka/docs/javadoc/EnumValueOf.java.template b/plugins/base/src/main/resources/dokka/docs/javadoc/EnumValueOf.java.template
deleted file mode 100644
index 233f8819..00000000
--- a/plugins/base/src/main/resources/dokka/docs/javadoc/EnumValueOf.java.template
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Returns the enum constant of this type with the specified
- * name.
- * The string must match exactly an identifier used to declare
- * an enum constant in this type. (Extraneous whitespace
- * characters are not permitted.)
- *
- * @return the enum constant with the specified name
- * @throws IllegalArgumentException if this enum type has no
- * constant with the specified name
- */
- \ No newline at end of file
diff --git a/plugins/base/src/main/resources/dokka/docs/javadoc/EnumValues.java.template b/plugins/base/src/main/resources/dokka/docs/javadoc/EnumValues.java.template
deleted file mode 100644
index 4aed38a6..00000000
--- a/plugins/base/src/main/resources/dokka/docs/javadoc/EnumValues.java.template
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Returns an array containing the constants of this enum
- * type, in the order they're declared. This method may be
- * used to iterate over the constants.
- *
- * @return an array containing the constants of this enum
- * type, in the order they're declared
- */
diff --git a/plugins/base/src/main/resources/dokka/docs/kdoc/EnumEntries.kt.template b/plugins/base/src/main/resources/dokka/docs/kdoc/EnumEntries.kt.template
deleted file mode 100644
index 20d16421..00000000
--- a/plugins/base/src/main/resources/dokka/docs/kdoc/EnumEntries.kt.template
+++ /dev/null
@@ -1,3 +0,0 @@
-Returns a representation of an immutable list of all enum entries, in the order they're declared.
-
-This method may be used to iterate over the enum entries.
diff --git a/plugins/base/src/main/resources/dokka/docs/kdoc/EnumValueOf.kt.template b/plugins/base/src/main/resources/dokka/docs/kdoc/EnumValueOf.kt.template
deleted file mode 100644
index fbf8fa8d..00000000
--- a/plugins/base/src/main/resources/dokka/docs/kdoc/EnumValueOf.kt.template
+++ /dev/null
@@ -1,4 +0,0 @@
-Returns the enum constant of this type with the specified name. The string must match exactly an identifier used
-to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
-
-@throws kotlin.IllegalArgumentException if this enum type has no constant with the specified name
diff --git a/plugins/base/src/main/resources/dokka/docs/kdoc/EnumValues.kt.template b/plugins/base/src/main/resources/dokka/docs/kdoc/EnumValues.kt.template
deleted file mode 100644
index c0e3559c..00000000
--- a/plugins/base/src/main/resources/dokka/docs/kdoc/EnumValues.kt.template
+++ /dev/null
@@ -1,3 +0,0 @@
-Returns an array containing the constants of this enum type, in the order they're declared.
-
-This method may be used to iterate over the constants.
diff --git a/plugins/base/src/main/resources/dokka/format/gfm.properties b/plugins/base/src/main/resources/dokka/format/gfm.properties
deleted file mode 100644
index 66b1ea8f..00000000
--- a/plugins/base/src/main/resources/dokka/format/gfm.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.GFMFormatDescriptor
-description=Produces documentation in GitHub-flavored markdown format
diff --git a/plugins/base/src/main/resources/dokka/format/html-as-java.properties b/plugins/base/src/main/resources/dokka/format/html-as-java.properties
deleted file mode 100644
index cbb5a399..00000000
--- a/plugins/base/src/main/resources/dokka/format/html-as-java.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.HtmlAsJavaFormatDescriptor
-description=Produces output in HTML format using Java syntax
diff --git a/plugins/base/src/main/resources/dokka/format/html.properties b/plugins/base/src/main/resources/dokka/format/html.properties
deleted file mode 100644
index 42438d16..00000000
--- a/plugins/base/src/main/resources/dokka/format/html.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.HtmlFormatDescriptor
-description=Produces output in HTML format
diff --git a/plugins/base/src/main/resources/dokka/format/java-layout-html.properties b/plugins/base/src/main/resources/dokka/format/java-layout-html.properties
deleted file mode 100644
index 79925edd..00000000
--- a/plugins/base/src/main/resources/dokka/format/java-layout-html.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.JavaLayoutHtmlFormatDescriptor
-description=Produces Kotlin Style Docs with Javadoc like layout
diff --git a/plugins/base/src/main/resources/dokka/format/jekyll.properties b/plugins/base/src/main/resources/dokka/format/jekyll.properties
deleted file mode 100644
index 28f55afc..00000000
--- a/plugins/base/src/main/resources/dokka/format/jekyll.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.JekyllFormatDescriptor
-description=Produces documentation in Jekyll format
diff --git a/plugins/base/src/main/resources/dokka/format/kotlin-website-html.properties b/plugins/base/src/main/resources/dokka/format/kotlin-website-html.properties
deleted file mode 100644
index 4e8dea39..00000000
--- a/plugins/base/src/main/resources/dokka/format/kotlin-website-html.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.KotlinWebsiteHtmlFormatDescriptor
-description=Generates Kotlin website documentation
diff --git a/plugins/base/src/main/resources/dokka/format/markdown.properties b/plugins/base/src/main/resources/dokka/format/markdown.properties
deleted file mode 100644
index 62a0f2b2..00000000
--- a/plugins/base/src/main/resources/dokka/format/markdown.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.MarkdownFormatDescriptor
-description=Produces documentation in markdown format
diff --git a/plugins/base/src/main/resources/dokka/images/anchor-copy-button.svg b/plugins/base/src/main/resources/dokka/images/anchor-copy-button.svg
deleted file mode 100644
index 19c1fa3f..00000000
--- a/plugins/base/src/main/resources/dokka/images/anchor-copy-button.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M21.2496 5.3C20.3496 4.5 19.2496 4 18.0496 4C16.8496 4 15.6496 4.5 14.8496 5.3L10.3496 9.8L11.7496 11.2L16.2496 6.7C17.2496 5.7 18.8496 5.7 19.8496 6.7C20.8496 7.7 20.8496 9.3 19.8496 10.3L15.3496 14.8L16.7496 16.2L21.2496 11.7C22.1496 10.8 22.5496 9.7 22.5496 8.5C22.5496 7.3 22.1496 6.2 21.2496 5.3Z" fill="#637282"/>
- <path d="M8.35 16.7998C7.35 17.7998 5.75 17.7998 4.75 16.7998C3.75 15.7998 3.75 14.1998 4.75 13.1998L9.25 8.6998L7.85 7.2998L3.35 11.7998C1.55 13.5998 1.55 16.3998 3.35 18.1998C4.25 19.0998 5.35 19.4998 6.55 19.4998C7.75 19.4998 8.85 19.0998 9.75 18.1998L14.25 13.6998L12.85 12.2998L8.35 16.7998Z" fill="#637282"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/arrow_down.svg b/plugins/base/src/main/resources/dokka/images/arrow_down.svg
deleted file mode 100755
index 639aaf12..00000000
--- a/plugins/base/src/main/resources/dokka/images/arrow_down.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="24" height="24" viewBox="-5 -3 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M11 9l-6 5.25V3.75z" fill="currentColor"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/burger.svg b/plugins/base/src/main/resources/dokka/images/burger.svg
deleted file mode 100644
index fcca732b..00000000
--- a/plugins/base/src/main/resources/dokka/images/burger.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M23.3379 5.83331H4.67126V8.16665H23.3379V5.83331Z" fill="white"/>
- <path d="M23.3379 12.8333H4.67126V15.1666H23.3379V12.8333Z" fill="white"/>
- <path d="M4.67126 19.8333H23.3379V22.1666H4.67126V19.8333Z" fill="white"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/copy-icon.svg b/plugins/base/src/main/resources/dokka/images/copy-icon.svg
deleted file mode 100644
index 2cb02ec6..00000000
--- a/plugins/base/src/main/resources/dokka/images/copy-icon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd" clip-rule="evenodd" d="M5 4H15V16H5V4ZM17 7H19V18V20H17H8V18H17V7Z" fill="black"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/copy-successful-icon.svg b/plugins/base/src/main/resources/dokka/images/copy-successful-icon.svg
deleted file mode 100644
index c4b95383..00000000
--- a/plugins/base/src/main/resources/dokka/images/copy-successful-icon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M18 9C18 14 14 18 9 18C4 18 0 14 0 9C0 4 4 0 9 0C14 0 18 4 18 9ZM14.2 6.2L12.8 4.8L7.5 10.1L5.3 7.8L3.8 9.2L7.5 13L14.2 6.2Z" fill="#4DBB5F"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/footer-go-to-link.svg b/plugins/base/src/main/resources/dokka/images/footer-go-to-link.svg
deleted file mode 100644
index a87add7a..00000000
--- a/plugins/base/src/main/resources/dokka/images/footer-go-to-link.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M8 0H2.3949L4.84076 2.44586L0 7.28662L0.713376 8L5.55414 3.15924L8 5.6051V0Z" fill="#637282"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/go-to-top-icon.svg b/plugins/base/src/main/resources/dokka/images/go-to-top-icon.svg
deleted file mode 100644
index abc3d1ce..00000000
--- a/plugins/base/src/main/resources/dokka/images/go-to-top-icon.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="12" height="10" viewBox="0 0 12 10" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M11.3337 9.66683H0.666992L6.00033 3.66683L11.3337 9.66683Z" fill="#637282"/>
- <path d="M0.666992 0.333496H11.3337V1.66683H0.666992V0.333496Z" fill="#637282"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/homepage.svg b/plugins/base/src/main/resources/dokka/images/homepage.svg
deleted file mode 100644
index a3d7602b..00000000
--- a/plugins/base/src/main/resources/dokka/images/homepage.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<!-- SOURCE: https://www.svgrepo.com/svg/416627/home-house-ui -->
-<svg fill="#ffffff" width="64px" height="64px" viewBox="0 0 512.00 512.00" xmlns="http://www.w3.org/2000/svg">
- <path d="M256,0C114.615,0,0,114.615,0,256s114.615,256,256,256s256-114.615,256-256S397.385,0,256,0z M404.861,263.236 L404.861,263.236c-7.297,7.297-18.066,8.993-26.986,5.104v97.098c0,20.193-16.37,36.562-36.562,36.562H170.688 c-20.193,0-36.562-16.37-36.562-36.562v-97.098c-8.919,3.89-19.689,2.193-26.986-5.104c-9.519-9.519-9.519-24.952,0-34.471 L238.764,97.139h0c9.519-9.519,24.952-9.519,34.471,0l131.625,131.625C414.38,238.283,414.38,253.717,404.861,263.236z"/>
- <path d="M286.469,267.938h-60.938c-6.731,0-12.188,5.457-12.188,12.188v73.125c0,6.731,5.457,12.188,12.188,12.188h60.938 c6.731,0,12.188-5.457,12.188-12.188v-73.125C298.656,273.394,293.2,267.938,286.469,267.938z"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/logo-icon.svg b/plugins/base/src/main/resources/dokka/images/logo-icon.svg
deleted file mode 100755
index e42f9570..00000000
--- a/plugins/base/src/main/resources/dokka/images/logo-icon.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M64 64H0V0H64L31.3373 31.5369L64 64Z" fill="url(#paint0_radial)"/>
- <defs>
- <radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(61.8732 2.63097) scale(73.3111)">
- <stop offset="0.00343514" stop-color="#EF4857"/>
- <stop offset="0.4689" stop-color="#D211EC"/>
- <stop offset="1" stop-color="#7F52FF"/>
- </radialGradient>
- </defs>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class-kotlin.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class-kotlin.svg
deleted file mode 100644
index 19d6148c..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class-kotlin.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="abstractClassKotlin">
-<path id="Fill 1" fill-rule="evenodd" clip-rule="evenodd" d="M3 3.1055C1.764 4.3685 1 6.0935 1 8.0005C1 9.9065 1.764 11.6315 3 12.8945V3.1055Z" fill="#9AA7B0" fill-opacity="0.8"/>
-<path id="Combined Shape" fill-rule="evenodd" clip-rule="evenodd" d="M13 8V3.1055C14.2359 4.36739 14.9999 6.0932 15 8H13Z" fill="#9AA7B0" fill-opacity="0.8"/>
-<g id="idea/community/platform/icons/src/nodes/class">
-<mask id="mask0" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="4" y="1" width="8" height="14">
-<path id="Mask" d="M4 1H12V8H8V15H4V1Z" fill="white"/>
-</mask>
-<g mask="url(#mask0)">
-<g id="class">
-<path id="Fill 1_2" fill-rule="evenodd" clip-rule="evenodd" d="M15 8C15 11.866 11.866 15 8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8Z" fill="#40B6E0" fill-opacity="0.6"/>
-<g id="&#226;&#140;&#152;/alphabet/nodes/c">
-<path id="&#226;&#140;&#152;/alphabet/nodes/c_2" fill-rule="evenodd" clip-rule="evenodd" d="M10 9.28253C9.53001 9.74153 9.02801 9.978 8.10001 10C7.06101 10.022 6.00001 9.2794 6.00001 8.0004C6.00001 6.7124 6.97101 6 8.10001 6C9.37251 6 9.90001 6.55426 9.90001 6.55426L10.5162 5.83673C9.82941 5.27017 9.28828 5.0004 8.09821 5.0004C6.34021 5.0004 5.00021 6.3584 5.00021 8.0004C5.00021 9.6824 6.36421 11.0004 8.00221 11.0004C9.29286 11.0004 10.0232 10.5934 10.6162 9.9814L10 9.28253Z" fill="#231F20" fill-opacity="0.7"/>
-</g>
-</g>
-</g>
-</g>
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class.svg
deleted file mode 100644
index 60182030..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/abstract-class.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
- <defs>
- <rect id="abstractclass-a" width="8" height="14"/>
- </defs>
- <g fill="none" fill-rule="evenodd">
- <path fill="#9AA7B0" fill-opacity=".8" d="M3 3.1055C1.764 4.3685 1 6.0935 1 8.0005 1 9.9065 1.764 11.6315 3 12.8945L3 3.1055zM13 3.1055L13 12.8945C14.236 11.6315 15 9.9065 15 8.0005 15 6.0935 14.236 4.3675 13 3.1055"/>
- <g transform="translate(4 1)">
- <mask id="abstractclass-b" fill="#fff">
- <use xlink:href="#abstractclass-a"/>
- </mask>
- <g mask="url(#abstractclass-b)">
- <g transform="translate(-4 -1)">
- <path fill="#40B6E0" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <path fill="#231F20" fill-opacity=".7" d="M5,4.28253174 C4.53,4.74153174 4.028,4.978 3.1,5 C2.061,5.022 1,4.2794 1,3.0004 C1,1.7124 1.971,1 3.1,1 C3.94833171,1 4.54833171,1.18475342 4.9,1.55426025 L5.5162,0.836730957 C4.8293999,0.270175195 4.28826904,0.0004 3.0982,0.0004 C1.3402,0.0004 0.0002,1.3584 0.0002,3.0004 C0.0002,4.6824 1.3642,6.0004 3.0022,6.0004 C4.29284668,6.0004 5.0232,5.5934 5.6162,4.9814 C5.2054,4.51548783 5,4.28253174 5,4.28253174 Z" transform="translate(5 5)"/>
- </g>
- </g>
- </g>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/annotation-kotlin.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/annotation-kotlin.svg
deleted file mode 100644
index b90f508c..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/annotation-kotlin.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="annotationKotlin">
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8H8V15Z" fill="#62B543" fill-opacity="0.6"/>
-<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M8.00001 9.32546V9.99479C7.96296 9.99826 7.92599 10 7.88911 10C7.07966 10 6.00011 9.9211 6.00011 8.0001C6.00011 6.32043 7.45594 6.0001 8.00011 6.0001C8.15311 6.0001 9.74511 6.0551 9.82411 6.0791L9.75124 8H8.76699C8.7695 7.96484 8.77154 7.9292 8.77311 7.8931L8.84211 6.6991L8.80011 6.6891C8.68511 6.6621 8.59811 6.6481 8.50011 6.6371C8.40211 6.6271 8.30411 6.6221 8.20211 6.6221C7.97811 6.6221 7.78611 6.6681 7.62811 6.7611C7.47311 6.8511 7.34511 6.9741 7.24611 7.1241C7.15111 7.2721 7.08111 7.4411 7.03911 7.6261C6.99711 7.8091 6.97611 7.9961 6.97611 8.1841C6.97611 8.5861 7.04911 8.8721 7.19711 9.0581C7.34911 9.2481 7.55411 9.3451 7.80511 9.3451C7.87359 9.3451 7.93863 9.33855 8.00001 9.32546ZM11.9819 8H11.0207C11.0512 7.78917 11.0601 7.61595 11.0601 7.5471C11.0601 4.90741 8.70811 4.7451 8.31611 4.7451C7.77111 4.7451 4.94355 4.85089 4.94355 8.0006C4.94355 8.58402 4.94355 11.2461 7.88911 11.2461C7.91058 11.2461 7.94864 11.2438 8.00001 11.2394V11.9994C7.9664 11.9999 7.93243 12.0001 7.89811 12.0001C7.15577 12.0001 4.00211 12.0001 4.00211 8.0006C4.00211 4.0011 7.66743 4.0011 8.31611 4.0011C8.65106 4.0011 12.0001 4.08643 12.0001 7.5571C12.0001 7.71468 11.9938 7.86209 11.9819 8Z" fill="#231F20" fill-opacity="0.7"/>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/annotation.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/annotation.svg
deleted file mode 100644
index b80c54b4..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/annotation.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#62B543" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <path fill="#231F20" fill-opacity=".7" d="M3.6281,2.7611 C3.4731,2.8511 3.3451,2.9741 3.2461,3.1241 C3.1511,3.2721 3.0811,3.4411 3.0391,3.6261 C2.9971,3.8091 2.9761,3.9961 2.9761,4.1841 C2.9761,4.5861 3.0491,4.8721 3.1971,5.0581 C3.3491,5.2481 3.5541,5.3451 3.8051,5.3451 C3.9701,5.3451 4.1151,5.3071 4.2371,5.2311 C4.3571,5.1581 4.4571,5.0531 4.5331,4.9201 C4.6061,4.7931 4.6631,4.6401 4.7011,4.4641 C4.7391,4.2941 4.7641,4.1011 4.7731,3.8931 L4.8421,2.6991 L4.8001,2.6891 C4.6851,2.6621 4.5981,2.6481 4.5001,2.6371 C4.4021,2.6271 4.3041,2.6221 4.2021,2.6221 C3.9781,2.6221 3.7861,2.6681 3.6281,2.7611 Z M0.0021,4.0006 C0.0021,0.0011 3.66741943,0.0011 4.3161,0.0011 C4.65105644,0.0011 8.0001,0.0864290039 8.0001,3.5571 C8.0001,6.0091 6.4751,6 6.1701,6 C5.67331784,5.97 5.31431784,5.7737 5.0931,5.4111 C4.68260397,5.8037 4.28127064,6 3.8891,6 C3.0796519,6 2.0001,5.9211 2.0001,4.0001 C2.0001,2.32043457 3.45593262,2.0001 4.0001,2.0001 C4.1531,2.0001 5.7451,2.0551 5.8241,2.0791 L5.7441,4.1881 C5.6361,4.89276667 5.7991,5.2451 6.2331,5.2451 C6.95605469,5.2451 7.0601,3.7831 7.0601,3.5471 C7.0601,0.907409668 4.7081,0.7451 4.3161,0.7451 C3.7711,0.7451 0.94354248,0.850891113 0.94354248,4.0006 C0.94354248,4.58402311 0.94354248,7.2461 3.8891,7.2461 C4.0901,7.2461 5.7441,7.04302979 6.1621,6.8281 L6.1621,7.5781 C5.8551,7.7031 5.0931,8.0001 3.8981,8.0001 C3.15576172,8.0001 0.0021,8.0001 0.0021,4.0006 Z" transform="translate(4 4)"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/class-kotlin.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/class-kotlin.svg
deleted file mode 100644
index 797a2423..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/class-kotlin.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="classKotlin">
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8H8V15Z" fill="#40B6E0" fill-opacity="0.6"/>
-<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M8.00001 11.0004C6.36299 10.9992 5.00021 9.68165 5.00021 8.0004C5.00021 6.3584 6.34021 5.0004 8.09821 5.0004C9.28828 5.0004 9.82941 5.27018 10.5162 5.83673L9.90001 6.55426C9.54835 6.18475 8.94835 6 8.10001 6C6.97101 6 6.00001 6.7124 6.00001 8.0004C6.00001 9.23838 6.99405 9.97382 8.00001 9.99976V11.0004V11.0004Z" fill="#231F20" fill-opacity="0.7"/>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/class.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/class.svg
deleted file mode 100644
index 3f1ad167..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/class.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#40B6E0" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <path fill="#231F20" fill-opacity=".7" d="M5,4.28253174 C4.53,4.74153174 4.028,4.978 3.1,5 C2.061,5.022 1,4.2794 1,3.0004 C1,1.7124 1.971,1 3.1,1 C3.94833171,1 4.54833171,1.18475342 4.9,1.55426025 L5.5162,0.836730957 C4.8293999,0.270175195 4.28826904,0.0004 3.0982,0.0004 C1.3402,0.0004 0.0002,1.3584 0.0002,3.0004 C0.0002,4.6824 1.3642,6.0004 3.0022,6.0004 C4.29284668,6.0004 5.0232,5.5934 5.6162,4.9814 C5.2054,4.51548783 5,4.28253174 5,4.28253174 Z" transform="translate(5 5)"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/enum-kotlin.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/enum-kotlin.svg
deleted file mode 100644
index 775a7cc9..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/enum-kotlin.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="enumKotlin">
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8H8V15Z" fill="#40B6E0" fill-opacity="0.6"/>
-<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M8 11H6V5H10V6H7V7H9V8H7V10H8V11Z" fill="#231F20" fill-opacity="0.7"/>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/enum.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/enum.svg
deleted file mode 100644
index fa7f2476..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/enum.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#40B6E0" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <polygon fill="#231F20" fill-opacity=".7" points="4 6 0 6 0 0 4 0 4 1 1 1 1 2 3.5 2 3.5 3 1 3 1 5 4 5" transform="translate(6 5)"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/exception-class.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/exception-class.svg
deleted file mode 100644
index c0b2bdeb..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/exception-class.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#40B6E0" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <polygon fill="#231F20" fill-opacity=".7" points="7 13 9 9 4 9 9 3 8 7 12 7"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/field-value.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/field-value.svg
deleted file mode 100644
index 2771ee56..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/field-value.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <rect width="14" height="14" x="1" y="1" fill="#B99BF8" fill-opacity=".6" rx="3"/>
- <path fill="#231F20" fill-opacity=".7" d="M2.2939,6 L-0.0001,0 L1.2,0 C2.3886,3.13933333 2.98856667,4.73933333 2.9999,4.8 L4.8,0 L5.9999,0 L3.7059,6 L2.2939,6 Z" transform="translate(5 5)"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/field-variable.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/field-variable.svg
deleted file mode 100644
index e2d2bbd0..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/field-variable.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#B99BF8" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <path fill="#231F20" fill-opacity=".7" d="M2.2939,6 L-0.0001,0 L1.2,0 C2.3886,3.13933333 2.98856667,4.73933333 2.9999,4.8 L4.8,0 L5.9999,0 L3.7059,6 L2.2939,6 Z" transform="translate(5 5)"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/function.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/function.svg
deleted file mode 100644
index f0da64a0..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/function.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#F98B9E" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <path fill="#231F20" fill-opacity=".7" d="M1,8 L2,8 L2,4 L3.5,4 L3.5,3 L2,3 C1.99687783,2.36169171 1.99509925,2.02835838 1.99466424,2 C1.98704681,1.50341351 2.13289549,1.0728225 2.43221029,0.972167969 C2.91964141,0.808253079 3.56884985,1.02114795 3.68984985,1.06414795 L3.98519897,0.226043701 C3.90948298,0.198825534 3.4559021,0 2.81140137,0 C2.16690063,1.40512602e-16 1.81677246,0.0614013672 1.4818929,0.388793945 C1.16513106,0.698473875 1.01614114,1.22015248 1.00124609,2 C1.00039414,2.04460465 0.999980878,2.95274463 1,3 C1.00000736,3.01819872 0.666674031,3.01819872 0,3 L0,3.972 L1,3.972 L1,8 Z" transform="translate(6 4)"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/interface-kotlin.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/interface-kotlin.svg
deleted file mode 100644
index 5e163260..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/interface-kotlin.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="interfaceKotlin">
-<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8H8V15Z" fill="#62B543" fill-opacity="0.6"/>
-<path id="Vector_2" opacity="0.7" d="M8 11H6V10.0065L7.4 10V6H6V5H10V6H8.6V8H8V11Z" fill="#231F20"/>
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/interface.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/interface.svg
deleted file mode 100644
index 32063ba2..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/interface.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <g fill="none" fill-rule="evenodd">
- <path fill="#62B543" fill-opacity=".6" d="M15,8 C15,11.866 11.866,15 8,15 C4.134,15 1,11.866 1,8 C1,4.134 4.134,1 8,1 C11.866,1 15,4.134 15,8"/>
- <polygon fill="#231F20" fill-rule="nonzero" points="8.6 10 8.6 6 10 6 10 5 6 5 6 6 7.4 6 7.4 10 6 10.007 6 11 10 11 10 10" opacity=".7"/>
- </g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/object.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/object.svg
deleted file mode 100644
index 31f0ee3e..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/object.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="objectKotlin">
-<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8H8V15Z" fill="#F4AF3D" fill-opacity="0.6"/>
-<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M11 8H9.94262C9.94262 6.87293 9.13115 5.94475 7.9918 5.94475C6.85246 5.94475 6.05738 6.85635 6.05738 7.98343V8C6.05738 9.12437 6.86496 10.0508 8 10.0552V11C7.99727 11 7.99454 11 7.9918 11C6.22951 11 5 9.64917 5 8.01657V8C5 6.3674 6.2459 5 8.0082 5C9.77049 5 11 6.35083 11 7.98343V8Z" fill="#231F20" fill-opacity="0.7"/>
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/nav-icons/typealias-kotlin.svg b/plugins/base/src/main/resources/dokka/images/nav-icons/typealias-kotlin.svg
deleted file mode 100644
index f4bb238b..00000000
--- a/plugins/base/src/main/resources/dokka/images/nav-icons/typealias-kotlin.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g id="typeAlias">
-<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 15C4.134 15 1 11.866 1 8C1 4.134 4.134 1 8 1C11.866 1 15 4.134 15 8H8V15Z" fill="#B99BF8" fill-opacity="0.6"/>
-<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M8.5 8H8V11H7.5V6H5.5V5H10.5V6H8.5V8Z" fill="#231F20" fill-opacity="0.7"/>
-<g id="&#226;&#140;&#152;/modifier/kotlin">
-<path id="&#226;&#140;&#152;/modifier/kotlin_2" d="M16 16H9V9H16L12.4 12.4L16 16Z" fill="#B99BF8"/>
-</g>
-</g>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/images/theme-toggle.svg b/plugins/base/src/main/resources/dokka/images/theme-toggle.svg
deleted file mode 100644
index df86202b..00000000
--- a/plugins/base/src/main/resources/dokka/images/theme-toggle.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
- - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path d="M19.9824 29.0078C21.7625 29.0078 23.5025 28.48 24.9826 27.491C26.4626 26.5021 27.6161 25.0965 28.2973 23.452C28.9785 21.8074 29.1568 19.9978 28.8095 18.252C28.4622 16.5062 27.6051 14.9025 26.3464 13.6439C25.0877 12.3852 23.4841 11.528 21.7382 11.1807C19.9924 10.8335 18.1828 11.0117 16.5383 11.6929C14.8937 12.3741 13.4881 13.5276 12.4992 15.0077C11.5103 16.4877 10.9824 18.2278 10.9824 20.0078C10.9851 22.3939 11.9342 24.6816 13.6214 26.3688C15.3087 28.0561 17.5963 29.0051 19.9824 29.0078ZM19.9824 13.0078C21.8389 13.0078 23.6194 13.7453 24.9322 15.0581C26.2449 16.3708 26.9824 18.1513 26.9824 20.0078C26.9824 21.8643 26.2449 23.6448 24.9322 24.9576C23.6194 26.2703 21.8389 27.0078 19.9824 27.0078V13.0078Z" fill="white"/>
-</svg>
diff --git a/plugins/base/src/main/resources/dokka/inbound-link-resolver/dokka-default.properties b/plugins/base/src/main/resources/dokka/inbound-link-resolver/dokka-default.properties
deleted file mode 100644
index 214fe8d7..00000000
--- a/plugins/base/src/main/resources/dokka/inbound-link-resolver/dokka-default.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.InboundExternalLinkResolutionService$Dokka
-description=Uses Dokka Default resolver
diff --git a/plugins/base/src/main/resources/dokka/inbound-link-resolver/java-layout-html.properties b/plugins/base/src/main/resources/dokka/inbound-link-resolver/java-layout-html.properties
deleted file mode 100644
index 285fc11a..00000000
--- a/plugins/base/src/main/resources/dokka/inbound-link-resolver/java-layout-html.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.Formats.JavaLayoutHtmlInboundLinkResolutionService
-description=Resolver for JavaLayoutHtml
diff --git a/plugins/base/src/main/resources/dokka/inbound-link-resolver/javadoc.properties b/plugins/base/src/main/resources/dokka/inbound-link-resolver/javadoc.properties
deleted file mode 100644
index 66fcc7c9..00000000
--- a/plugins/base/src/main/resources/dokka/inbound-link-resolver/javadoc.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-class=org.jetbrains.dokka.InboundExternalLinkResolutionService$Javadoc
-description=Uses Javadoc Default resolver
diff --git a/plugins/base/src/main/resources/dokka/scripts/clipboard.js b/plugins/base/src/main/resources/dokka/scripts/clipboard.js
deleted file mode 100644
index 7a4f33c5..00000000
--- a/plugins/base/src/main/resources/dokka/scripts/clipboard.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-window.addEventListener('load', () => {
- document.querySelectorAll('span.copy-icon').forEach(element => {
- element.addEventListener('click', (el) => copyElementsContentToClipboard(element));
- })
-
- document.querySelectorAll('span.anchor-icon').forEach(element => {
- element.addEventListener('click', (el) => {
- if(element.hasAttribute('pointing-to')){
- const location = hrefWithoutCurrentlyUsedAnchor() + '#' + element.getAttribute('pointing-to')
- copyTextToClipboard(element, location)
- }
- });
- })
-})
-
-const copyElementsContentToClipboard = (element) => {
- const selection = window.getSelection();
- const range = document.createRange();
- range.selectNodeContents(element.parentNode.parentNode);
- selection.removeAllRanges();
- selection.addRange(range);
-
- copyAndShowPopup(element, () => selection.removeAllRanges())
-}
-
-const copyTextToClipboard = (element, text) => {
- var textarea = document.createElement("textarea");
- textarea.textContent = text;
- textarea.style.position = "fixed";
- document.body.appendChild(textarea);
- textarea.select();
-
- copyAndShowPopup(element, () => document.body.removeChild(textarea))
-}
-
-const copyAndShowPopup = (element, after) => {
- try {
- document.execCommand('copy');
- element.nextElementSibling.classList.add('active-popup');
- setTimeout(() => {
- element.nextElementSibling.classList.remove('active-popup');
- }, 1200);
- } catch (e) {
- console.error('Failed to write to clipboard:', e)
- }
- finally {
- if(after) after()
- }
-}
-
-const hrefWithoutCurrentlyUsedAnchor = () => window.location.href.split('#')[0]
-
diff --git a/plugins/base/src/main/resources/dokka/scripts/navigation-loader.js b/plugins/base/src/main/resources/dokka/scripts/navigation-loader.js
deleted file mode 100644
index 3df7ac8c..00000000
--- a/plugins/base/src/main/resources/dokka/scripts/navigation-loader.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-navigationPageText = fetch(pathToRoot + "navigation.html").then(response => response.text())
-
-displayNavigationFromPage = () => {
- navigationPageText.then(data => {
- document.getElementById("sideMenu").innerHTML = data;
- }).then(() => {
- document.querySelectorAll(".overview > a").forEach(link => {
- link.setAttribute("href", pathToRoot + link.getAttribute("href"));
- })
- }).then(() => {
- document.querySelectorAll(".sideMenuPart").forEach(nav => {
- if (!nav.classList.contains("hidden"))
- nav.classList.add("hidden")
- })
- }).then(() => {
- revealNavigationForCurrentPage()
- }).then(() => {
- scrollNavigationToSelectedElement()
- })
- document.querySelectorAll('.footer a[href^="#"]').forEach(anchor => {
- anchor.addEventListener('click', function (e) {
- e.preventDefault();
- document.querySelector(this.getAttribute('href')).scrollIntoView({
- behavior: 'smooth'
- });
- });
- });
-}
-
-revealNavigationForCurrentPage = () => {
- let pageId = document.getElementById("content").attributes["pageIds"].value.toString();
- let parts = document.querySelectorAll(".sideMenuPart");
- let found = 0;
- do {
- parts.forEach(part => {
- if (part.attributes['pageId'].value.indexOf(pageId) !== -1 && found === 0) {
- found = 1;
- if (part.classList.contains("hidden")) {
- part.classList.remove("hidden");
- part.setAttribute('data-active', "");
- }
- revealParents(part)
- }
- });
- pageId = pageId.substring(0, pageId.lastIndexOf("/"))
- } while (pageId.indexOf("/") !== -1 && found === 0)
-};
-revealParents = (part) => {
- if (part.classList.contains("sideMenuPart")) {
- if (part.classList.contains("hidden"))
- part.classList.remove("hidden");
- revealParents(part.parentNode)
- }
-};
-
-scrollNavigationToSelectedElement = () => {
- let selectedElement = document.querySelector('div.sideMenuPart[data-active]')
- if (selectedElement == null) { // nothing selected, probably just the main page opened
- return
- }
-
- let hasIcon = selectedElement.querySelectorAll(":scope > div.overview span.nav-icon").length > 0
-
- // for instance enums also have children and are expandable, but are not package/module elements
- let isPackageElement = selectedElement.children.length > 1 && !hasIcon
- if (isPackageElement) {
- // if package is selected or linked, it makes sense to align it to top
- // so that you can see all the members it contains
- selectedElement.scrollIntoView(true)
- } else {
- // if a member within a package is linked, it makes sense to center it since it,
- // this should make it easier to look at surrounding members
- selectedElement.scrollIntoView({
- behavior: 'auto',
- block: 'center',
- inline: 'center'
- })
- }
-}
-
-/*
- This is a work-around for safari being IE of our times.
- It doesn't fire a DOMContentLoaded, presumabely because eventListener is added after it wants to do it
-*/
-if (document.readyState == 'loading') {
- window.addEventListener('DOMContentLoaded', () => {
- displayNavigationFromPage()
- })
-} else {
- displayNavigationFromPage()
-}
diff --git a/plugins/base/src/main/resources/dokka/scripts/platform-content-handler.js b/plugins/base/src/main/resources/dokka/scripts/platform-content-handler.js
deleted file mode 100644
index 811c4788..00000000
--- a/plugins/base/src/main/resources/dokka/scripts/platform-content-handler.js
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-filteringContext = {
- dependencies: {},
- restrictedDependencies: [],
- activeFilters: []
-}
-let highlightedAnchor;
-let topNavbarOffset;
-let instances = [];
-let sourcesetNotification;
-
-const samplesDarkThemeName = 'darcula'
-const samplesLightThemeName = 'idea'
-
-window.addEventListener('load', () => {
- document.querySelectorAll("div[data-platform-hinted]")
- .forEach(elem => elem.addEventListener('click', (event) => togglePlatformDependent(event, elem)))
- const filterSection = document.getElementById('filter-section')
- if (filterSection) {
- filterSection.addEventListener('click', (event) => filterButtonHandler(event))
- initializeFiltering()
- }
- initTabs()
- handleAnchor()
- initHidingLeftNavigation()
- topNavbarOffset = document.getElementById('navigation-wrapper')
- darkModeSwitch()
-})
-
-const darkModeSwitch = () => {
- const localStorageKey = "dokka-dark-mode"
- const storage = localStorage.getItem(localStorageKey)
- const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
- const darkModeEnabled = storage ? JSON.parse(storage) : osDarkSchemePreferred
- const element = document.getElementById("theme-toggle-button")
- initPlayground(darkModeEnabled ? samplesDarkThemeName : samplesLightThemeName)
-
- element.addEventListener('click', () => {
- const enabledClasses = document.getElementsByTagName("html")[0].classList
- enabledClasses.toggle("theme-dark")
-
- //if previously we had saved dark theme then we set it to light as this is what we save in local storage
- const darkModeEnabled = enabledClasses.contains("theme-dark")
- if (darkModeEnabled) {
- initPlayground(samplesDarkThemeName)
- } else {
- initPlayground(samplesLightThemeName)
- }
- localStorage.setItem(localStorageKey, JSON.stringify(darkModeEnabled))
- })
-}
-
-const initPlayground = (theme) => {
- if (!samplesAreEnabled()) return
- instances.forEach(instance => instance.destroy())
- instances = []
-
- // Manually tag code fragments as not processed by playground since we also manually destroy all of its instances
- document.querySelectorAll('code.runnablesample').forEach(node => {
- node.removeAttribute("data-kotlin-playground-initialized");
- })
-
- KotlinPlayground('code.runnablesample', {
- getInstance: playgroundInstance => {
- instances.push(playgroundInstance)
- },
- theme: theme
- });
-}
-
-// We check if type is accessible from the current scope to determine if samples script is present
-// As an alternative we could extract this samples-specific script to new js file but then we would handle dark mode in 2 separate files which is not ideal
-const samplesAreEnabled = () => {
- try {
- KotlinPlayground
- return true
- } catch (e) {
- return false
- }
-}
-
-
-const initHidingLeftNavigation = () => {
- document.getElementById("menu-toggle").onclick = function (event) {
- //Events need to be prevented from bubbling since they will trigger next handler
- event.preventDefault();
- event.stopPropagation();
- event.stopImmediatePropagation();
- document.getElementById("leftColumn").classList.toggle("open");
- }
-
- document.getElementById("main").onclick = () => {
- document.getElementById("leftColumn").classList.remove("open");
- }
-}
-
-// Hash change is needed in order to allow for linking inside the same page with anchors
-// If this is not present user is forced to refresh the site in order to use an anchor
-window.onhashchange = handleAnchor
-
-function scrollToElementInContent(element) {
- const scrollToElement = () => document.getElementById('main').scrollTo({
- top: element.offsetTop - topNavbarOffset.offsetHeight,
- behavior: "smooth"
- })
-
- const waitAndScroll = () => {
- setTimeout(() => {
- if (topNavbarOffset) {
- scrollToElement()
- } else {
- waitForScroll()
- }
- }, 50)
- }
-
- if (topNavbarOffset) {
- scrollToElement()
- } else {
- waitAndScroll()
- }
-}
-
-
-function handleAnchor() {
- if (highlightedAnchor) {
- highlightedAnchor.classList.remove('anchor-highlight')
- highlightedAnchor = null;
- }
-
- let searchForContentTarget = function (element) {
- if (element && element.hasAttribute) {
- if (element.hasAttribute("data-togglable")) return element.getAttribute("data-togglable");
- else return searchForContentTarget(element.parentNode)
- } else return null
- }
-
- let findAnyTab = function (target) {
- let result = null
- document.querySelectorAll('div[tabs-section] > button[data-togglable]')
- .forEach(node => {
- if(node.getAttribute("data-togglable").split(",").includes(target)) {
- result = node
- }
- })
- return result
- }
-
- let anchor = window.location.hash
- if (anchor != "") {
- anchor = anchor.substring(1)
- let element = document.querySelector('a[data-name="' + anchor + '"]')
-
- if (element) {
- const content = element.nextElementSibling
- const contentStyle = window.getComputedStyle(content)
- if(contentStyle.display == 'none') {
- let tab = findAnyTab(searchForContentTarget(content))
- if (tab) {
- toggleSections(tab)
- }
- }
-
- if (content) {
- content.classList.add('anchor-highlight')
- highlightedAnchor = content
- }
-
- scrollToElementInContent(element)
- }
- }
-}
-
-function initTabs() {
- // we could have only a single type of data - classlike or package
- const mainContent = document.querySelector('.main-content');
- const type = mainContent ? mainContent.getAttribute("data-page-type") : null;
- const localStorageKey = "active-tab-" + type;
- document.querySelectorAll('div[tabs-section]').forEach(element => {
- showCorrespondingTabBody(element);
- element.addEventListener('click', ({target}) => {
- const togglable = target ? target.getAttribute("data-togglable") : null;
- if (!togglable) return;
-
- localStorage.setItem(localStorageKey, JSON.stringify(togglable));
- toggleSections(target);
- });
- });
-
- const cached = localStorage.getItem(localStorageKey);
- if (!cached) return;
-
- const tab = document.querySelector(
- 'div[tabs-section] > button[data-togglable="' + JSON.parse(cached) + '"]'
- );
- if (!tab) return;
-
- toggleSections(tab);
-}
-
-function showCorrespondingTabBody(element) {
- const buttonWithKey = element.querySelector("button[data-active]")
- if (buttonWithKey) {
- toggleSections(buttonWithKey)
- }
-}
-
-function filterButtonHandler(event) {
- if (event.target.tagName == "BUTTON" && event.target.hasAttribute("data-filter")) {
- let sourceset = event.target.getAttribute("data-filter")
- if (filteringContext.activeFilters.indexOf(sourceset) != -1) {
- filterSourceset(sourceset)
- } else {
- unfilterSourceset(sourceset)
- }
- }
-}
-
-function initializeFiltering() {
- filteringContext.dependencies = JSON.parse(sourceset_dependencies)
- document.querySelectorAll("#filter-section > button")
- .forEach(p => filteringContext.restrictedDependencies.push(p.getAttribute("data-filter")))
- Object.keys(filteringContext.dependencies).forEach(p => {
- filteringContext.dependencies[p] = filteringContext.dependencies[p]
- .filter(q => -1 !== filteringContext.restrictedDependencies.indexOf(q))
- })
- let cached = window.localStorage.getItem('inactive-filters')
- if (cached) {
- let parsed = JSON.parse(cached)
- filteringContext.activeFilters = filteringContext.restrictedDependencies
- .filter(q => parsed.indexOf(q) == -1)
- } else {
- filteringContext.activeFilters = filteringContext.restrictedDependencies
- }
- refreshFiltering()
-}
-
-function filterSourceset(sourceset) {
- filteringContext.activeFilters = filteringContext.activeFilters.filter(p => p != sourceset)
- refreshFiltering()
- addSourcesetFilterToCache(sourceset)
-}
-
-function unfilterSourceset(sourceset) {
- if (filteringContext.activeFilters.length == 0) {
- filteringContext.activeFilters = filteringContext.dependencies[sourceset].concat([sourceset])
- refreshFiltering()
- filteringContext.dependencies[sourceset].concat([sourceset]).forEach(p => removeSourcesetFilterFromCache(p))
- } else {
- filteringContext.activeFilters.push(sourceset)
- refreshFiltering()
- removeSourcesetFilterFromCache(sourceset)
- }
-
-}
-
-function addSourcesetFilterToCache(sourceset) {
- let cached = localStorage.getItem('inactive-filters')
- if (cached) {
- let parsed = JSON.parse(cached)
- localStorage.setItem('inactive-filters', JSON.stringify(parsed.concat([sourceset])))
- } else {
- localStorage.setItem('inactive-filters', JSON.stringify([sourceset]))
- }
-}
-
-function removeSourcesetFilterFromCache(sourceset) {
- let cached = localStorage.getItem('inactive-filters')
- if (cached) {
- let parsed = JSON.parse(cached)
- localStorage.setItem('inactive-filters', JSON.stringify(parsed.filter(p => p != sourceset)))
- }
-}
-
-function toggleSections(target) {
- const activateTabs = (containerClass) => {
- for (const element of document.getElementsByClassName(containerClass)) {
- for (const child of element.children) {
- if (child.getAttribute("data-togglable") === target.getAttribute("data-togglable")) {
- child.setAttribute("data-active", "")
- } else {
- child.removeAttribute("data-active")
- }
- }
- }
- }
- const toggleTargets = target.getAttribute("data-togglable").split(",")
- const activateTabsBody = (containerClass) => {
- document.querySelectorAll("." + containerClass + " *[data-togglable]")
- .forEach(child => {
- if (toggleTargets.includes(child.getAttribute("data-togglable"))) {
- child.setAttribute("data-active", "")
- } else if(!child.classList.contains("sourceset-dependent-content")) { // data-togglable is used to switch source set as well, ignore it
- child.removeAttribute("data-active")
- }
- })
- }
- activateTabs("tabs-section")
- activateTabsBody("tabs-section-body")
-}
-
-function togglePlatformDependent(e, container) {
- let target = e.target
- if (target.tagName != 'BUTTON') return;
- let index = target.getAttribute('data-toggle')
-
- for (let child of container.children) {
- if (child.hasAttribute('data-toggle-list')) {
- for (let bm of child.children) {
- if (bm == target) {
- bm.setAttribute('data-active', "")
- } else if (bm != target) {
- bm.removeAttribute('data-active')
- }
- }
- } else if (child.getAttribute('data-togglable') == index) {
- child.setAttribute('data-active', "")
- } else {
- child.removeAttribute('data-active')
- }
- }
-}
-
-function refreshFiltering() {
- let sourcesetList = filteringContext.activeFilters
- document.querySelectorAll("[data-filterable-set]")
- .forEach(
- elem => {
- let platformList = elem.getAttribute("data-filterable-set").split(',').filter(v => -1 !== sourcesetList.indexOf(v))
- elem.setAttribute("data-filterable-current", platformList.join(','))
- }
- )
- refreshFilterButtons()
- refreshPlatformTabs()
- refreshNoContentNotification()
- refreshPlaygroundSamples()
-}
-
-function refreshPlaygroundSamples() {
- document.querySelectorAll('code.runnablesample').forEach(node => {
- const playground = node.KotlinPlayground;
- /* Some samples may be hidden by filter, they have 0px height for visible code area
- * after rendering. Call this method for re-calculate code area height */
- playground && playground.view.codemirror.refresh();
- });
-}
-
-function refreshNoContentNotification() {
- const element = document.getElementsByClassName("main-content")[0]
- if(filteringContext.activeFilters.length === 0){
- element.style.display = "none";
-
- const appended = document.createElement("div")
- appended.className = "filtered-message"
- appended.innerText = "All documentation is filtered, please adjust your source set filters in top-right corner of the screen"
- sourcesetNotification = appended
- element.parentNode.prepend(appended)
- } else {
- if(sourcesetNotification) sourcesetNotification.remove()
- element.style.display = "block"
- }
-}
-
-function refreshPlatformTabs() {
- document.querySelectorAll(".platform-hinted > .platform-bookmarks-row").forEach(
- p => {
- let active = false;
- let firstAvailable = null
- p.childNodes.forEach(
- element => {
- if (element.getAttribute("data-filterable-current") != '') {
- if (firstAvailable == null) {
- firstAvailable = element
- }
- if (element.hasAttribute("data-active")) {
- active = true;
- }
- }
- }
- )
- if (active == false && firstAvailable) {
- firstAvailable.click()
- }
- }
- )
-}
-
-function refreshFilterButtons() {
- document.querySelectorAll("#filter-section > button")
- .forEach(f => {
- if (filteringContext.activeFilters.indexOf(f.getAttribute("data-filter")) != -1) {
- f.setAttribute("data-active", "")
- } else {
- f.removeAttribute("data-active")
- }
- })
-}
diff --git a/plugins/base/src/main/resources/dokka/scripts/prism.js b/plugins/base/src/main/resources/dokka/scripts/prism.js
deleted file mode 100644
index 07423626..00000000
--- a/plugins/base/src/main/resources/dokka/scripts/prism.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/* PrismJS 1.29.0
-https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+java+javadoc+javadoclike+kotlin&plugins=keep-markup */
-var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(n,t){var r,i;switch(t=t||{},a.util.type(n)){case"Object":if(i=a.util.objId(n),t[i])return t[i];for(var l in r={},t[i]=r,n)n.hasOwnProperty(l)&&(r[l]=e(n[l],t));return r;case"Array":return i=a.util.objId(n),t[i]?t[i]:(r=[],t[i]=r,n.forEach((function(n,a){r[a]=e(n,t)})),r);default:return n}},getLanguage:function(e){for(;e;){var t=n.exec(e.className);if(t)return t[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,t){e.className=e.className.replace(RegExp(n,"gi"),""),e.classList.add("language-"+t)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(r){var e=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(r.stack)||[])[1];if(e){var n=document.getElementsByTagName("script");for(var t in n)if(n[t].src==e)return n[t]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:r,plaintext:r,text:r,txt:r,extend:function(e,n){var t=a.util.clone(a.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(e,n,t,r){var i=(r=r||a.languages)[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in t)t.hasOwnProperty(s)&&(l[s]=t[s]);t.hasOwnProperty(o)||(l[o]=i[o])}var u=r[e];return r[e]=l,a.languages.DFS(a.languages,(function(n,t){t===u&&n!=e&&(this[n]=l)})),l},DFS:function e(n,t,r,i){i=i||{};var l=a.util.objId;for(var o in n)if(n.hasOwnProperty(o)){t.call(n,o,n[o],r||o);var s=n[o],u=a.util.type(s);"Object"!==u||i[l(s)]?"Array"!==u||i[l(s)]||(i[l(s)]=!0,e(s,t,o,i)):(i[l(s)]=!0,e(s,t,null,i))}}},plugins:{},highlightAll:function(e,n){a.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};a.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),a.hooks.run("before-all-elements-highlight",r);for(var i,l=0;i=r.elements[l++];)a.highlightElement(i,!0===n,r.callback)},highlightElement:function(n,t,r){var i=a.util.getLanguage(n),l=a.languages[i];a.util.setLanguage(n,i);var o=n.parentElement;o&&"pre"===o.nodeName.toLowerCase()&&a.util.setLanguage(o,i);var s={element:n,language:i,grammar:l,code:n.textContent};function u(e){s.highlightedCode=e,a.hooks.run("before-insert",s),s.element.innerHTML=s.highlightedCode,a.hooks.run("after-highlight",s),a.hooks.run("complete",s),r&&r.call(s.element)}if(a.hooks.run("before-sanity-check",s),(o=s.element.parentElement)&&"pre"===o.nodeName.toLowerCase()&&!o.hasAttribute("tabindex")&&o.setAttribute("tabindex","0"),!s.code)return a.hooks.run("complete",s),void(r&&r.call(s.element));if(a.hooks.run("before-highlight",s),s.grammar)if(t&&e.Worker){var c=new Worker(a.filename);c.onmessage=function(e){u(e.data)},c.postMessage(JSON.stringify({language:s.language,code:s.code,immediateClose:!0}))}else u(a.highlight(s.code,s.grammar,s.language));else u(a.util.encode(s.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};if(a.hooks.run("before-tokenize",r),!r.grammar)throw new Error('The language "'+r.language+'" has no grammar.');return r.tokens=a.tokenize(r.code,r.grammar),a.hooks.run("after-tokenize",r),i.stringify(a.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new s;return u(a,a.head,e),o(e,a,n,a.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=a.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=a.hooks.all[e];if(t&&t.length)for(var r,i=0;r=t[i++];)r(n)}},Token:i};function i(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function l(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function o(e,n,t,r,s,g){for(var f in t)if(t.hasOwnProperty(f)&&t[f]){var h=t[f];h=Array.isArray(h)?h:[h];for(var d=0;d<h.length;++d){if(g&&g.cause==f+","+d)return;var v=h[d],p=v.inside,m=!!v.lookbehind,y=!!v.greedy,k=v.alias;if(y&&!v.pattern.global){var x=v.pattern.toString().match(/[imsuy]*$/)[0];v.pattern=RegExp(v.pattern.source,x+"g")}for(var b=v.pattern||v,w=r.next,A=s;w!==n.tail&&!(g&&A>=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(j<O||"string"==typeof C.value);C=C.next)L++,j+=C.value.length;L--,E=e.slice(A,j),P.index-=A}else if(!(P=l(b,0,E,m)))continue;S=P.index;var N=P[0],_=E.slice(0,S),M=E.slice(S+N.length),W=A+E.length;g&&W>g.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;n.next=r,r.prev=n,e.length-=a}if(e.Prism=a,i.stringify=function e(n,t){if("string"==typeof n)return n;if(Array.isArray(n)){var r="";return n.forEach((function(n){r+=e(n,t)})),r}var i={type:n.type,content:e(n.content,t),tag:"span",classes:["token",n.type],attributes:{},language:t},l=n.alias;l&&(Array.isArray(l)?Array.prototype.push.apply(i.classes,l):i.classes.push(l)),a.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=" "+s+'="'+(i.attributes[s]||"").replace(/"/g,"&quot;")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+o+">"+i.content+"</"+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
-Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
-!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
-Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
-Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
-!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(/<keyword>/g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);
-!function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i<s;i++)o[i]instanceof RegExp&&(o[i]={pattern:o[i]}),n(o[i]);else n(o)}}(e,(function(a){a.inside||(a.inside={}),a.inside.rest=n}))}))}}),e.addSupport(["java","javascript","php"],e)}(Prism);
-!function(a){var e=/(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m,n="(?:\\b[a-zA-Z]\\w+\\s*\\.\\s*)*\\b[A-Z]\\w*(?:\\s*<mem>)?|<mem>".replace(/<mem>/g,(function(){return"#\\s*\\w+(?:\\s*\\([^()]*\\))?"}));a.languages.javadoc=a.languages.extend("javadoclike",{}),a.languages.insertBefore("javadoc","keyword",{reference:{pattern:RegExp("(@(?:exception|link|linkplain|see|throws|value)\\s+(?:\\*\\s*)?)(?:"+n+")"),lookbehind:!0,inside:{function:{pattern:/(#\s*)\w+(?=\s*\()/,lookbehind:!0},field:{pattern:/(#\s*)\w+/,lookbehind:!0},namespace:{pattern:/\b(?:[a-z]\w*\s*\.\s*)+/,inside:{punctuation:/\./}},"class-name":/\b[A-Z]\w*/,keyword:a.languages.java.keyword,punctuation:/[#()[\],.]/}},"class-name":{pattern:/(@param\s+)<[A-Z]\w*>/,lookbehind:!0,inside:{punctuation:/[.<>]/}},"code-section":[{pattern:/(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,lookbehind:!0,inside:{code:{pattern:e,lookbehind:!0,inside:a.languages.java,alias:"language-java"}}},{pattern:/(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism);
-!function(n){n.languages.kotlin=n.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete n.languages.kotlin["class-name"];var e={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:n.languages.kotlin}};n.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:e},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:e},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete n.languages.kotlin.string,n.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),n.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),n.languages.kt=n.languages.kotlin,n.languages.kts=n.languages.kotlin}(Prism);
-"undefined"!=typeof Prism&&"undefined"!=typeof document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",(function(e){if(e.element.children.length&&Prism.util.isActive(e.element,"keep-markup",!0)){var n=Prism.util.isActive(e.element,"drop-tokens",!1),t=0,o=[];r(e.element),o.length&&(e.keepMarkup=o)}function d(e){if(function(e){return!n||"span"!==e.nodeName.toLowerCase()||!e.classList.contains("token")}(e)){var d={element:e,posOpen:t};o.push(d),r(e),d.posClose=t}else r(e)}function r(e){for(var n=0,o=e.childNodes.length;n<o;n++){var r=e.childNodes[n];1===r.nodeType?d(r):3===r.nodeType&&(t+=r.data.length)}}})),Prism.hooks.add("after-highlight",(function(e){if(e.keepMarkup&&e.keepMarkup.length){var n=function(e,t){for(var o=0,d=e.childNodes.length;o<d;o++){var r=e.childNodes[o];if(1===r.nodeType){if(!n(r,t))return!1}else 3===r.nodeType&&(!t.nodeStart&&t.pos+r.data.length>t.node.posOpen&&(t.nodeStart=r,t.nodeStartPos=t.node.posOpen-t.pos),t.nodeStart&&t.pos+r.data.length>=t.node.posClose&&(t.nodeEnd=r,t.nodeEndPos=t.node.posClose-t.pos),t.pos+=r.data.length);if(t.nodeStart&&t.nodeEnd){var s=document.createRange();return s.setStart(t.nodeStart,t.nodeStartPos),s.setEnd(t.nodeEnd,t.nodeEndPos),t.node.element.innerHTML="",t.node.element.appendChild(s.extractContents()),s.insertNode(t.node.element),s.detach(),!1}}return!0};e.keepMarkup.forEach((function(t){n(e.element,{node:t,pos:0})})),e.highlightedCode=e.element.innerHTML}})));
-
-/*
- * This is NOT part of the prism.js main script, it's specific to Dokka.
- * Dokka generates <br> tags for new lines inside <pre> blocks and it works visually,
- * but it causes prism.js to incorrectly parse some tags (such as inline comments)
- *
- * This can be removed if there are no `<br>` tags inside `<pre>` anymore, but
- * if there still are - DO NOT remove this hook when upading prism.js to a newer version
- */
-Prism.hooks.add('before-sanity-check', function (env){env.element.innerHTML = env.element.innerHTML.replace(/<br>/g, '\n');env.code = env.element.textContent;});
diff --git a/plugins/base/src/main/resources/dokka/scripts/symbol-parameters-wrapper_deferred.js b/plugins/base/src/main/resources/dokka/scripts/symbol-parameters-wrapper_deferred.js
deleted file mode 100644
index 7ecae7a6..00000000
--- a/plugins/base/src/main/resources/dokka/scripts/symbol-parameters-wrapper_deferred.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// helps with some corner cases where <wbr> starts working already,
-// but the signature is not yet long enough to be wrapped
-(function() {
- const leftPaddingPx = 60;
-
- function createNbspIndent() {
- let indent = document.createElement("span");
- indent.append(document.createTextNode("\u00A0\u00A0\u00A0\u00A0"));
- indent.classList.add("nbsp-indent");
- return indent;
- }
-
- function wrapSymbolParameters(entry) {
- const symbol = entry.target;
- const symbolBlockWidth = entry.borderBoxSize && entry.borderBoxSize[0] && entry.borderBoxSize[0].inlineSize;
-
- // Even though the script is marked as `defer` and we wait for `DOMContentLoaded` event,
- // or if this block is a part of hidden tab, it can happen that `symbolBlockWidth` is 0,
- // indicating that something hasn't been loaded.
- // In this case, observer will be triggered onсe again when it will be ready.
- if (symbolBlockWidth > 0) {
- const node = symbol.querySelector(".parameters");
-
- if (node) {
- // if window resize happened and observer was triggered, reset previously wrapped
- // parameters as they might not need wrapping anymore, and check again
- node.classList.remove("wrapped");
- node.querySelectorAll(".parameter .nbsp-indent")
- .forEach(indent => indent.remove());
-
- const innerTextWidth = Array.from(symbol.children)
- .filter(it => !it.classList.contains("block")) // blocks are usually on their own (like annotations), so ignore it
- .map(it => it.getBoundingClientRect().width)
- .reduce((a, b) => a + b, 0);
-
- // if signature text takes up more than a single line, wrap params for readability
- if (innerTextWidth > (symbolBlockWidth - leftPaddingPx)) {
- node.classList.add("wrapped");
- node.querySelectorAll(".parameter").forEach(param => {
- // has to be a physical indent so that it can be copied. styles like
- // paddings and `::before { content: " " }` do not work for that
- param.prepend(createNbspIndent());
- });
- }
- }
- }
- }
-
- const symbolsObserver = new ResizeObserver(entries => entries.forEach(wrapSymbolParameters));
-
- function initHandlers() {
- document.querySelectorAll("div.symbol").forEach(symbol => symbolsObserver.observe(symbol));
- }
-
- if (document.readyState === 'loading') window.addEventListener('DOMContentLoaded', initHandlers);
- else initHandlers();
-
- // ToDo: Add `unobserve` if dokka will be SPA-like:
- // https://github.com/w3c/csswg-drafts/issues/5155
-})();
diff --git a/plugins/base/src/main/resources/dokka/styles/font-jb-sans-auto.css b/plugins/base/src/main/resources/dokka/styles/font-jb-sans-auto.css
deleted file mode 100644
index bdc68723..00000000
--- a/plugins/base/src/main/resources/dokka/styles/font-jb-sans-auto.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-/* Light weight */
-@font-face {
- font-family: 'JetBrains Sans';
- src: url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans-Light.woff2') format('woff2'), url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans-Light.woff') format('woff');
- font-weight: 300;
- font-style: normal;
-}
-/* Regular weight */
-@font-face {
- font-family: 'JetBrains Sans';
- src: url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans-Regular.woff2') format('woff2'), url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans-Regular.woff') format('woff');
- font-weight: 400;
- font-style: normal;
-}
-/* SemiBold weight */
-@font-face {
- font-family: 'JetBrains Sans';
- src: url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans-SemiBold.woff2') format('woff2'), url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans-SemiBold.woff') format('woff');
- font-weight: 600;
- font-style: normal;
-}
-
-@supports (font-variation-settings: normal) {
- @font-face {
- font-family: 'JetBrains Sans';
- src: url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans.woff2') format('woff2 supports variations'),
- url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans.woff2') format('woff2-variations'),
- url('https://resources.jetbrains.com/storage/jetbrains-sans/JetBrainsSans.woff') format('woff-variations');
- font-weight: 100 900;
- font-style: normal;
- }
-}
diff --git a/plugins/base/src/main/resources/dokka/styles/logo-styles.css b/plugins/base/src/main/resources/dokka/styles/logo-styles.css
deleted file mode 100644
index 69804e46..00000000
--- a/plugins/base/src/main/resources/dokka/styles/logo-styles.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-:root {
- --dokka-logo-image-url: url('../images/logo-icon.svg');
- --dokka-logo-height: 50px;
- --dokka-logo-width: 50px;
-}
diff --git a/plugins/base/src/main/resources/dokka/styles/prism.css b/plugins/base/src/main/resources/dokka/styles/prism.css
deleted file mode 100644
index 2d3a091e..00000000
--- a/plugins/base/src/main/resources/dokka/styles/prism.css
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-/*
- * Custom Dokka styles
- */
-code .token {
- white-space: pre;
-}
-
-/**
- * Styles based on webhelp's prism.js styles
- * Changes:
- * - Since webhelp's styles are in .pcss, they use nesting which is not achievable in native CSS
- * so nested css blocks have been unrolled (like dark theme).
- * - Webhelp uses "Custom Class" prism.js plugin, so all of their prism classes are prefixed with "--prism".
- * Dokka doesn't seem to need this plugin at the moment, so all "--prism" prefixes have been removed.
- * - Removed all styles related to `pre` and `code` tags. Kotlinlang's resulting styles are so spread out and complicated
- * that it's difficult to gather in one place. Instead use code styles defined in the main Dokka styles,
- * which at the moment looks fairly similar.
- *
- * Based on prism.js default theme
- * Based on dabblet (http://dabblet.com)
- * @author Lea Verou
- */
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: #8c8c8c;
-}
-
-.token.punctuation {
- color: #999;
-}
-
-.token.namespace {
- opacity: 0.7;
-}
-
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol,
-.token.deleted {
- color: #871094;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
- color: #067d17;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string {
- color: #9a6e3a;
- /* This background color was intended by the author of this theme. */
- background: hsla(0, 0%, 100%, 0.5);
-}
-
-.token.atrule,
-.token.attr-value,
-.token.keyword {
- font-size: inherit; /* to override .keyword */
- color: #0033b3;
-}
-
-.token.function {
- color: #00627a;
-}
-
-.token.class-name {
- color: #000000;
-}
-
-.token.regex,
-.token.important,
-.token.variable {
- color: #871094;
-}
-
-.token.important,
-.token.bold {
- font-weight: bold;
-}
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
-
-.token.operator {
- background: none;
-}
-
-/*
- * DARK THEME
- */
-:root.theme-dark .token.comment,
-:root.theme-dark .token.prolog,
-:root.theme-dark .token.cdata {
- color: #808080;
-}
-
-:root.theme-dark .token.delimiter,
-:root.theme-dark .token.boolean,
-:root.theme-dark .token.keyword,
-:root.theme-dark .token.selector,
-:root.theme-dark .token.important,
-:root.theme-dark .token.atrule {
- color: #cc7832;
-}
-
-:root.theme-dark .token.operator,
-:root.theme-dark .token.punctuation,
-:root.theme-dark .token.attr-name {
- color: #a9b7c6;
-}
-
-:root.theme-dark .token.tag,
-:root.theme-dark .token.tag .punctuation,
-:root.theme-dark .token.doctype,
-:root.theme-dark .token.builtin {
- color: #e8bf6a;
-}
-
-:root.theme-dark .token.entity,
-:root.theme-dark .token.number,
-:root.theme-dark .token.symbol {
- color: #6897bb;
-}
-
-:root.theme-dark .token.property,
-:root.theme-dark .token.constant,
-:root.theme-dark .token.variable {
- color: #9876aa;
-}
-
-:root.theme-dark .token.string,
-:root.theme-dark .token.char {
- color: #6a8759;
-}
-
-:root.theme-dark .token.attr-value,
-:root.theme-dark .token.attr-value .punctuation {
- color: #a5c261;
-}
-
-:root.theme-dark .token.attr-value .punctuation:first-child {
- color: #a9b7c6;
-}
-
-:root.theme-dark .token.url {
- text-decoration: underline;
-
- color: #287bde;
- background: transparent;
-}
-
-:root.theme-dark .token.function {
- color: #ffc66d;
-}
-
-:root.theme-dark .token.regex {
- background: #364135;
-}
-
-:root.theme-dark .token.deleted {
- background: #484a4a;
-}
-
-:root.theme-dark .token.inserted {
- background: #294436;
-}
-
-:root.theme-dark .token.class-name {
- color: #a9b7c6;
-}
-
-:root.theme-dark .token.function {
- color: #ffc66d;
-}
-
-:root.theme-darkcode .language-css .token.property,
-:root.theme-darkcode .language-css,
-:root.theme-dark .token.property + .token.punctuation {
- color: #a9b7c6;
-}
-
-code.language-css .token.id {
- color: #ffc66d;
-}
-
-:root.theme-dark code.language-css .token.selector > .token.class,
-:root.theme-dark code.language-css .token.selector > .token.attribute,
-:root.theme-dark code.language-css .token.selector > .token.pseudo-class,
-:root.theme-dark code.language-css .token.selector > .token.pseudo-element {
- color: #ffc66d;
-}
-
-:root.theme-dark .language-plaintext .token {
- /* plaintext code should be colored as article text */
- color: inherit !important;
-}
diff --git a/plugins/base/src/main/resources/dokka/styles/style.css b/plugins/base/src/main/resources/dokka/styles/style.css
deleted file mode 100644
index 62b0ddbd..00000000
--- a/plugins/base/src/main/resources/dokka/styles/style.css
+++ /dev/null
@@ -1,1513 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-@import url('./font-jb-sans-auto.css');
-@import url('https://fonts.googleapis.com/css?family=JetBrains+Mono');
-
-/* --- root styles --- */
-:root {
- --default-gray: #f4f4f4;
- --default-font-color: black;
- --header-font-color: var(--default-font-color);
-
- --breadcrumb-font-color: #637282;
- --breadcrumb-margin: 24px;
- --hover-link-color: #5B5DEF;
-
- --footer-height: 64px;
- --footer-padding-top: 48px;
- --footer-background: var(--default-gray);
- --footer-font-color: var(--average-color);
- --footer-go-to-top-color: white;
-
- --horizontal-spacing-for-content: 16px;
- --bottom-spacing: 16px;
- --color-scrollbar: rgba(39, 40, 44, 0.40);
- --color-scrollbar-track: var(--default-gray);
- --default-white: #fff;
- --background-color: var(--default-white);
- --dark-mode-and-search-icon-color: var(--default-white);
- --color-dark: #27282c;
- --default-font-family: JetBrains Sans, Inter, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI,Roboto, Oxygen, Ubuntu,Cantarell, Droid Sans, Helvetica Neue, Arial, sans-serif;
- --default-monospace-font-family: JetBrains Mono, SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace;
- --default-font-size: 15px;
- --average-color: var(--color-dark);
- --brief-color: var(--average-color);
- --copy-icon-color: rgba(39, 40, 44, .7);
- --copy-icon-hover-color: var(--color-dark);
- --code-background: rgba(39, 40, 44, .05);
- --border-color: rgba(39, 40, 44, .2);
- --navigation-highlight-color: rgba(39, 40, 44, 0.05);
- --top-navigation-height: 73px;
- --max-width: 1160px;
- --white-10: hsla(0, 0%, 100%, .1);
-
- --active-tab-border-color: #7F52FF;
- --inactive-tab-border-color: rgba(164, 164, 170, 0.7);
-
- --active-section-color: #7F52FF;
- --inactive-section-color: rgba(25, 25, 28, .7);
-
- --sidebar-width: 280px;
- --sidemenu-section-active-color: #7F52FF;
-}
-
-html {
- height: 100%;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- scrollbar-color: rgba(39, 40, 44, 0.40) #F4F4F4;
- scrollbar-color: var(--color-scrollbar) var(--color-scrollbar-track);
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- color: var(--default-font-color);
-}
-
-html ::-webkit-scrollbar {
- width: 8px;
- height: 8px;
-}
-
-html ::-webkit-scrollbar-track {
- background-color: var(--color-scrollbar-track);
-}
-
-html ::-webkit-scrollbar-thumb {
- width: 8px;
- border-radius: 6px;
- background: rgba(39, 40, 44, 0.40);
- background: var(--color-scrollbar);
-}
-
-html, body {
- margin: 0;
- padding: 0;
- height: 100%;
- width: 100%;
-}
-/* /--- root styles --- */
-
-/* --- global tags styles --- */
-body, table {
- background: var(--background-color);
- font-family: var(--default-font-family);
- font-style: normal;
- font-weight: normal;
- font-size: var(--default-font-size);
- line-height: 1.6;
- margin: 0;
-}
-
-h1 {
- font-size: 40px;
- line-height: 48px;
- letter-spacing: -1px;
-}
-
-h2 {
- font-size: 31px;
- line-height: 40px;
- letter-spacing: -0.5px;
-}
-
-h3 {
- font-size: 20px;
- line-height: 28px;
- letter-spacing: -0.2px;
-}
-
-p, ul, ol, table, pre, dl {
- margin: 0;
-}
-
-a {
- text-decoration: none;
-}
-
-u {
- text-decoration: none;
- padding-bottom: 2px;
- border-bottom: 1px solid var(--border-color);
-}
-
-blockquote {
- border-left: 1ch solid var(--default-gray);
- margin: 0;
- padding-left: 1ch;
- font-style: italic;
- color: var(--average-color);
-}
-
-.theme-dark blockquote {
- color: var(--default-font-color);
- border-left-color: var(--code-background);
-}
-
-pre {
- display: block;
-}
-
-dt {
- color: #444;
- font-weight: 530;
-}
-
-img {
- max-width: 100%;
-}
-
-small {
- font-size: 11px;
-}
-
-table {
- width: 100%;
- border-collapse: collapse;
- padding: 5px;
-}
-
-th, td {
- padding: 12px 10px 11px;
- text-align: left;
- vertical-align: top;
-}
-
-tbody > tr {
- min-height: 56px;
-}
-
-td:first-child {
- width: 20vw;
-}
-/* /--- global tags styles --- */
-
-/* --- utils classes --- */
-.w-100 {
- width: 100%;
-}
-
-.no-gutters {
- margin: 0;
- padding: 0;
-}
-
-.d-flex {
- display: flex;
-}
-
-.floating-right {
- float: right;
-}
-
-.pull-right {
- float: right;
- margin-left: auto
-}
-
-.clearfix::after {
- display: block;
- content: '';
- clear: both;
- height: 0;
-}
-/* /--- utils classes --- */
-
-/* ---dark theme --- */
-.theme-dark {
- --background-color: #27282c;
- --color-dark: #3d3d41;
- --default-font-color: hsla(0, 0%, 100%, 0.8);
- --border-color: hsla(0, 0%, 100%, 0.2);
- --code-background: hsla(0, 0%, 100%, 0.05);
- --breadcrumb-font-color: #8c8c8e;
- --brief-color: hsla(0, 0%, 100%, 0.4);
- --copy-icon-color: hsla(0, 0%, 100%, 0.6);
- --copy-icon-hover-color: #fff;
-
- --active-tab-border-color: var(--default-font-color);
- --inactive-tab-border-color: hsla(0, 0%, 100%, 0.4);
-
- --active-section-color: var(--default-font-color);
- --inactive-section-color: hsla(0, 0%, 100%, 0.4);
-
- --navigation-highlight-color: rgba(255, 255, 255, 0.05);
- --footer-background: hsla(0, 0%, 100%, 0.05);
- --footer-font-color: hsla(0, 0%, 100%, 0.6);
- --footer-go-to-top-color: var(--footer-font-color);
-
- --sidemenu-section-active-color: var(--color-dark);
-}
-/* /---dark theme --- */
-
-.root {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
-/* --- Navigation styles --- */
-.navigation {
- display: flex;
- justify-content: space-between;
-
- color: #fff;
- background-color: var(--color-dark);
- font-family: var(--default-font-family);
- letter-spacing: -0.1px;
-
- /* Reset margin and use padding for border */
- margin-left: 0;
- margin-right: 0;
- padding: 10px var(--horizontal-spacing-for-content);
-
- z-index: 4;
-}
-
-.navigation--inner {
- display: flex;
- flex-wrap: wrap;
- justify-content: space-between;
- flex: 1 1 auto;
-}
-
-.navigation--inner, .navigation-title {
- min-height: 40px;
-}
-
-.navigation-title, .filter-section {
- align-items: center;
-}
-
-.navigation-title {
- display: flex;
- align-items: center;
-}
-
-/* --- Navigation MENU --- */
-.menu-toggle {
- color: var(--background-color);
- line-height: 0;
- font-size: 0;
- text-indent: -9999px;
-
- background: transparent;
- border: none;
- padding: 0;
- margin-right: 16px;
- outline: none;
-
- transition: margin .2s ease-out;
- z-index: 5;
-}
-
-@media (min-width: 760px) {
- .menu-toggle {
- display: none;
- }
-}
-
-.menu-toggle::before {
- display: block;
- content: '';
- background: url('../images/burger.svg') no-repeat center;
- height: 28px;
- width: 28px;
-}
-/* /--- Navigation MENU --- */
-
-.library-version {
- position: relative;
- top: -4px;
- margin-left: 3px;
-
- color: rgba(255,255,255,.7);
- font-size: 13px;
- font-weight: normal;
- line-height: 16px;
-}
-
-.filter-section {
- z-index: 0;
-}
-
-.no-js .filter-section {
- display: none;
-}
-
-@media (min-width: 760px) {
- .filter-section {
- padding: 5px 0 5px;
- }
-}
-/* --- Navigation controls --- */
-.navigation-controls {
- display: flex;
- margin-left: 4px;
-}
-
-@media (min-width: 760px) {
- .navigation-controls {
- align-items: center;
- }
-}
-
-.no-js .navigation-controls {
- display: none;
-}
-
-/* --- Navigation THEME --- */
-.navigation-controls--search {
- display: inline-flex;
- font-size: 0;
- line-height: 0;
-}
-
-.navigation-controls--theme {
- display: block;
- border-radius: 50%;
- background-color: inherit;
- padding: 0;
- border: none;
- cursor: pointer;
- font-size: 0;
- line-height: 0;
-}
-
-.navigation-controls--theme::before {
- height: 40px;
- width: 40px;
-}
-
-.navigation-controls--theme:hover {
- background: var(--white-10);
-}
-
-.navigation-controls--theme::before {
- display: block;
- content: url("../images/theme-toggle.svg");
-}
-
-@media (max-width: 759px) {
- .navigation-controls--theme {
- display: none;
- }
-}
-/* /--- Navigation THEME --- */
-
-/* --- Navigation HOMEPAGE --- */
-.navigation-controls--homepage {
- height: 40px;
- width: 40px;
- display: block;
- border-radius: 50%;
- cursor: pointer;
-}
-
-.navigation-controls--homepage a::before {
- height: 100%;
- width: 20px;
- margin-left: 10px;
- display: block;
- content: "";
- background: url("../images/homepage.svg");
- background-size: 100% 100%;
-}
-
-.navigation-controls--homepage:hover {
- background: var(--white-10);
-}
-
-@media (max-width: 759px) {
- .navigation-controls--homepage {
- display: none;
- }
-}
-/* /--- Navigation HOMEPAGE --- */
-
-.navigation .platform-selector:not([data-active]) {
- color: #fff;
-}
-/* /--- Navigation controls --- */
-/* /--- Navigation styles --- */
-
-/* --- Layout styles --- */
-
-#container {
- display: flex;
- flex: 1 1 auto;
- min-height: 0; /* full height exclude header */
-}
-
-#container > .sidebar, #container > #main {
- overflow: auto;
-}
-
-#main {
- display: flex;
- flex-direction: column;
- flex: 1 1 0; /* full width, but no affects for sidebar */
-}
-
-.sidebar {
- display: flex;
- flex-direction: column;
- box-sizing: border-box;
- border-right: 1px solid var(--border-color);
- width: var(--sidebar-width);
-}
-
-.no-js .sidebar {
- display: none;
-}
-
-@media (max-width: 759px) {
- #container {
- position: relative;
- }
-
- .sidebar {
- position: absolute;
- top: 0;
- bottom: 0;
- box-sizing: border-box;
- background: var(--background-color);
- margin-left: calc(-1 * var(--sidebar-width));
- transition: margin .2s ease-out;
- z-index: 4;
- }
-
- .sidebar.open {
- margin-left: 0;
- }
-
- .sidebar.open ~ #main .navigation-controls--search {
- display: none;
- }
-
- .sidebar.open ~ #main .menu-toggle {
- margin-left: var(--sidebar-width);
- }
-}
-
-.sidebar--inner {
- font-size: 12px;
- font-weight: 400;
- line-height: 16px;
- padding-top: 22px;
- padding-bottom: 16px;
-}
-/* /--- Layout styles --- */
-
-/* --- Main Content styles --- */
-.main-content {
- padding-bottom: var(--bottom-spacing);
- margin-left: auto;
- margin-right: auto;
- max-width: var(--max-width);
- width: 100%;
- z-index: 0;
-}
-
-.main-content > * {
- margin-left: var(--horizontal-spacing-for-content);
- margin-right: var(--horizontal-spacing-for-content);
-}
-
-.main-content .content > hr {
- margin: 30px 0;
- border-top: 3px double #8c8b8b;
-}
-
-.main-content :is(h1, h2) {
- font-weight: 530;
-}
-/* /--- Main Content styles --- */
-
-/* /--- Breadcrumbs styles --- */
-.breadcrumbs, .breadcrumbs a, .breadcrumbs a:hover {
- margin-top: var(--breadcrumb-margin);
- color: var(--breadcrumb-font-color);
- overflow-wrap: break-word;
-}
-
-.breadcrumbs .delimiter {
- margin: auto 2px;
-}
-
-.breadcrumbs .current {
- color: var(--default-font-color);
-}
-/* /--- Breadcrumbs styles --- */
-
-.tabs-section,
-.platform-hinted > .platform-bookmarks-row {
- margin-left: -8px;
- margin-right: -8px;
-}
-
-.section-tab,
-.platform-hinted > .platform-bookmarks-row > .platform-bookmark {
- border: 0;
- padding: 11px 3px;
- margin: 0 8px;
- cursor: pointer;
- outline: none;
- font-size: var(--default-font-size);
- background-color: transparent;
- color: var(--inactive-section-color);
- border-bottom: 1px solid var(--inactive-tab-border-color);
-}
-
-.platform-hinted > .platform-bookmarks-row {
- margin-bottom: 16px;
-}
-
-.no-js .platform-bookmarks-row + .sourceset-dependent-content {
- margin-top: 8px;
-}
-
-.no-js .platform-bookmarks-row + .sourceset-dependent-content:last-of-type {
- margin-top: 0;
-}
-
-.section-tab:hover {
- color: var(--default-font-color);
- border-bottom: 2px solid var(--default-font-color);
-}
-
-.section-tab[data-active=''] {
- color: var(--active-section-color);
- border-bottom: 2px solid var(--active-tab-border-color);
-}
-
-.tabs-section-body > div {
- margin-top: 12px;
-}
-
-.tabs-section-body .with-platform-tabs {
- padding-top: 12px;
- padding-bottom: 12px;
-}
-
-.cover > .platform-hinted {
- padding-bottom: 12px;
-}
-
-.cover {
- display: flex;
- flex-direction: column;
-}
-
-.cover .platform-hinted.with-platform-tabs .sourceset-dependent-content > .block ~ .symbol {
- padding-top: 16px;
- padding-left: 0;
-}
-
-.cover .sourceset-dependent-content > .block {
- padding: 16px 0;
- font-size: 18px;
- line-height: 28px;
-}
-
-.cover .platform-hinted.with-platform-tabs .sourceset-dependent-content > .block {
- padding: 0;
- font-size: var(--default-font-size);
-}
-
-.cover ~ .divergent-group {
- margin-top: 24px;
- padding: 24px 8px 8px 8px;
-}
-
-.cover ~ .divergent-group .main-subrow .symbol {
- width: 100%;
-}
-
-.main-content p.paragraph,
-.sample-container, blockquote,
-.content > .symbol {
- margin-top: 8px;
-}
-
-blockquote,
-.content > .symbol:first-of-type,
-p.paragraph:first-child,
-.brief p.paragraph {
- margin-top: 0;
-}
-
-.content .kdoc-tag > p.paragraph {
- margin-top: 0;
-}
-
-.content h4 {
- margin-bottom: 0;
-}
-
-.divergent-group {
- background-color: var(--background-color);
- padding: 16px 0 8px 0;
- margin-bottom: 2px;
-}
-
-.divergent-group .table-row, tbody > tr {
- border-bottom: 1px solid var(--border-color);
-}
-
-.divergent-group .table-row:last-of-type, tbody > tr:last-of-type {
- border-bottom: none;
-}
-
-.title > .divergent-group:first-of-type {
- padding-top: 0;
-}
-
-.sample-container, div.CodeMirror {
- position: relative;
- display: flex;
- flex-direction: column;
-}
-
-code.paragraph {
- display: block;
-}
-
-.overview > .navButton {
- position: absolute;
- align-items: center;
- display: flex;
- justify-content: flex-end;
- padding: 2px 2px 2px 0;
- margin-right: 5px;
- cursor: pointer;
-}
-
-.strikethrough {
- text-decoration: line-through;
-}
-
-.symbol:empty {
- padding: 0;
-}
-
-.symbol:not(.token), code {
- background-color: var(--code-background);
- align-items: center;
- box-sizing: border-box;
- white-space: pre-wrap;
- font-family: var(--default-monospace-font-family);
- font-size: var(--default-font-size);
-}
-
-.symbol:not(.token), code.block {
- display: block;
- padding: 12px 32px 12px 12px;
- border-radius: 8px;
- line-height: 24px;
- position: relative;
-}
-
-code {
- overflow-x: auto;
- max-width: 100%;
-}
-
-code:not(.block) {
- display: inline-block;
- vertical-align: middle;
-}
-
-.symbol > a {
- color: var(--hover-link-color);
-}
-
-.copy-icon {
- cursor: pointer;
-}
-
-.sample-container span.copy-icon {
- display: none;
-}
-
-.js .sample-container:hover span.copy-icon {
- display: inline-block;
-}
-
-.sample-container span.copy-icon::before {
- width: 24px;
- height: 24px;
- display: inline-block;
- content: '';
- /* masks are required if you want to change color of the icon dynamically instead of using those provided with the SVG */
- -webkit-mask: url("../images/copy-icon.svg") no-repeat 50% 50%;
- mask: url("../images/copy-icon.svg") no-repeat 50% 50%;
- -webkit-mask-size: cover;
- mask-size: cover;
- background-color: var(--copy-icon-color);
-}
-
-.sample-container span.copy-icon:hover::before {
- background-color: var(--copy-icon-hover-color);
-}
-
-.copy-popup-wrapper {
- display: none;
- align-items: center;
- position: absolute;
- z-index: 1000;
- background: var(--background-color);
- font-weight: normal;
- font-family: var(--default-font-family);
- width: max-content;
- font-size: var(--default-font-size);
- cursor: default;
- border: 1px solid #D8DCE1;
- box-sizing: border-box;
- box-shadow: 0 5px 10px var(--ring-popup-shadow-color);
- border-radius: 3px;
- color: var(--default-font-color);
-}
-
-.copy-popup-wrapper > .copy-popup-icon::before {
- content: url("../images/copy-successful-icon.svg");
- padding: 8px;
-}
-
-.copy-popup-wrapper > .copy-popup-icon {
- position: relative;
- top: 3px;
-}
-
-.copy-popup-wrapper.popup-to-left {
- /* since it is in position absolute we can just move it to the left to make it always appear on the left side of the icon */
- left: -15em;
-}
-
-.table-row:hover .copy-popup-wrapper.active-popup,
-.sample-container:hover .copy-popup-wrapper.active-popup {
- display: flex !important;
-}
-
-.copy-popup-wrapper:hover {
- font-weight: normal;
-}
-
-.copy-popup-wrapper > span:last-child {
- padding-right: 14px;
-}
-
-.symbol .top-right-position, .sample-container .top-right-position {
- /* it is important for a parent to have a position: relative */
- position: absolute;
- top: 8px;
- right: 8px;
-}
-
-.sideMenuPart > .overview {
- display: flex;
- align-items: center;
- position: relative;
- user-select: none; /* there's a weird bug with text selection */
- padding: 8px 0;
-}
-
-.sideMenuPart a {
- display: block;
- align-items: center;
- color: var(--default-font-color);
- overflow: hidden;
- padding-left: 23px;
-}
-
-.sideMenuPart a:hover {
- text-decoration: none;
- color: var(--default-font-color);
-}
-
-.sideMenuPart > .overview:before {
- box-sizing: border-box;
- content: '';
- top: 0;
- width: var(--sidebar-width);
- right: 0;
- bottom: 0;
- position: absolute;
- z-index: -1;
-}
-
-.overview:hover:before {
- background-color: var(--navigation-highlight-color);
-}
-
-#nav-submenu {
- padding-left: 24px;
-}
-
-.sideMenuPart {
- padding-left: 12px;
- box-sizing: border-box;
-}
-
-.sideMenuPart.hidden > .overview .navButtonContent::before {
- transform: rotate(0deg);
-}
-
-.sideMenuPart > .overview .navButtonContent::before {
- content: '';
-
- -webkit-mask: url("../images/arrow_down.svg") no-repeat 50% 50%;
- mask: url("../images/arrow_down.svg") no-repeat 50% 50%;
- -webkit-mask-size: cover;
- mask-size: cover;
- background-color: var(--default-font-color);
-
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- transform: rotate(90deg);
- width: 16px;
- height: 16px;
-}
-
-.sideMenuPart[data-active] > .overview .navButtonContent::before {
- background-color: var(--default-white);
-}
-
-.sideMenuPart.hidden > .navButton .navButtonContent::after {
- content: '\02192';
-}
-
-.sideMenuPart.hidden > .sideMenuPart {
- display: none;
-}
-
-.overview .nav-link-grid {
- display: grid;
- grid-template-columns: 16px auto; /* first is the icon, then name */
- grid-gap: 6px;
- align-items: center;
-}
-
-.nav-icon {
- width: 16px;
- height: 16px;
-}
-
-.nav-icon.class::before {
- content: url("../images/nav-icons/class.svg");
-}
-
-.nav-icon.class-kt::before {
- content: url("../images/nav-icons/class-kotlin.svg");
-}
-
-.nav-icon.function::before {
- content: url("../images/nav-icons/function.svg");
-}
-
-.nav-icon.enum-class::before {
- content: url("../images/nav-icons/enum.svg");
-}
-
-.nav-icon.enum-class-kt::before {
- content: url("../images/nav-icons/enum-kotlin.svg");
-}
-
-.nav-icon.annotation-class::before {
- content: url("../images/nav-icons/annotation.svg");
-}
-
-.nav-icon.annotation-class-kt::before {
- content: url("../images/nav-icons/annotation-kotlin.svg");
-}
-
-.nav-icon.abstract-class::before {
- content: url("../images/nav-icons/abstract-class.svg");
-}
-
-.nav-icon.abstract-class-kt::before {
- content: url("../images/nav-icons/abstract-class-kotlin.svg");
-}
-
-.nav-icon.exception-class::before {
- content: url("../images/nav-icons/exception-class.svg");
-}
-
-.nav-icon.interface::before {
- content: url("../images/nav-icons/interface.svg");
-}
-
-.nav-icon.interface-kt::before {
- content: url("../images/nav-icons/interface-kotlin.svg");
-}
-
-.nav-icon.object::before {
- content: url("../images/nav-icons/object.svg");
-}
-
-.nav-icon.typealias-kt::before {
- content: url("../images/nav-icons/typealias-kotlin.svg");
-}
-
-.nav-icon.val::before {
- content: url("../images/nav-icons/field-value.svg");
-}
-
-.nav-icon.var::before {
- content: url("../images/nav-icons/field-variable.svg");
-}
-
-.filtered > a, .filtered > .navButton {
- display: none;
-}
-
-
-.brief {
- white-space: pre-wrap;
- overflow: hidden;
-}
-
-h1.cover {
- font-size: 52px;
- line-height: 56px;
- letter-spacing: -1.5px;
- margin-bottom: 0;
- padding-bottom: 32px;
- display: block;
-}
-
-@media (max-width: 1119px) {
- h1.cover {
- font-size: 48px;
- line-height: 48px;
- padding-bottom: 8px;
- }
-}
-
-@media (max-width: 759px) {
- h1.cover {
- font-size: 32px;
- line-height: 32px;
- }
-}
-
-.UnderCoverText {
- font-size: 16px;
- line-height: 28px;
-}
-
-.UnderCoverText code {
- font-size: inherit;
-}
-
-.UnderCoverText table {
- margin: 8px 0 8px 0;
- word-break: break-word;
-}
-
-@media (max-width: 960px) {
- .UnderCoverText table {
- display: block;
- word-break: normal;
- overflow: auto;
- }
-}
-
-.main-content a:not([data-name]) {
- padding-bottom: 2px;
- border-bottom: 1px solid var(--border-color);
- cursor: pointer;
- text-decoration: none;
- color: inherit;
- font-size: inherit;
- line-height: inherit;
- transition: color .1s, border-color .1s;
-}
-
-.main-content a:hover {
- border-bottom-color: unset;
- color: inherit
-}
-
-a small {
- font-size: 11px;
- margin-top: -0.6em;
- display: block;
-}
-
-p.paragraph img {
- display: block;
-}
-
-.deprecation-content {
- margin: 20px 10px;
- border:1px solid var(--border-color);
- padding: 13px 15px 16px 15px;
-}
-
-.deprecation-content > h3 {
- margin-top: 0;
- margin-bottom: 0;
-}
-
-.deprecation-content > h4 {
- font-size: 16px;
- margin-top: 15px;
- margin-bottom: 0;
-}
-
-.deprecation-content code.block {
- padding: 5px 10px;
- display: inline-block;
-}
-
-.deprecation-content .footnote {
- margin-left: 25px;
- font-size: 13px;
- font-weight: bold;
- display: block;
-}
-
-.deprecation-content .footnote > p {
- margin: 0;
-}
-
-[data-filterable-current=''] {
- display: none !important;
-}
-
-.platform-tags, .filter-section {
- display: flex;
- flex-wrap: wrap;
- margin-bottom: -8px;
- margin-left: -4px;
-}
-
-.platform-tag {
- --platform-tag-color: #bababb;
- border: 0 none;
- margin-right: 4px;
- margin-bottom: 8px;
-
- font-family: var(--default-font-family);
- font-size: 13px;
- line-height: 1.5;
- text-transform: capitalize;
-}
-
-.platform-tag.js-like, .platform-tag.jvm-like, .platform-tag.wasm-like {
- text-transform: uppercase;
-}
-
-.filter-section .platform-tag {
- cursor: pointer;
- border-radius: 4px;
- padding: 2px 16px;
-}
-
-.filter-section .platform-tag.jvm-like[data-active], .platform-tags .platform-tag.jvm-like {
- --platform-tag-color: #4dbb5f;
-}
-
-.filter-section .platform-tag.js-like[data-active], .platform-tags .platform-tag.js-like {
- --platform-tag-color: #ffc700;
-}
-
-.filter-section .platform-tag.native-like[data-active], .platform-tags .platform-tag.native-like {
- --platform-tag-color: #E082F3;
-}
-
-.filter-section .platform-tag.wasm-like[data-active], .platform-tags .platform-tag.wasm-like {
- --platform-tag-color: #9585F9;
-}
-
-.filter-section .platform-tag[data-active]:hover {
- color: #fff;
- background-color: rgba(186, 186, 187, .7);
-}
-
-.filter-section .platform-tag:not([data-active]) {
- color: #fff;
- /* Safari doesn't work correctly for `outline` with `border-radius` */
- /* outline: 1px solid rgba(255,255,255,.6); */
- /* ...use `box-shadow` instead: */
- box-shadow: 0 0 0 1px rgb(255 255 255 / 60%);
- background-color: rgba(255,255,255,.05);
-}
-
-.filter-section .platform-tag[data-active] {
- color: #19191c;
- background-color: var(--platform-tag-color);
-}
-
-.platform-tags .platform-tag {
- display: flex;
- align-items: center;
-}
-
-.platform-tags .platform-tag::before {
- display: inline-block;
- content: '';
- border-radius: 50%;
- background: var(--platform-tag-color);
- margin: 0 4px 0 8px;
- height: 8px;
- width: 8px;
-
- font-size: 13px;
- line-height: 1.6;
-}
-
-td.content {
- padding-left: 24px;
- padding-top: 16px;
- display: flex;
- flex-direction: column;
-}
-
-.main-subrow {
- display: flex;
- flex-direction: row;
- padding: 0;
- flex-wrap: wrap;
-}
-
-.main-subrow > div {
- margin-bottom: 8px;
-}
-
-.main-subrow > div > span {
- display: flex;
- position: relative;
-}
-
-.js .main-subrow:hover .anchor-icon {
- opacity: 1;
- transition: 0.2s;
-}
-
-.main-subrow .anchor-icon {
- opacity: 0;
- transition: 0.2s 0.5s;
-}
-
-.main-subrow .anchor-icon::before {
- content: url("../images/anchor-copy-button.svg");
-}
-
-.main-subrow .anchor-icon:hover {
- cursor: pointer;
-}
-
-.main-subrow .anchor-icon:hover > svg path {
- fill: var(--hover-link-color);
-}
-
-@media (hover: none) {
- .main-subrow .anchor-icon {
- display: none;
- }
-}
-
-.main-subrow .anchor-wrapper {
- position: relative;
- width: 24px;
- height: 16px;
- margin-left: 3px;
-}
-
-.inline-flex {
- display: inline-flex;
-}
-
-.platform-hinted {
- flex: auto;
- display: block;
-}
-
-.platform-hinted > .platform-bookmarks-row > .platform-bookmark {
- min-width: 64px;
- background: inherit;
- flex: none;
- order: 5;
- align-self: flex-start;
-}
-
-.platform-hinted > .platform-bookmarks-row > .platform-bookmark:hover {
- color: var(--default-font-color);
- border-bottom: 2px solid var(--default-font-color);
-}
-
-.platform-hinted > .platform-bookmarks-row > .platform-bookmark[data-active=''] {
- border-bottom: 2px solid var(--active-tab-border-color);
- color: var(--active-section-color);
-}
-
-.no-js .platform-bookmarks-row, .no-js .tabs-section {
- display: none;
-}
-
-.js .platform-hinted > .content:not([data-active]),
-.js .tabs-section-body *[data-togglable]:not([data-active]) {
- display: none;
-}
-
-/* Work around an issue: https://github.com/JetBrains/kotlin-playground/issues/91
-Applies for main description blocks with platform tabs.
-Just in case of possible performance degradation it excluding tabs with briefs on classlike page */
-#content > div:not(.tabbedcontent) .sourceset-dependent-content:not([data-active]) {
- display: block !important;
- visibility: hidden;
- height: 0;
- position: fixed;
- top: 0;
-}
-
-.with-platform-tags {
- display: flex;
-}
-
-.with-platform-tags ~ .main-subrow {
- padding-top: 8px;
-}
-
-.cover .with-platform-tabs {
- font-size: var(--default-font-size);
-}
-
-.cover > .with-platform-tabs > .content {
- padding: 8px 16px;
- border: 1px solid var(--border-color);
-}
-
-.cover > .block {
- padding-top: 48px;
- padding-bottom: 24px;
- font-size: 18px;
- line-height: 28px;
-}
-
-.cover > .block:empty {
- padding-bottom: 0;
-}
-
-.parameters.wrapped > .parameter {
- display: block;
-}
-
-.table-row .inline-comment {
- padding-top: 8px;
- padding-bottom: 8px;
-}
-
-.table-row .platform-hinted .sourceset-dependent-content .brief,
-.table-row .platform-hinted .sourceset-dependent-content .inline-comment {
- padding: 8px;
-}
-
-.sideMenuPart[data-active] > .overview:before {
- background: var(--sidemenu-section-active-color);
-}
-
-.sideMenuPart[data-active] > .overview > a {
- color: var(--default-white);
-}
-
-.table {
- display: flex;
- flex-direction: column;
-}
-
-.table-row {
- display: flex;
- flex-direction: column;
- border-bottom: 1px solid var(--border-color);
- padding: 11px 0 12px 0;
- background-color: var(--background-color);
-}
-
-.table-row:last-of-type {
- border-bottom: none;
-}
-
-.table-row .brief-comment {
- color: var(--brief-color);
-}
-
-.platform-dependent-row {
- display: grid;
- padding-top: 8px;
-}
-
-.title-row {
- display: grid;
- grid-template-columns: auto auto 7em;
- width: 100%;
-}
-
-@media print, (min-width: 960px) {
- .title-row {
- grid-template-columns: 20% auto 7em;
- }
-}
-
-.keyValue {
- display: grid;
- grid-gap: 8px;
-}
-
-@media print, (min-width: 960px) {
- .keyValue {
- grid-template-columns: 20% 80%;
- }
- .keyValue > div:first-child {
- word-break: break-word;
- }
-}
-
-@media print, (max-width: 960px) {
- div.wrapper {
- width: auto;
- margin: 0;
- }
-
- header, section, footer {
- float: none;
- position: static;
- width: auto;
- }
-
- header {
- padding-right: 320px;
- }
-
- section {
- border: 1px solid #e5e5e5;
- border-width: 1px 0;
- padding: 20px 0;
- margin: 0 0 20px;
- }
-
- header a small {
- display: inline;
- }
-
- header ul {
- position: absolute;
- right: 50px;
- top: 52px;
- }
-}
-
-.anchor-highlight {
- border: 1px solid var(--hover-link-color) !important;
- box-shadow: 0 0 0 0.2em #c8e1ff;
- margin-top: 0.2em;
- margin-bottom: 0.2em;
-}
-
-.filtered-message {
- margin: 25px;
- font-size: 20px;
- font-weight: bolder;
-}
-
-div.runnablesample {
- height: fit-content;
-}
-
-/* --- footer --- */
-.footer {
- clear: both;
- display: flex;
- align-items: center;
- position: relative;
- min-height: var(--footer-height);
- font-size: 12px;
- line-height: 16px;
- letter-spacing: 0.2px;
- color: var(--footer-font-color);
- margin-top: auto;
- background-color: var(--footer-background);
-}
-
-.footer span.go-to-top-icon {
- border-radius: 2em;
- padding: 11px 10px !important;
- background-color: var(--footer-go-to-top-color);
-}
-
-.footer span.go-to-top-icon > a::before {
- content: url("../images/go-to-top-icon.svg");
-}
-
-.footer > span:first-child {
- margin-left: var(--horizontal-spacing-for-content);
- padding-left: 0;
-}
-
-.footer > span:last-child {
- margin-right: var(--horizontal-spacing-for-content);
- padding-right: 0;
-}
-
-.footer > span {
- padding: 0 16px;
-}
-
-.footer a {
- color: var(--breadcrumb-font-color);
-}
-
-.footer span.go-to-top-icon > #go-to-top-link {
- padding: 0;
- border: none;
-}
-
-.footer .padded-icon {
- padding-left: 0.5em;
-}
-
-.footer .padded-icon::before {
- content: url("../images/footer-go-to-link.svg");
-}
-/* /--- footer --- */
-
-/* Logo styles */
-:root {
- --dokka-logo-image-url: url('../images/logo-icon.svg');
- --dokka-logo-height: 50px;
- --dokka-logo-width: 50px;
-}
-
-.library-name--link {
- display: flex;
- align-items: center;
- color: #fff;
- font-weight: 530;
-}
-
-.library-name--link::before {
- content: '';
- background: var(--dokka-logo-image-url) center no-repeat;
- background-size: var(--dokka-logo-height) var(--dokka-logo-width);
- margin-right: 5px;
- width: var(--dokka-logo-height);
- height: var(--dokka-logo-width);
-}
-
-@media (max-width: 759px) {
- .library-name--link::before {
- display: none;
- }
-}
-/* / Logo styles */
-
-/*
-the hack to hide the headers inside tabs for a package page because each tab
-has only one header, and the header text is the same as the tab name, so no point in showing it
-*/
-.main-content[data-page-type="package"] .tabs-section-body h2 {
- display: none;
-}
diff --git a/plugins/base/src/main/resources/dokka/templates/base.ftl b/plugins/base/src/main/resources/dokka/templates/base.ftl
deleted file mode 100644
index 0311f9f8..00000000
--- a/plugins/base/src/main/resources/dokka/templates/base.ftl
+++ /dev/null
@@ -1,44 +0,0 @@
-<#import "includes/page_metadata.ftl" as page_metadata>
-<#import "includes/header.ftl" as header>
-<#import "includes/footer.ftl" as footer>
-<!DOCTYPE html>
-<html class="no-js">
-<head>
- <meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8">
- <@page_metadata.display/>
- <@template_cmd name="pathToRoot"><script>var pathToRoot = "${pathToRoot}";</script></@template_cmd>
- <script>document.documentElement.classList.replace("no-js","js");</script>
- <#-- This script doesn't need to be there but it is nice to have
- since app in dark mode doesn't 'blink' (class is added before it is rendered) -->
- <script>const storage = localStorage.getItem("dokka-dark-mode")
- if (storage == null) {
- const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
- if (osDarkSchemePreferred === true) {
- document.getElementsByTagName("html")[0].classList.add("theme-dark")
- }
- } else {
- const savedDarkMode = JSON.parse(storage)
- if(savedDarkMode === true) {
- document.getElementsByTagName("html")[0].classList.add("theme-dark")
- }
- }
- </script>
- <#-- Resources (scripts, stylesheets) are handled by Dokka.
- Use customStyleSheets and customAssets to change them. -->
- <@resources/>
-</head>
-<body>
- <div class="root">
- <@header.display/>
- <div id="container">
- <div class="sidebar" id="leftColumn">
- <div class="sidebar--inner" id="sideMenu"></div>
- </div>
- <div id="main">
- <@content/>
- <@footer.display/>
- </div>
- </div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/plugins/base/src/main/resources/dokka/templates/includes/footer.ftl b/plugins/base/src/main/resources/dokka/templates/includes/footer.ftl
deleted file mode 100644
index 461a8162..00000000
--- a/plugins/base/src/main/resources/dokka/templates/includes/footer.ftl
+++ /dev/null
@@ -1,7 +0,0 @@
-<#macro display>
- <div class="footer">
- <span class="go-to-top-icon"><a href="#content" id="go-to-top-link"></a></span><span>${footerMessage}</span><span
- class="pull-right"><span>Generated by </span><a
- href="https://github.com/Kotlin/dokka"><span>dokka</span><span class="padded-icon"></span></a></span>
- </div>
-</#macro> \ No newline at end of file
diff --git a/plugins/base/src/main/resources/dokka/templates/includes/header.ftl b/plugins/base/src/main/resources/dokka/templates/includes/header.ftl
deleted file mode 100644
index d399e633..00000000
--- a/plugins/base/src/main/resources/dokka/templates/includes/header.ftl
+++ /dev/null
@@ -1,31 +0,0 @@
-<#import "source_set_selector.ftl" as source_set_selector>
-<#macro display>
-<nav class="navigation" id="navigation-wrapper">
- <div class="navigation--inner">
- <div class="navigation-title">
- <button class="menu-toggle" id="menu-toggle" type="button">toggle menu</button>
- <div class="library-name">
- <@template_cmd name="pathToRoot">
- <a class="library-name--link" href="${pathToRoot}index.html">
- <@template_cmd name="projectName">
- ${projectName}
- </@template_cmd>
- </a>
- </@template_cmd>
- </div>
- <div class="library-version">
- <#-- This can be handled by the versioning plugin -->
- <@version/>
- </div>
- </div>
- <@source_set_selector.display/>
- </div>
- <div class="navigation-controls">
- <#if homepageLink?has_content>
- <div class="navigation-controls--btn navigation-controls--homepage" id="homepage-link" role="button"><a href="${homepageLink}"></a></div>
- </#if>
- <button class="navigation-controls--btn navigation-controls--theme" id="theme-toggle-button" type="button">switch theme</button>
- <div class="navigation-controls--btn navigation-controls--search" id="searchBar" role="button">search in API</div>
- </div>
-</nav>
-</#macro>
diff --git a/plugins/base/src/main/resources/dokka/templates/includes/page_metadata.ftl b/plugins/base/src/main/resources/dokka/templates/includes/page_metadata.ftl
deleted file mode 100644
index 7cab4582..00000000
--- a/plugins/base/src/main/resources/dokka/templates/includes/page_metadata.ftl
+++ /dev/null
@@ -1,6 +0,0 @@
-<#macro display>
- <title>${pageName}</title>
- <@template_cmd name="pathToRoot">
- <link href="${pathToRoot}images/logo-icon.svg" rel="icon" type="image/svg">
- </@template_cmd>
-</#macro>
diff --git a/plugins/base/src/main/resources/dokka/templates/includes/source_set_selector.ftl b/plugins/base/src/main/resources/dokka/templates/includes/source_set_selector.ftl
deleted file mode 100644
index 2d848071..00000000
--- a/plugins/base/src/main/resources/dokka/templates/includes/source_set_selector.ftl
+++ /dev/null
@@ -1,9 +0,0 @@
-<#macro display>
- <#if sourceSets?has_content>
- <div class="filter-section" id="filter-section">
- <#list sourceSets as ss>
- <button class="platform-tag platform-selector ${ss.platform}-like" data-active="" data-filter="${ss.filter}">${ss.name}</button>
- </#list>
- </div>
- </#if>
-</#macro>
diff --git a/plugins/base/src/test/kotlin/basic/AbortGracefullyOnMissingDocumentablesTest.kt b/plugins/base/src/test/kotlin/basic/AbortGracefullyOnMissingDocumentablesTest.kt
deleted file mode 100644
index 693174ec..00000000
--- a/plugins/base/src/test/kotlin/basic/AbortGracefullyOnMissingDocumentablesTest.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package basic
-
-import org.jetbrains.dokka.DokkaGenerator
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class AbortGracefullyOnMissingDocumentablesTest: BaseAbstractTest() {
- @Test
- fun `Generation aborts Gracefully with no Documentables`() {
- DokkaGenerator(dokkaConfiguration { }, logger).generate()
-
- assertTrue(
- logger.progressMessages.any { message -> "Exiting Generation: Nothing to document" == message },
- "Expected graceful exit message. Found: ${logger.progressMessages}"
- )
- }
-}
diff --git a/plugins/base/src/test/kotlin/basic/DRITest.kt b/plugins/base/src/test/kotlin/basic/DRITest.kt
deleted file mode 100644
index 6fd9d4b0..00000000
--- a/plugins/base/src/test/kotlin/basic/DRITest.kt
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package basic
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.*
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.Nullable
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.MemberPageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class DRITest : BaseAbstractTest() {
- @Test
- fun issue634() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package toplevel
- |
- |inline fun <T, R : Comparable<R>> Array<out T>.mySortBy(
- | crossinline selector: (T) -> R?): Array<out T> = TODO()
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val expected = TypeConstructor(
- "kotlin.Function1", listOf(
- TypeParam(listOf(Nullable(TypeConstructor("kotlin.Any", emptyList())))),
- Nullable(TypeParam(listOf(TypeConstructor("kotlin.Comparable", listOf(RecursiveType(0))))))
- )
- )
- val actual = module.packages.single()
- .functions.single()
- .dri.callable?.params?.single()
- assertEquals(expected, actual)
- }
- }
- }
-
- @Test
- fun issue634WithImmediateNullableSelf() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package toplevel
- |
- |fun <T : Comparable<T>> Array<T>.doSomething(t: T?): Array<T> = TODO()
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val expected = Nullable(TypeParam(listOf(TypeConstructor("kotlin.Comparable", listOf(RecursiveType(0))))))
- val actual = module.packages.single()
- .functions.single()
- .dri.callable?.params?.single()
- assertEquals(expected, actual)
- }
- }
- }
-
- @Test
- fun issue634WithGenericNullableReceiver() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package toplevel
- |
- |fun <T : Comparable<T>> T?.doSomethingWithNullable() = TODO()
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val expected = Nullable(TypeParam(listOf(TypeConstructor("kotlin.Comparable", listOf(RecursiveType(0))))))
- val actual = module.packages.single()
- .functions.single()
- .dri.callable?.receiver
- assertEquals(expected, actual)
- }
- }
- }
-
- @Test
- fun issue642WithStarAndAny() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- analysisPlatform = "js"
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |
- |open class Bar<Z>
- |class ReBarBar : Bar<StringBuilder>()
- |class Foo<out T : Comparable<*>, R : List<Bar<*>>>
- |
- |fun <T : Comparable<Any?>> Foo<T, *>.qux(): String = TODO()
- |fun <T : Comparable<*>> Foo<T, *>.qux(): String = TODO()
- |
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = { module ->
- // DRI(//qux/Foo[TypeParam(bounds=[kotlin.Comparable[kotlin.Any?]]),*]#/PointingToFunctionOrClasslike/)
- val expectedDRI = DRI(
- "",
- null,
- Callable(
- "qux", TypeConstructor(
- "Foo", listOf(
- TypeParam(
- listOf(
- TypeConstructor(
- "kotlin.Comparable", listOf(
- Nullable(TypeConstructor("kotlin.Any", emptyList()))
- )
- )
- )
- ),
- StarProjection
- )
- ),
- emptyList()
- )
- )
-
- val driCount = module
- .withDescendants()
- .filterIsInstance<ContentPage>()
- .sumBy { it.dri.count { dri -> dri == expectedDRI } }
-
- assertEquals(1, driCount)
- }
- }
- }
-
- @Test
- fun driForGenericClass(){
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- |class Sample<S>(first: S){ }
- |
- |
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = { module ->
- val sampleClass = module.dfs { it.name == "Sample" } as ClasslikePageNode
- val classDocumentable = sampleClass.documentables.firstOrNull() as DClass
-
- assertEquals( "example/Sample///PointingToDeclaration/", sampleClass.dri.first().toString())
- assertEquals("example/Sample///PointingToGenericParameters(0)/", classDocumentable.generics.first().dri.toString())
- }
- }
- }
-
- @Test
- fun driForGenericFunction(){
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- |class Sample<S>(first: S){
- | fun <T> genericFun(param1: String): Tuple<S,T> = TODO()
- |}
- |
- |
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = { module ->
- val sampleClass = module.dfs { it.name == "Sample" } as ClasslikePageNode
- val functionNode = sampleClass.children.first { it.name == "genericFun" } as MemberPageNode
- val functionDocumentable = functionNode.documentables.firstOrNull() as DFunction
- val parameter = functionDocumentable.parameters.first()
-
- assertEquals("example/Sample/genericFun/#kotlin.String/PointingToDeclaration/", functionNode.dri.first().toString())
-
- assertEquals(1, functionDocumentable.parameters.size)
- assertEquals("example/Sample/genericFun/#kotlin.String/PointingToCallableParameters(0)/", parameter.dri.toString())
- //1 since from the function's perspective there is only 1 new generic declared
- //The other one is 'inherited' from class
- assertEquals( 1, functionDocumentable.generics.size)
- assertEquals( "T", functionDocumentable.generics.first().name)
- assertEquals( "example/Sample/genericFun/#kotlin.String/PointingToGenericParameters(0)/", functionDocumentable.generics.first().dri.toString())
- }
- }
- }
-
- @Test
- fun driForFunctionNestedInsideInnerClass() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- |class Sample<S>(first: S){
- | inner class SampleInner {
- | fun foo(): S = TODO()
- | }
- |}
- |
- |
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = { module ->
- val sampleClass = module.dfs { it.name == "Sample" } as ClasslikePageNode
- val sampleInner = sampleClass.children.first { it.name == "SampleInner" } as ClasslikePageNode
- val foo = sampleInner.children.first { it.name == "foo" } as MemberPageNode
- val documentable = foo.documentables.firstOrNull() as DFunction
-
- val generics = (sampleClass.documentables.firstOrNull() as WithGenerics).generics
- assertEquals(generics.first().dri.toString(), (documentable.type as TypeParameter).dri.toString())
- assertEquals(0, documentable.generics.size)
- }
- }
- }
-
- @Test
- fun driForGenericExtensionFunction(){
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- | fun <T> List<T>.extensionFunction(): String = ""
- |
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = { module ->
- val extensionFunction = module.dfs { it.name == "extensionFunction" } as MemberPageNode
- val documentable = extensionFunction.documentables.firstOrNull() as DFunction
-
- assertEquals(
- "example//extensionFunction/kotlin.collections.List[TypeParam(bounds=[kotlin.Any?])]#/PointingToDeclaration/",
- extensionFunction.dri.first().toString()
- )
- assertEquals(1, documentable.generics.size)
- assertEquals("T", documentable.generics.first().name)
- assertEquals(
- "example//extensionFunction/kotlin.collections.List[TypeParam(bounds=[kotlin.Any?])]#/PointingToGenericParameters(0)/",
- documentable.generics.first().dri.toString()
- )
-
- }
- }
- }
-
- @Test
- fun `deep recursive typebound #1342`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- | fun <T, S, R> recursiveBound(t: T, s: S, r: R) where T: List<S>, S: List<R>, R: List<S> = Unit
- |
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.dfs { it.name == "recursiveBound" }
- assertEquals(
- "example//recursiveBound/#TypeParam(bounds=[kotlin.collections.List[TypeParam(bounds=[kotlin.collections.List[TypeParam(bounds=[kotlin.collections.List[^^]])]])]])#TypeParam(bounds=[kotlin.collections.List[TypeParam(bounds=[kotlin.collections.List[^]])]])#TypeParam(bounds=[kotlin.collections.List[TypeParam(bounds=[kotlin.collections.List[^]])]])/PointingToDeclaration/",
- function?.dri?.toString(),
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt b/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt
deleted file mode 100644
index 2b353ad8..00000000
--- a/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package basic
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.ModulePageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class DokkaBasicTests : BaseAbstractTest() {
-
- @Test
- fun basic1() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package basic
- |
- |class Test {
- | val tI = 1
- | fun tF() = 2
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = {
- val root = it as ModulePageNode
- assertEquals(3, root.getClasslikeToMemberMap().filterKeys { it.name == "Test" }.entries.firstOrNull()?.value?.size)
- }
- }
- }
-
- private fun ModulePageNode.getClasslikeToMemberMap() =
- this.parentMap.filterValues { it is ClasslikePageNode }.entries.groupBy({ it.value }) { it.key }
-}
diff --git a/plugins/base/src/test/kotlin/basic/FailOnWarningTest.kt b/plugins/base/src/test/kotlin/basic/FailOnWarningTest.kt
deleted file mode 100644
index ebdf7860..00000000
--- a/plugins/base/src/test/kotlin/basic/FailOnWarningTest.kt
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package basic
-
-import org.jetbrains.dokka.DokkaException
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.testApi.logger.TestLogger
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-import kotlin.test.Test
-import kotlin.test.assertFailsWith
-
-class FailOnWarningTest : BaseAbstractTest() {
-
- @Test
- fun `throws exception if one or more warnings were emitted`() {
- val configuration = dokkaConfiguration {
- failOnWarning = true
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- assertFailsWith<DokkaException> {
- testInline(
- """
- |/src/main/kotlin/Bar.kt
- |package sample
- |class Bar {}
- """.trimIndent(), configuration
- ) {
- pluginsSetupStage = {
- logger.warn("Warning!")
- }
- }
- }
- }
-
- @Test
- fun `throws exception if one or more error were emitted`() {
- val configuration = dokkaConfiguration {
- failOnWarning = true
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- assertFailsWith<DokkaException> {
- testInline(
- """
- |/src/main/kotlin/Bar.kt
- |package sample
- |class Bar {}
- """.trimIndent(), configuration
- ) {
- pluginsSetupStage = {
- logger.error("Error!")
- }
- }
- }
- }
-
- @Test
- fun `does not throw if now warning or error was emitted`() {
-
- val configuration = dokkaConfiguration {
- failOnWarning = true
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
-
- testInline(
- """
- |/src/main/kotlin/Bar.kt
- |package sample
- |class Bar {}
- """.trimIndent(),
- configuration,
- loggerForTest = TestLogger(ZeroErrorOrWarningCountDokkaLogger())
- ) {
- /* We expect no Exception */
- }
- }
-
- @Test
- fun `does not throw if disabled`() {
- val configuration = dokkaConfiguration {
- failOnWarning = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
-
- testInline(
- """
- |/src/main/kotlin/Bar.kt
- |package sample
- |class Bar {}
- """.trimIndent(), configuration
- ) {
- pluginsSetupStage = {
- logger.warn("Error!")
- logger.error("Error!")
- }
- }
- }
-}
-
-private class ZeroErrorOrWarningCountDokkaLogger(
- logger: DokkaLogger = DokkaConsoleLogger(LoggingLevel.DEBUG)
-) : DokkaLogger by logger {
- override var warningsCount: Int = 0
- override var errorsCount: Int = 0
-}
diff --git a/plugins/base/src/test/kotlin/basic/LoggerTest.kt b/plugins/base/src/test/kotlin/basic/LoggerTest.kt
deleted file mode 100644
index 12c39690..00000000
--- a/plugins/base/src/test/kotlin/basic/LoggerTest.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package basic
-
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-import org.jetbrains.dokka.utilities.MessageEmitter
-import kotlin.test.Test
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-
-class LoggerTest {
- class AccumulatingEmitter : MessageEmitter {
- val messages: MutableList<String> = mutableListOf()
- override fun invoke(message: String) {
- messages.add(message)
- }
- }
-
- @Test
- fun `should display info messages if logging is info`(){
- val emitter = AccumulatingEmitter()
- val logger = DokkaConsoleLogger(LoggingLevel.INFO, emitter)
-
- logger.debug("Debug!")
- logger.info("Info!")
-
- assertTrue(emitter.messages.size > 0)
- assertTrue(emitter.messages.any { it == "Info!" })
- assertFalse(emitter.messages.any { it == "Debug!" })
- }
-
- @Test
- fun `should not display info messages if logging is warn`(){
- val emitter = AccumulatingEmitter()
- val logger = DokkaConsoleLogger(LoggingLevel.WARN, emitter)
-
- logger.warn("Warning!")
- logger.info("Info!")
-
-
- assertTrue(emitter.messages.size > 0)
- assertFalse(emitter.messages.any { it.contains("Info!") })
- assertTrue(emitter.messages.any { it.contains("Warning!") })
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/ContentInDescriptionTest.kt b/plugins/base/src/test/kotlin/content/ContentInDescriptionTest.kt
deleted file mode 100644
index a278795d..00000000
--- a/plugins/base/src/test/kotlin/content/ContentInDescriptionTest.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.doc.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class ContentInDescriptionTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- val expectedDescription = Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("Hello World! Docs with period issue, e.g."),
- Text(String(Character.toChars(160)), params = mapOf("content-type" to "html")),
- Text("this.")
- )
- )
- ),
- params = emptyMap(),
- name = "MARKDOWN_FILE"
- )
- )
-
- @Test
- fun `nbsp is handled as code in kotlin`() {
- testInline(
- """
- |/src/main/kotlin/sample/ParentKt.kt
- |package sample;
- |/**
- | * Hello World! Docs with period issue, e.g.&nbsp;this.
- | */
- |public class ParentKt {
- |}
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = {
- val classlike = it.packages.flatMap { it.classlikes }.find { it.name == "ParentKt" }
-
- assertTrue(classlike != null)
- assertEquals(expectedDescription, classlike.documentation.values.first().children.first())
- }
- }
- }
-
- @Test
- fun `nbsp is handled as code in java`() {
- testInline(
- """
- |/src/main/kotlin/sample/Parent.java
- |package sample;
- |/**
- | * Hello World! Docs with period issue, e.g.&nbsp;this.
- | */
- |public class Parent {
- |}
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = {
- val classlike = it.packages.flatMap { it.classlikes }.find { it.name == "Parent" }
-
- assertTrue(classlike != null)
- assertEquals(expectedDescription, classlike.documentation.values.first().children.first())
- }
- }
- }
-
- @Test
- fun `same documentation in java and kotlin when nbsp is present`() {
- testInline(
- """
- |/src/main/kotlin/sample/Parent.java
- |package sample;
- |/**
- | * Hello World! Docs with period issue, e.g.&nbsp;this.
- | */
- |public class Parent {
- |}
- |
- |/src/main/kotlin/sample/ParentKt.kt
- |package sample;
- |/**
- | * Hello World! Docs with period issue, e.g.&nbsp;this.
- | */
- |public class ParentKt {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val java = module.packages.flatMap { it.classlikes }.first { it.name == "Parent" }
- val kotlin = module.packages.flatMap { it.classlikes }.first { it.name == "ParentKt" }
-
- assertEquals(java.documentation.values.first(), kotlin.documentation.values.first())
- }
- }
- }
-
- @Test
- fun `text surrounded by angle brackets is not removed`() {
- testInline(
- """
- |/src/main/kotlin/sample/Foo.kt
- |package sample
- |/**
- | * My example `CodeInline<Bar>`
- | * ```
- | * CodeBlock<Bar>
- | * ```
- | */
- |class Foo {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val cls = module.packages.flatMap { it.classlikes }.first { it.name == "Foo" }
- val documentation = cls.documentation.values.first()
- val docTags = documentation.children.single().root.children
-
- assertEquals("CodeInline<Bar>", ((docTags[0].children[1] as CodeInline).children.first() as Text).body)
- assertEquals("CodeBlock<Bar>", ((docTags[1] as CodeBlock).children.first() as Text).body)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/HighlightingTest.kt b/plugins/base/src/test/kotlin/content/HighlightingTest.kt
deleted file mode 100644
index a7fb2bde..00000000
--- a/plugins/base/src/test/kotlin/content/HighlightingTest.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.*
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class HighlightingTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(commonStdlibPath!!, jvmStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- @Test
- fun `open suspend fun`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | open suspend fun simpleFun(): String = "Celebrimbor"
- """,
- configuration
- ) {
- pagesTransformationStage = { module ->
- val symbol = (module.dfs { it.name == "simpleFun" } as MemberPageNode).content
- .dfs { it is ContentGroup && it.dci.kind == ContentKind.Symbol }
- val children = symbol?.children
-
- for (it in listOf(
- Pair(0, TokenStyle.Keyword), Pair(1, TokenStyle.Keyword), Pair(2, TokenStyle.Keyword),
- Pair(4, TokenStyle.Punctuation), Pair(5, TokenStyle.Punctuation), Pair(6, TokenStyle.Operator)
- ))
- assertTrue(children?.get(it.first)?.style?.contains(it.second) == true)
- assertTrue(children?.get(3)?.children?.first()?.style?.contains(TokenStyle.Function) == true)
- }
- }
- }
-
- @Test
- fun `plain typealias of plain class with annotation`() {
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |@MustBeDocumented
- |@Target(AnnotationTarget.TYPEALIAS)
- |annotation class SomeAnnotation
- |
- |@SomeAnnotation
- |typealias PlainTypealias = Int
- |
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = { module ->
- val symbol = (module.dfs { it.name == "example" } as PackagePageNode).content
- .dfs { it is ContentGroup && it.dci.kind == ContentKind.Symbol }
- val children = symbol?.children
-
- for (it in listOf(
- Pair(1, TokenStyle.Keyword), Pair(3, TokenStyle.Operator)
- ))
- assertTrue(children?.get(it.first)?.style?.contains(it.second) == true)
- val annotation = children?.first()?.children?.first()
-
- assertTrue(annotation?.children?.get(0)?.style?.contains(TokenStyle.Annotation) == true)
- assertTrue(annotation?.children?.get(1)?.children?.first()?.style?.contains(TokenStyle.Annotation) == true)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt b/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt
deleted file mode 100644
index 7293b53c..00000000
--- a/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.annotations
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.base.utils.firstNotNullOfOrNull
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.ContentText
-import org.jetbrains.dokka.pages.MemberPageNode
-import org.jetbrains.dokka.pages.PackagePageNode
-import utils.ParamAttributes
-import utils.assertNotNull
-import utils.bareSignature
-import utils.propertySignature
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-
-class ContentForAnnotationsTest : BaseAbstractTest() {
-
-
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `function with documented annotation`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
- | AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FIELD
- |)
- |@Retention(AnnotationRetention.SOURCE)
- |@MustBeDocumented
- |annotation class Fancy
- |
- |
- |@Fancy
- |fun function(@Fancy abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- mapOf("Fancy" to emptySet()),
- "",
- "",
- emptySet(),
- "function",
- "String",
- "abc" to ParamAttributes(mapOf("Fancy" to emptySet()), emptySet(), "String")
- )
- }
- }
- }
-
- }
- }
- }
- }
-
- @Test
- fun `function with undocumented annotation`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION,
- | AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FIELD
- |)
- |@Retention(AnnotationRetention.SOURCE)
- |annotation class Fancy
- |
- |@Fancy
- |fun function(@Fancy abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
-
- }
- }
- }
- }
-
- @Test
- fun `property with undocumented annotation`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@Suppress
- |val property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(emptyMap(), "", "", emptySet(), "val", "property", "Int", "6")
- }
- }
- }
- }
-
- @Test
- fun `property with documented annotation`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@MustBeDocumented
- |annotation class Fancy
- |
- |@Fancy
- |val property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(mapOf("Fancy" to emptySet()), "", "", emptySet(), "val", "property", "Int", "6")
- }
- }
- }
- }
-
-
- @Test
- fun `rich documented annotation`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@MustBeDocumented
- |@Retention(AnnotationRetention.SOURCE)
- |@Target(AnnotationTarget.PROPERTY)
- |annotation class BugReport(
- | val assignedTo: String = "[none]",
- | val testCase: KClass<ABC> = ABC::class,
- | val status: Status = Status.UNCONFIRMED,
- | val ref: Reference = Reference(value = 1),
- | val reportedBy: Array<Reference>,
- | val showStopper: Boolean = false
- | val previousReport: BugReport?
- |) {
- | enum class Status {
- | UNCONFIRMED, CONFIRMED, FIXED, NOTABUG
- | }
- | class ABC
- |}
- |annotation class Reference(val value: Long)
- |annotation class ReferenceReal(val value: Double)
- |
- |
- |@BugReport(
- | assignedTo = "me",
- | testCase = BugReport.ABC::class,
- | status = BugReport.Status.FIXED,
- | ref = Reference(value = 2u),
- | reportedBy = [Reference(value = 2UL), Reference(value = 4L),
- | ReferenceReal(value = 4.9), ReferenceReal(value = 2f)],
- | showStopper = true,
- | previousReport = null
- |)
- |val ltint: Int = 5
- """.trimIndent(), testConfiguration
- ) {
- documentablesCreationStage = { modules ->
-
- fun expectedAnnotationValue(name: String, value: AnnotationParameterValue) = AnnotationValue(Annotations.Annotation(
- dri = DRI("test", name),
- params = mapOf("value" to value),
- scope = Annotations.AnnotationScope.DIRECT,
- mustBeDocumented = false
- ))
- val property = modules.flatMap { it.packages }.flatMap { it.properties }.first()
- val annotation = property.extra[Annotations]?.let {
- it.directAnnotations.entries.firstNotNullOfOrNull { (_, annotations) -> annotations.firstOrNull() }
- }
- val annotationParams = annotation?.params ?: emptyMap()
-
- assertEquals(expectedAnnotationValue("Reference", IntValue(2)), annotationParams["ref"])
-
- val reportedByParam = ArrayValue(listOf(
- expectedAnnotationValue("Reference", LongValue(2)),
- expectedAnnotationValue("Reference", LongValue(4)),
- expectedAnnotationValue("ReferenceReal", DoubleValue(4.9)),
- expectedAnnotationValue("ReferenceReal", FloatValue(2f))
- ))
- assertEquals(reportedByParam, annotationParams["reportedBy"])
- assertEquals(BooleanValue(true), annotationParams["showStopper"])
- assertEquals(NullValue, annotationParams["previousReport"])
- }
-
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(
- mapOf(
- "BugReport" to setOf(
- "assignedTo",
- "testCase",
- "status",
- "ref",
- "reportedBy",
- "showStopper",
- "previousReport"
- )
- ), "", "", emptySet(), "val", "ltint", "Int", "5"
- )
- }
- }
- }
- }
-
- @Test
- fun `JvmName for property with setter and getter`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |@get:JvmName("xd")
- |@set:JvmName("asd")
- |var property: String
- | get() = ""
- | set(value) {}
- """.trimIndent(), testConfiguration
- ) {
- documentablesCreationStage = { modules ->
- fun expectedAnnotation(name: String) = Annotations.Annotation(
- dri = DRI("kotlin.jvm", "JvmName"),
- params = mapOf("name" to StringValue(name)),
- scope = Annotations.AnnotationScope.DIRECT,
- mustBeDocumented = true
- )
-
- val property = modules.flatMap { it.packages }.flatMap { it.properties }.first()
- val getterAnnotation = property.getter?.extra?.get(Annotations)?.let {
- it.directAnnotations.entries.firstNotNullOfOrNull { (_, annotations) -> annotations.firstOrNull() }
- }
- val setterAnnotation = property.getter?.extra?.get(Annotations)?.let {
- it.directAnnotations.entries.firstNotNullOfOrNull { (_, annotations) -> annotations.firstOrNull() }
- }
-
- assertEquals(expectedAnnotation("xd"), getterAnnotation)
- assertTrue(getterAnnotation?.mustBeDocumented!!)
- assertEquals(Annotations.AnnotationScope.DIRECT, getterAnnotation.scope)
-
- assertEquals(expectedAnnotation("asd"), setterAnnotation)
- assertTrue(setterAnnotation?.mustBeDocumented!!)
- assertEquals(Annotations.AnnotationScope.DIRECT, setterAnnotation.scope)
- }
- }
- }
-
- @Test
- fun `annotated bounds in Kotlin`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |@MustBeDocumented
- |@Target(AnnotationTarget.TYPE_PARAMETER)
- |annotation class Hello(val bar: String)
- |fun <T: @Hello("abc") String> foo(arg: String): List<T> = TODO()
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { root ->
- val fooPage = root.dfs { it.name == "foo" } as MemberPageNode
- fooPage.content.dfs { it is ContentText && it.text == "Hello" }.assertNotNull()
- }
- }
- }
-
- @Test
- fun `annotated bounds in Java`() {
- testInline(
- """
- |/src/main/java/demo/AnnotationTest.java
- |package demo;
- |import java.lang.annotation.*;
- |import java.util.List;
- |@Documented
- |@Target({ElementType.TYPE_USE, ElementType.TYPE})
- |@interface Hello {
- | public String bar() default "";
- |}
- |public class AnnotationTest {
- | public <T extends @Hello(bar = "baz") String> List<T> foo() {
- | return null;
- | }
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { root ->
- val fooPage = root.dfs { it.name == "foo" } as MemberPageNode
- fooPage.content.dfs { it is ContentText && it.text == "Hello" }.assertNotNull()
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/annotations/FileLevelJvmNameTest.kt b/plugins/base/src/test/kotlin/content/annotations/FileLevelJvmNameTest.kt
deleted file mode 100644
index 5809d7df..00000000
--- a/plugins/base/src/test/kotlin/content/annotations/FileLevelJvmNameTest.kt
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.annotations
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.StringValue
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.ValueSource
-import kotlin.test.assertEquals
-
-class FileLevelJvmNameTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- companion object {
- private const val functionTest =
- """
- |/src/main/kotlin/test/source.kt
- |@file:JvmName("CustomJvmName")
- |package test
- |
- |fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """
-
- private const val extensionFunctionTest =
- """
- |/src/main/kotlin/test/source.kt
- |@file:JvmName("CustomJvmName")
- |package test
- |
- |fun String.function(abc: String): String {
- | return "Hello, " + abc
- |}
- """
-
- private const val propertyTest =
- """
- |/src/main/kotlin/test/source.kt
- |@file:JvmName("CustomJvmName")
- |package test
- |
- |val property: String
- | get() = ""
- """
-
- private const val extensionPropertyTest =
- """
- |/src/main/kotlin/test/source.kt
- |@file:JvmName("CustomJvmName")
- |package test
- |
- |val String.property: String
- | get() = ""
- """
- }
-
- @ParameterizedTest
- @ValueSource(strings = [functionTest, extensionFunctionTest])
- fun `jvm name should be included in functions extra`(query: String) {
- testInline(
- query.trimIndent(), testConfiguration
- ) {
- documentablesCreationStage = { modules ->
- val expectedAnnotation = Annotations.Annotation(
- dri = DRI("kotlin.jvm", "JvmName"),
- params = mapOf("name" to StringValue("CustomJvmName")),
- scope = Annotations.AnnotationScope.FILE,
- mustBeDocumented = true
- )
- val function = modules.flatMap { it.packages }.first().functions.first()
- val annotation = function.extra[Annotations]?.fileLevelAnnotations?.entries?.first()?.value?.single()
- assertEquals(emptyMap(), function.extra[Annotations]?.directAnnotations)
- assertEquals(expectedAnnotation, annotation)
- assertEquals(expectedAnnotation.scope, annotation?.scope)
- assertEquals(expectedAnnotation.mustBeDocumented, annotation?.mustBeDocumented)
- }
- }
- }
-
- @ParameterizedTest
- @ValueSource(strings = [propertyTest, extensionPropertyTest])
- fun `jvm name should be included in properties extra`(query: String) {
- testInline(
- query.trimIndent(), testConfiguration
- ) {
- documentablesCreationStage = { modules ->
- val expectedAnnotation = Annotations.Annotation(
- dri = DRI("kotlin.jvm", "JvmName"),
- params = mapOf("name" to StringValue("CustomJvmName")),
- scope = Annotations.AnnotationScope.FILE,
- mustBeDocumented = true
- )
- val properties = modules.flatMap { it.packages }.first().properties.first()
- val annotation = properties.extra[Annotations]?.fileLevelAnnotations?.entries?.first()?.value?.single()
- assertEquals(emptyMap(), properties.extra[Annotations]?.directAnnotations)
- assertEquals(expectedAnnotation, annotation)
- assertEquals(expectedAnnotation.scope, annotation?.scope)
- assertEquals(expectedAnnotation.mustBeDocumented, annotation?.mustBeDocumented)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/annotations/JavaDeprecatedTest.kt b/plugins/base/src/test/kotlin/content/annotations/JavaDeprecatedTest.kt
deleted file mode 100644
index 5a2ff93e..00000000
--- a/plugins/base/src/test/kotlin/content/annotations/JavaDeprecatedTest.kt
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.annotations
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.base.transformers.documentables.deprecatedAnnotation
-import org.jetbrains.dokka.base.transformers.documentables.isDeprecated
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.ContentStyle
-import utils.pWrapped
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
-
-class JavaDeprecatedTest : BaseAbstractTest() {
-
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- @Suppress("UNCHECKED_CAST")
- fun `should assert util functions for deprecation`() {
- testInline(
- """
- |/src/main/kotlin/deprecated/DeprecatedJavaClass.java
- |package deprecated
- |
- |@Deprecated(forRemoval = true)
- |public class DeprecatedJavaClass {}
- """.trimIndent(),
- testConfiguration
- ) {
- documentablesTransformationStage = { module ->
- val deprecatedClass = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "DeprecatedJavaClass" }
-
- val isDeprecated = (deprecatedClass as WithExtraProperties<out Documentable>).isDeprecated()
- assertTrue(isDeprecated)
-
- val deprecatedAnnotation = (deprecatedClass as WithExtraProperties<out Documentable>).deprecatedAnnotation
- assertNotNull(deprecatedAnnotation)
-
- assertTrue(deprecatedAnnotation.isDeprecated())
- assertEquals("java.lang", deprecatedAnnotation.dri.packageName)
- assertEquals("Deprecated", deprecatedAnnotation.dri.classNames)
- }
- }
- }
-
- @Test
- fun `should change deprecated header if marked for removal`() {
- testInline(
- """
- |/src/main/kotlin/deprecated/DeprecatedJavaClass.java
- |package deprecated
- |
- |/**
- | * Average function description
- | */
- |@Deprecated(forRemoval = true)
- |public class DeprecatedJavaClass {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val deprecatedJavaClass = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "DeprecatedJavaClass" } as ContentPage
-
- deprecatedJavaClass.content.assertNode {
- group {
- header(1) { +"DeprecatedJavaClass" }
- platformHinted {
- skipAllNotMatching()
- group {
- header(3) {
- +"Deprecated (for removal)"
- }
- }
- group { pWrapped("Average function description") }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `should add footnote for 'since' param`() {
- testInline(
- """
- |/src/main/kotlin/deprecated/DeprecatedJavaClass.java
- |package deprecated
- |
- |/**
- | * Average function description
- | */
- |@Deprecated(since = "11")
- |public class DeprecatedJavaClass {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val deprecatedJavaClass = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "DeprecatedJavaClass" } as ContentPage
-
- deprecatedJavaClass.content.assertNode {
- group {
- header(1) { +"DeprecatedJavaClass" }
- platformHinted {
- skipAllNotMatching()
- group {
- header(3) {
- +"Deprecated"
- }
- group {
- check { assertEquals(ContentStyle.Footnote, this.style.firstOrNull()) }
- +"Since version 11"
- }
- }
- group { pWrapped("Average function description") }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/annotations/KotlinDeprecatedTest.kt b/plugins/base/src/test/kotlin/content/annotations/KotlinDeprecatedTest.kt
deleted file mode 100644
index 7612aff8..00000000
--- a/plugins/base/src/test/kotlin/content/annotations/KotlinDeprecatedTest.kt
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.annotations
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.base.transformers.documentables.deprecatedAnnotation
-import org.jetbrains.dokka.base.transformers.documentables.isDeprecated
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.ContentStyle
-import utils.ParamAttributes
-import utils.bareSignature
-import utils.pWrapped
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
-
-
-class KotlinDeprecatedTest : BaseAbstractTest() {
-
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- @Suppress("UNCHECKED_CAST")
- fun `should assert util functions for deprecation`() {
- testInline(
- """
- |/src/main/kotlin/kotlin/KotlinFile.kt
- |package deprecated
- |
- |@Deprecated(
- | message = "Fancy message"
- |)
- |fun simpleFunction() {}
- """.trimIndent(),
- testConfiguration
- ) {
- documentablesTransformationStage = { module ->
- val deprecatedFunction = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "simpleFunction" }
-
- val isDeprecated = (deprecatedFunction as WithExtraProperties<out Documentable>).isDeprecated()
- assertTrue(isDeprecated)
-
- val deprecatedAnnotation = (deprecatedFunction as WithExtraProperties<out Documentable>).deprecatedAnnotation
- assertNotNull(deprecatedAnnotation)
-
- assertTrue(deprecatedAnnotation.isDeprecated())
- assertEquals("kotlin", deprecatedAnnotation.dri.packageName)
- assertEquals("Deprecated", deprecatedAnnotation.dri.classNames)
- }
- }
- }
-
- @Test
- fun `should change header if deprecation level is not default`() {
- testInline(
- """
- |/src/main/kotlin/kotlin/DeprecatedKotlin.kt
- |package deprecated
- |
- |/**
- | * Average function description
- | */
- |@Deprecated(
- | message = "Reason for deprecation bla bla",
- | level = DeprecationLevel.ERROR
- |)
- |fun oldLegacyFunction(typedParam: SomeOldType, someLiteral: String): String {}
- |
- |fun newShinyFunction(typedParam: SomeOldType, someLiteral: String, newTypedParam: SomeNewType): String {}
- |class SomeOldType {}
- |class SomeNewType {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionWithDeprecatedFunction = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "oldLegacyFunction" } as ContentPage
-
- functionWithDeprecatedFunction.content.assertNode {
- group {
- header(1) { +"oldLegacyFunction" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = emptySet(),
- name = "oldLegacyFunction",
- returnType = "String",
- params = arrayOf(
- "typedParam" to ParamAttributes(emptyMap(), emptySet(), "SomeOldType"),
- "someLiteral" to ParamAttributes(emptyMap(), emptySet(), "String"),
- )
- )
- }
- after {
- group {
- header(3) {
- +"Deprecated (with error)"
- }
- p {
- +"Reason for deprecation bla bla"
- }
- }
- group { pWrapped("Average function description") }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `should display repalceWith param with imports as code blocks`() {
- testInline(
- """
- |/src/main/kotlin/kotlin/DeprecatedKotlin.kt
- |package deprecated
- |
- |/**
- | * Average function description
- | */
- |@Deprecated(
- | message = "Reason for deprecation bla bla",
- | replaceWith = ReplaceWith(
- | "newShinyFunction(typedParam, someLiteral, SomeNewType())",
- | imports = [
- | "com.example.dokka.debug.newShinyFunction",
- | "com.example.dokka.debug.SomeOldType",
- | "com.example.dokka.debug.SomeNewType",
- | ]
- | ),
- |)
- |fun oldLegacyFunction(typedParam: SomeOldType, someLiteral: String): String {}
- |
- |fun newShinyFunction(typedParam: SomeOldType, someLiteral: String, newTypedParam: SomeNewType): String {}
- |class SomeOldType {}
- |class SomeNewType {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionWithDeprecatedFunction = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "oldLegacyFunction" } as ContentPage
-
- functionWithDeprecatedFunction.content.assertNode {
- group {
- header(1) { +"oldLegacyFunction" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = emptySet(),
- name = "oldLegacyFunction",
- returnType = "String",
- params = arrayOf(
- "typedParam" to ParamAttributes(emptyMap(), emptySet(), "SomeOldType"),
- "someLiteral" to ParamAttributes(emptyMap(), emptySet(), "String"),
- )
- )
- }
- after {
- group {
- header(3) {
- +"Deprecated"
- }
- p {
- +"Reason for deprecation bla bla"
- }
-
- header(4) {
- +"Replace with"
- }
- codeBlock {
- +"import com.example.dokka.debug.newShinyFunction"
- br()
- +"import com.example.dokka.debug.SomeOldType"
- br()
- +"import com.example.dokka.debug.SomeNewType"
- br()
- }
- codeBlock {
- +"newShinyFunction(typedParam, someLiteral, SomeNewType())"
- }
- }
- group { pWrapped("Average function description") }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `should add footnote for DeprecatedSinceKotlin annotation`() {
- testInline(
- """
- |/src/main/kotlin/kotlin/DeprecatedKotlin.kt
- |package deprecated
- |
- |/**
- | * Average function description
- | */
- |@DeprecatedSinceKotlin(
- | warningSince = "1.4",
- | errorSince = "1.5",
- | hiddenSince = "1.6"
- |)
- |@Deprecated(
- | message = "Deprecation reason bla bla"
- |)
- |fun oldLegacyFunction(typedParam: SomeOldType, someLiteral: String): String {}
- |
- |fun newShinyFunction(typedParam: SomeOldType, someLiteral: String, newTypedParam: SomeNewType): String {}
- |class SomeOldType {}
- |class SomeNewType {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionWithDeprecatedFunction = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "oldLegacyFunction" } as ContentPage
-
- functionWithDeprecatedFunction.content.assertNode {
- group {
- header(1) { +"oldLegacyFunction" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = emptySet(),
- name = "oldLegacyFunction",
- returnType = "String",
- params = arrayOf(
- "typedParam" to ParamAttributes(emptyMap(), emptySet(), "SomeOldType"),
- "someLiteral" to ParamAttributes(emptyMap(), emptySet(), "String"),
- )
- )
- }
- after {
- group {
- header(3) {
- +"Deprecated"
- }
- group {
- check { assertEquals(ContentStyle.Footnote, this.style.firstOrNull()) }
- p {
- +"Warning since 1.4"
- }
- p {
- +"Error since 1.5"
- }
- p {
- +"Hidden since 1.6"
- }
- }
- p {
- +"Deprecation reason bla bla"
- }
- }
- group { pWrapped("Average function description") }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `should generate deprecation block with all parameters present and long description`() {
- testInline(
- """
- |/src/main/kotlin/kotlin/DeprecatedKotlin.kt
- |package deprecated
- |
- |/**
- | * Average function description
- | */
- |@Deprecated(
- | message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vel vulputate risus. " +
- | "Etiam dictum odio vel vulputate auctor.Nulla facilisi. Duis ullamcorper ullamcorper lectus " +
- | "nec rutrum. Quisque eu risus eu purus bibendum ultricies. Maecenas tincidunt dui in sodales " +
- | "faucibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin id sem felis. " +
- | "Praesent et libero lacinia, egestas libero in, ultrices lectus. Suspendisse eget volutpat " +
- | "velit. Phasellus laoreet mi eu egestas mattis.",
- | replaceWith = ReplaceWith(
- | "newShinyFunction(typedParam, someLiteral, SomeNewType())",
- | imports = [
- | "com.example.dokka.debug.newShinyFunction",
- | "com.example.dokka.debug.SomeOldType",
- | "com.example.dokka.debug.SomeNewType",
- | ]
- | ),
- | level = DeprecationLevel.ERROR
- |)
- |fun oldLegacyFunction(typedParam: SomeOldType, someLiteral: String): String {}
- |
- |fun newShinyFunction(typedParam: SomeOldType, someLiteral: String, newTypedParam: SomeNewType): String {}
- |class SomeOldType {}
- |class SomeNewType {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionWithDeprecatedFunction = module.children
- .single { it.name == "deprecated" }.children
- .single { it.name == "oldLegacyFunction" } as ContentPage
-
- functionWithDeprecatedFunction.content.assertNode {
- group {
- header(1) { +"oldLegacyFunction" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = emptySet(),
- name = "oldLegacyFunction",
- returnType = "String",
- params = arrayOf(
- "typedParam" to ParamAttributes(emptyMap(), emptySet(), "SomeOldType"),
- "someLiteral" to ParamAttributes(emptyMap(), emptySet(), "String"),
- )
- )
- }
- after {
- group {
- header(3) {
- +"Deprecated (with error)"
- }
- p {
- +("Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
- "Maecenas vel vulputate risus. Etiam dictum odio vel " +
- "vulputate auctor.Nulla facilisi. Duis ullamcorper " +
- "ullamcorper lectus nec rutrum. Quisque eu risus eu " +
- "purus bibendum ultricies. Maecenas tincidunt dui in sodales faucibus. " +
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
- "Proin id sem felis. Praesent et libero lacinia, egestas " +
- "libero in, ultrices lectus. Suspendisse eget volutpat velit. " +
- "Phasellus laoreet mi eu egestas mattis.")
- }
- header(4) {
- +"Replace with"
- }
- codeBlock {
- +"import com.example.dokka.debug.newShinyFunction"
- br()
- +"import com.example.dokka.debug.SomeOldType"
- br()
- +"import com.example.dokka.debug.SomeNewType"
- br()
- }
- codeBlock {
- +"newShinyFunction(typedParam, someLiteral, SomeNewType())"
- }
- }
- group { pWrapped("Average function description") }
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/annotations/SinceKotlinTest.kt b/plugins/base/src/test/kotlin/content/annotations/SinceKotlinTest.kt
deleted file mode 100644
index 6ee95bbd..00000000
--- a/plugins/base/src/test/kotlin/content/annotations/SinceKotlinTest.kt
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.annotations
-
-import matchers.content.*
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinTransformer
-import org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinVersion
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.CustomTagWrapper
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.pages.ContentPage
-import signatures.AbstractRenderingTest
-import utils.*
-import kotlin.test.*
-
-
-class SinceKotlinTest : AbstractRenderingTest() {
-
- val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- analysisPlatform = "jvm"
- }
- }
- }
-
- @BeforeTest
- fun setSystemProperty() {
- System.setProperty(SinceKotlinTransformer.SHOULD_DISPLAY_SINCE_KOTLIN_SYS_PROP, "true")
- }
- @AfterTest
- fun clearSystemProperty() {
- System.clearProperty(SinceKotlinTransformer.SHOULD_DISPLAY_SINCE_KOTLIN_SYS_PROP)
- }
-
- @Test
- fun versionsComparing() {
- assertTrue(SinceKotlinVersion("1.0").compareTo(SinceKotlinVersion("1.0")) == 0)
- assertTrue(SinceKotlinVersion("1.0.0").compareTo(SinceKotlinVersion("1")) == 0)
- assertTrue(SinceKotlinVersion("1.0") >= SinceKotlinVersion("1.0"))
- assertTrue(SinceKotlinVersion("1.1") > SinceKotlinVersion("1"))
- assertTrue(SinceKotlinVersion("1.0") < SinceKotlinVersion("2.0"))
- assertTrue(SinceKotlinVersion("1.0") < SinceKotlinVersion("2.2"))
- }
-
- @Test
- fun `rendered SinceKotlin custom tag for typealias, extensions, functions, properties`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@SinceKotlin("1.5")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |@SinceKotlin("1.5")
- |fun String.extension(abc: String): String {
- | return "My precious " + abc
- |}
- |@SinceKotlin("1.5")
- |typealias Str = String
- |@SinceKotlin("1.5")
- |val str = "str"
- """.trimIndent(),
- testConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.renderedContent("root/test/index.html")
- assertEquals(4, content.getElementsContainingOwnText("Since Kotlin").count())
- }
- }
- }
-
- @Test
- fun `should propagate SinceKotlin`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@SinceKotlin("1.5")
- |class A {
- | fun ring(abc: String): String {
- | return "My precious " + abc
- | }
- |}
- """.trimIndent(), testConfiguration
- ) {
- documentablesTransformationStage = { module ->
- @Suppress("UNCHECKED_CAST") val funcs = module.children.single { it.name == "test" }
- .children.single { it.name == "A" }
- .children.filter { it.name == "ring" && it is DFunction } as List<DFunction>
- with(funcs) {
- val sinceKotlin = mapOf(
- Platform.jvm to SinceKotlinVersion("1.5"),
- )
-
- for(i in sinceKotlin) {
- val tag =
- find { it.sourceSets.first().analysisPlatform == i.key }?.documentation?.values?.first()
- ?.dfs { it is CustomTagWrapper && it.name == "Since Kotlin" }
- .assertNotNull("SinceKotlin[${i.key}]")
- assertEquals((tag.children.first() as Text).body, i.value.toString())
- }
- }
- }
- }
- }
-
- @Test
- fun `mpp fun without SinceKotlin annotation`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/jvm/")
- analysisPlatform = "jvm"
- }
- sourceSet {
- sourceRoots = listOf("src/native/")
- analysisPlatform = "native"
- name = "native"
- }
- sourceSet {
- sourceRoots = listOf("src/common/")
- analysisPlatform = "common"
- name = "common"
- }
- sourceSet {
- sourceRoots = listOf("src/js/")
- analysisPlatform = "js"
- name = "js"
- }
- sourceSet {
- sourceRoots = listOf("src/wasm/")
- analysisPlatform = "wasm"
- name = "wasm"
- }
- }
- }
- testInline(
- """
- |/src/jvm/kotlin/test/source.kt
- |package test
- |
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/native/kotlin/test/source.kt
- |package test
- |
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/common/kotlin/test/source.kt
- |package test
- |
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/js/kotlin/test/source.kt
- |package test
- |
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/wasm/kotlin/test/source.kt
- |package test
- |
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- """.trimIndent(), configuration
- ) {
- documentablesTransformationStage = { module ->
- @Suppress("UNCHECKED_CAST") val funcs = module.children.single { it.name == "test" }
- .children.filter { it.name == "ring" && it is DFunction } as List<DFunction>
- with(funcs) {
- val sinceKotlin = mapOf(
- Platform.common to SinceKotlinVersion("1.0"),
- Platform.jvm to SinceKotlinVersion("1.0"),
- Platform.js to SinceKotlinVersion("1.1"),
- Platform.native to SinceKotlinVersion("1.3"),
- Platform.wasm to SinceKotlinVersion("1.8"),
- )
-
- for(i in sinceKotlin) {
- val tag =
- find { it.sourceSets.first().analysisPlatform == i.key }?.documentation?.values?.first()
- ?.dfs { it is CustomTagWrapper && it.name == "Since Kotlin" }
- .assertNotNull("SinceKotlin[${i.key}]")
- assertEquals((tag.children.first() as Text).body, i.value.toString())
- }
- }
- }
- }
- }
-
- @Test
- fun `mpp fun with SinceKotlin annotation`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/jvm/")
- classpath = listOfNotNull(jvmStdlibPath)
- analysisPlatform = "jvm"
- }
- sourceSet {
- sourceRoots = listOf("src/native/")
- analysisPlatform = "native"
- name = "native"
- }
- sourceSet {
- sourceRoots = listOf("src/common/")
- classpath = listOfNotNull(commonStdlibPath)
- analysisPlatform = "common"
- name = "common"
- }
- sourceSet {
- sourceRoots = listOf("src/js/")
- classpath = listOfNotNull(jsStdlibPath)
- analysisPlatform = "js"
- name = "js"
- }
- sourceSet {
- sourceRoots = listOf("src/wasm/")
- analysisPlatform = "wasm"
- name = "wasm"
- }
- }
- }
- testInline(
- """
- |/src/jvm/kotlin/test/source.kt
- |package test
- |
- |/** dssdd */
- |@SinceKotlin("1.3")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/native/kotlin/test/source.kt
- |package test
- |
- |/** dssdd */
- |@SinceKotlin("1.3")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/common/kotlin/test/source.kt
- |package test
- |
- |/** dssdd */
- |@SinceKotlin("1.3")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/js/kotlin/test/source.kt
- |package test
- |
- |/** dssdd */
- |@SinceKotlin("1.3")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- |/src/wasm/kotlin/test/source.kt
- |package test
- |
- |/** dssdd */
- |@SinceKotlin("1.3")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- """.trimIndent(), configuration
- ) {
- documentablesTransformationStage = { module ->
- @Suppress("UNCHECKED_CAST") val funcs = module.children.single { it.name == "test" }
- .children.filter { it.name == "ring" && it is DFunction } as List<DFunction>
- with(funcs) {
- val sinceKotlin = mapOf(
- Platform.common to SinceKotlinVersion("1.3"),
- Platform.jvm to SinceKotlinVersion("1.3"),
- Platform.js to SinceKotlinVersion("1.3"),
- Platform.native to SinceKotlinVersion("1.3"),
- Platform.wasm to SinceKotlinVersion("1.8"),
- )
-
- for(i in sinceKotlin) {
- val tag =
- find { it.sourceSets.first().analysisPlatform == i.key }?.documentation?.values?.first()
- ?.dfs { it is CustomTagWrapper && it.name == "Since Kotlin" }
- .assertNotNull("SinceKotlin[${i.key}]")
- assertEquals(i.value.toString(), (tag.children.first() as Text).body , "Platform ${i.key}")
- }
- }
- }
- }
- }
-
- @Test
- fun `should do not render since kotlin tag when flag is unset`() {
- clearSystemProperty()
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |@SinceKotlin("1.3")
- |fun ring(abc: String): String {
- | return "My precious " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "ring" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"ring" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "ring",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
-
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/exceptions/ContentForExceptions.kt b/plugins/base/src/test/kotlin/content/exceptions/ContentForExceptions.kt
deleted file mode 100644
index 22becb93..00000000
--- a/plugins/base/src/test/kotlin/content/exceptions/ContentForExceptions.kt
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.exceptions
-
-import matchers.content.*
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DisplaySourceSet
-import utils.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContentForExceptions : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- analysisPlatform = "jvm"
- }
- }
- }
-
- private val mppTestConfiguration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- classpath = listOfNotNull(commonStdlibPath)
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- sourceSet {
- name = "linuxX64"
- displayName = "linuxX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/linuxX64Main/kotlin/pageMerger/Test.kt")
- }
- }
- pluginsConfigurations.add(
- PluginConfigurationImpl(
- DokkaBase::class.qualifiedName!!,
- DokkaConfiguration.SerializationFormat.JSON,
- """{ "mergeImplicitExpectActualDeclarations": true }""",
- )
- )
- }
-
- @OnlyDescriptors("Fixed in 1.9.20 (IMPORT STAR)")
- @Test
- fun `function with navigatable thrown exception`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |/**
- |* @throws Exception
- |*/
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"Throws" }
- table {
- group {
- group {
- link { +"Exception" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `function with non-navigatable thrown exception`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |/**
- |* @throws UnavailableException
- |*/
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"Throws" }
- table {
- group {
- group {
- +"UnavailableException"
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `multiplatofrm class with throws`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws CommonException
- |*/
- |expect open class Parent
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws JvmException
- |*/
- |actual open class Parent
- |
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws LinuxException
- |*/
- |actual open class Parent
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"expect open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Throws" }
- table {
- group {
- group {
- +"CommonException"
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "common",
- this.sourceSets.first().name
- )
- }
- }
- group {
- group {
- +"JvmException"
- }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- group {
- group {
- +"LinuxException"
- }
- check {
- sourceSets.assertSourceSet("linuxX64")
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `multiplatofrm class with throws in few platforms`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws CommonException
- |*/
- |expect open class Parent
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws JvmException
- |*/
- |actual open class Parent
- |
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual open class Parent
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"expect open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Throws" }
- table {
- group {
- group {
- +"CommonException"
- }
- check {
- sourceSets.assertSourceSet("common")
- }
- }
- group {
- group {
- +"JvmException"
- }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- check {
- assertEquals(2, sourceSets.size)
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `throws in merged functions`() {
- testInline(
- """
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws LinuxException
- |*/
- |fun function() {
- | println()
- |}
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @throws JvmException
- |*/
- |fun function() {
- | println()
- |}
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- )
- }
- after {
- header(4) { +"Throws" }
- table {
- group {
- group {
- +"JvmException"
- }
- }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- )
- }
- after {
- header(4) { +"Throws" }
- table {
- group {
- group {
- +"LinuxException"
- }
- }
- }
- }
- check {
- sourceSets.assertSourceSet("linuxX64")
- }
- }
- }
- }
- }
- }
- }
-}
-
-private fun Set<DisplaySourceSet>.assertSourceSet(expectedName: String) {
- assertEquals(1, this.size)
- assertEquals(expectedName, this.first().name)
-}
diff --git a/plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt b/plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt
deleted file mode 100644
index d93a6c27..00000000
--- a/plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.functions
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DPackage
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-
-class ContentForBriefTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- private val codeWithSecondaryAndPrimaryConstructorsDocumented =
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |/**
- | * Dummy text.
- | *
- | * @constructor constructor docs
- | * @param exampleParameter dummy parameter.
- | */
- |class Example(val exampleParameter: Int) {
- |
- | /**
- | * secondary constructor
- | * @param param1 param1 docs
- | */
- | constructor(param1: String) : this(1)
- |}
- """.trimIndent()
-
- private val codeWithDocumentedParameter =
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |/**
- | * Dummy text.
- | *
- | * @param exampleParameter dummy parameter.
- | */
- |class Example(val exampleParameter: Int) {
- |}
- """.trimIndent()
-
-
- @Test
- fun `primary constructor should not inherit docs from its parameter`() {
- testInline(codeWithSecondaryAndPrimaryConstructorsDocumented, testConfiguration) {
- pagesTransformationStage = { module ->
- val classPage = module.findClassPage("Example")
-
- val constructorsWithBriefs = classPage.findConstructorsWithBriefs()
- val constructorDocs = constructorsWithBriefs.findConstructorDocs {
- it.callable?.params?.first() == TypeConstructor("kotlin.Int", emptyList())
- }
-
- assertEquals("constructor docs", constructorDocs.text)
- }
- }
- }
-
- @Test
- fun `secondary constructor should not inherit docs from its parameter`() {
- testInline(codeWithSecondaryAndPrimaryConstructorsDocumented, testConfiguration) {
- pagesTransformationStage = { module ->
- val classPage = module.findClassPage("Example")
-
- val constructorsWithBriefs = classPage.findConstructorsWithBriefs()
- val constructorDocs = constructorsWithBriefs.findConstructorDocs {
- it.callable?.params?.first() == TypeConstructor("kotlin.String", emptyList())
- }
-
- assertEquals("secondary constructor", constructorDocs.text)
- }
- }
- }
-
- /**
- * All constructors are merged in one block (like overloaded functions).
- * That leads to the structure where content block (`constructorsWithBriefs`) consist of plain list
- * of constructors and briefs. In that list constructor is above, brief is below.
- */
- private fun ContentPage.findConstructorsWithBriefs(): List<ContentNode> {
- val constructorsTable = this.content.dfs {
- it is ContentTable && it.dci.kind == ContentKind.Constructors
- } as ContentTable
-
- val constructorsWithBriefs = constructorsTable.dfs {
- it is ContentGroup && it.dci.kind == ContentKind.SourceSetDependentHint
- }?.children
- assertNotNull(constructorsWithBriefs, "Content node with constructors and briefs is not found")
-
- return constructorsWithBriefs
- }
-
- private fun List<ContentNode>.findConstructorDocs(constructorMatcher: (DRI) -> Boolean): ContentText {
- val constructorIndex = this.indexOfFirst { constructorMatcher(it.dci.dri.first()) }
- return this[constructorIndex + 1] // expect that the relevant comment is below the constructor
- .dfs { it is ContentText && it.dci.kind == ContentKind.Comment } as ContentText
- }
-
- @Test
- fun `primary constructor should not inherit docs from its parameter when no specific docs are provided`() {
- testInline(codeWithDocumentedParameter, testConfiguration) {
- pagesTransformationStage = { module ->
- val classPage = module.findClassPage("Example")
- val constructorsTable =
- classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Constructors } as ContentTable
-
- assertEquals(1, constructorsTable.children.size)
- val primary = constructorsTable.children.first()
- val primaryConstructorDocs = primary.dfs { it is ContentText && it.dci.kind == ContentKind.Comment }
-
- assertNull(primaryConstructorDocs, "Expected no primary constructor docs to be present")
- }
- }
- }
-
- @Test
- fun `brief should work for typealias`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |/**
- |* This is an example <!-- not visible --> of html
- |*
- |* This is definitely not a brief
- |*/
- |typealias A = Int
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleTypeAliasesDescription("test")
-
- assertEquals(
- "This is an example <!-- not visible --> of html",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- @Test
- fun `brief for functions should work with html`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class Example(val exampleParameter: Int) {
- | /**
- | * This is an example <!-- not visible --> of html
- | *
- | * This is definitely not a brief
- | */
- | fun test(): String = "TODO"
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "This is an example <!-- not visible --> of html",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- @Test
- fun `brief for functions should work with ie`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class Example(val exampleParameter: Int) {
- | /**
- | * The user token, i.e. "Bearer xyz". Throw an exception if not available.
- | *
- | * This is definitely not a brief
- | */
- | fun test(): String = "TODO"
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "The user token, i.e. \"Bearer xyz\". Throw an exception if not available.",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- @Test
- fun `brief for functions should work with eg`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class Example(val exampleParameter: Int) {
- | /**
- | * The user token, e.g. "Bearer xyz". Throw an exception if not available.
- | *
- | * This is definitely not a brief
- | */
- | fun test(): String = "TODO"
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "The user token, e.g. \"Bearer xyz\". Throw an exception if not available.",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- @Test
- fun `brief for functions should be first sentence for Java`() {
- testInline(
- """
- |/src/main/java/test/Example.java
- |package test;
- |
- |public class Example {
- | /**
- | * The user token, or not. This is definitely not a brief in java
- | */
- | public static String test() {
- | return "TODO";
- | }
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "The user token, or not.",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- @Test
- fun `brief for functions should work with ie for Java`() {
- testInline(
- """
- |/src/main/java/test/Example.java
- |package test;
- |
- |public class Example {
- | /**
- | * The user token, e.g.&nbsp;"Bearer xyz". This is definitely not a brief in java
- | */
- | public static String test() {
- | return "TODO";
- | }
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "The user token, e.g. \"Bearer xyz\".",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- //Source: https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html#exampleresult
- @Test
- fun `brief for functions should work with html comment for Java`() {
- testInline(
- """
- |/src/main/java/test/Example.java
- |package test;
- |
- |public class Example {
- | /**
- | * This is a simulation of Prof.<!-- --> Knuth's MIX computer. This is definitely not a brief in java
- | */
- | public static String test() {
- | return "TODO";
- | }
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "This is a simulation of Prof.<!-- --> Knuth's MIX computer.",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- @Test
- fun `brief for functions should work with html comment at the end for Java`() {
- testInline(
- """
- |/src/main/java/test/Example.java
- |package test;
- |
- |public class Example {
- | /**
- | * This is a simulation of Prof.<!-- --> Knuth's MIX computer. This is definitely not a brief in java <!-- -->
- | */
- | public static String test() {
- | return "TODO";
- | }
- |}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionBriefDocs = module.singleFunctionDescription("Example")
-
- assertEquals(
- "This is a simulation of Prof.<!-- --> Knuth's MIX computer.",
- functionBriefDocs.children.joinToString("") { (it as ContentText).text })
- }
- }
- }
-
- private fun RootPageNode.findClassPage(className: String): ContentPage {
- return this.dfs {
- it.name == className && (it as WithDocumentables).documentables.firstOrNull() is DClass
- } as ContentPage
- }
-
- private fun RootPageNode.singleFunctionDescription(className: String): ContentGroup {
- val classPage =
- dfs { it.name == className && (it as WithDocumentables).documentables.firstOrNull() is DClass } as ContentPage
- val functionsTable =
- classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Functions } as ContentTable
-
- assertEquals(1, functionsTable.children.size)
- val function = functionsTable.children.first()
- return function.dfs { it is ContentGroup && it.dci.kind == ContentKind.Comment && it.children.all { it is ContentText } } as ContentGroup
- }
- private fun RootPageNode.singleTypeAliasesDescription(packageName: String): ContentGroup {
- val packagePage =
- dfs { it.name == packageName && (it as WithDocumentables).documentables.firstOrNull() is DPackage } as ContentPage
- val contentTable =
- packagePage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Classlikes } as ContentTable
-
- assertEquals(1, contentTable.children.size)
- val row = contentTable.children.first()
- return row.dfs { it is ContentGroup && it.dci.kind == ContentKind.Comment && it.children.all { it is ContentText } } as ContentGroup
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/functions/ContentForConstructors.kt b/plugins/base/src/test/kotlin/content/functions/ContentForConstructors.kt
deleted file mode 100644
index d1ed93dc..00000000
--- a/plugins/base/src/test/kotlin/content/functions/ContentForConstructors.kt
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.functions
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.*
-import utils.assertContains
-import utils.assertNotNull
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContentForConstructors : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- fun `constructor name should have RowTitle style`() {
- testInline("""
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |/**
- | * Dummy text.
- | */
- |class Example(val exampleParameter: Int) {
- |}
- """.trimIndent(), testConfiguration) {
- pagesTransformationStage = { module ->
- val classPage =
- module.dfs { it.name == "Example" && (it as WithDocumentables).documentables.firstOrNull() is DClass } as ContentPage
- val constructorsTable =
- classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Constructors } as ContentTable
-
- assertEquals(1, constructorsTable.children.size)
- val primary = constructorsTable.children.first()
- val constructorName =
- primary.dfs { (it as? ContentText)?.text == "Example" }.assertNotNull("constructorName")
-
- assertContains(constructorName.style, ContentStyle.RowTitle)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/inheritors/ContentForInheritorsTest.kt b/plugins/base/src/test/kotlin/content/inheritors/ContentForInheritorsTest.kt
deleted file mode 100644
index 245592cc..00000000
--- a/plugins/base/src/test/kotlin/content/inheritors/ContentForInheritorsTest.kt
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.inheritors
-
-import matchers.content.*
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import utils.OnlyDescriptors
-import utils.classSignature
-import utils.findTestType
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContentForInheritorsTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- private val mppTestConfiguration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "linuxX64"
- displayName = "linuxX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/linuxX64Main/kotlin/pageMerger/Test.kt")
- }
- }
- pluginsConfigurations.add(
- PluginConfigurationImpl(
- DokkaBase::class.qualifiedName!!,
- DokkaConfiguration.SerializationFormat.JSON,
- """{ "mergeImplicitExpectActualDeclarations": true }""",
- )
- )
- }
-
-
- //Case from skiko library
- private val mppTestConfigurationSharedAsPlatform = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- }
- val jvm = sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "android"
- displayName = "android"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(jvm.value.sourceSetID)
- sourceRoots = listOf("src/androidMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "awt"
- displayName = "awt"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(jvm.value.sourceSetID)
- sourceRoots = listOf("src/awtMain/kotlin/pageMerger/Test.kt")
- }
-
- }
- }
-
- @Test
- fun `class with one inheritor has table in description`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class Parent
- |
- |class Foo : Parent()
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Parent"
- )
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Foo" }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @OnlyDescriptors("Order of inheritors is different in K2")
- @Test
- fun `interface with few inheritors has table in description`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |interface Parent
- |
- |class Foo : Parent()
- |class Bar : Parent()
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"interface "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Foo" }
- }
- group {
- link { +"Bar" }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `inherit from one of multiplatoforms actuals`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |expect open class Parent
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual open class Parent
- |
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual open class Parent
- |class Child: Parent()
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"expect open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Child" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "linuxX64",
- this.sourceSets.first().name
- )
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `inherit from class in common code`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |open class Parent
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class Child : Parent()
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Child" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "common",
- this.sourceSets.first().name
- )
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
-
- @Test
- fun `inheritors from merged classes`() {
- testInline(
- """
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |open class Parent
- |class LChild : Parent()
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |open class Parent
- |class JChild : Parent()
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"JChild" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "jvm",
- this.sourceSets.first().name
- )
- }
- }
- group {
- +"open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"LChild" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "linuxX64",
- this.sourceSets.first().name
- )
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
-
- @Test
- fun `merged inheritors from merged classes`() {
- testInline(
- """
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |open class Parent
- |class Child : Parent()
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |open class Parent
- |class Child : Parent()
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Child" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "jvm",
- this.sourceSets.first().name
- )
- }
- }
- group {
- +"open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Child" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "linuxX64",
- this.sourceSets.first().name
- )
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `parent in shared source set that analyse as platform`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |interface Parent
- |
- |/src/androidMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class Child : Parent
- |
- |/src/awtMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class AwtChild : Parent
- |class Child : Parent
- |
- """.trimMargin(),
- mppTestConfigurationSharedAsPlatform
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"interface "
- link {
- +"Parent"
- }
- }
- header(4) { +"Inheritors" }
- table {
- group {
- link { +"Child" }
- }
- group {
- link { +"AwtChild" }
- }
- check {
- assertEquals(1, sourceSets.size)
- assertEquals(
- "jvm",
- this.sourceSets.first().name
- )
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt b/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt
deleted file mode 100644
index d0c6ac9d..00000000
--- a/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt
+++ /dev/null
@@ -1,1529 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.params
-
-import matchers.content.*
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.model.doc.Param
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.firstIsInstanceOrNull
-import utils.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContentForParamsTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- fun `undocumented function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(), "", "", emptySet(), "function", null, "abc" to ParamAttributes(
- emptyMap(),
- emptySet(),
- "String"
- )
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `undocumented parameter`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- group { pWrapped("comment to function") }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `undocumented parameter and other tags without function comment`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @author Kordyjan
- | * @author Woolfy
- | * @since 0.11
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- unnamedTag("Author") {
- comment {
- +"Kordyjan"
- }
- comment {
- +"Woolfy"
- }
- }
- unnamedTag("Since") { comment { +"0.11" } }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `multiple authors`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * Annotation processor which visits all classes.
- | *
- | * @author googler1@google.com (Googler 1)
- | * @author googler2@google.com (Googler 2)
- | */
- | public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage = module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- group {
- group {
- +"Annotation processor which visits all classes."
- }
- }
- }
- group {
- header(4) { +"Author" }
- comment { +"googler1@google.com (Googler 1)" }
- comment { +"googler2@google.com (Googler 2)" }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `author delimetered by space`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * Annotation processor which visits all classes.
- | *
- | * @author Marcin Aman Senior
- | */
- | public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage = module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- group {
- group {
- +"Annotation processor which visits all classes."
- }
- }
- }
- group {
- header(4) { +"Author" }
- comment { +"Marcin Aman Senior" }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
-
- @Test
- fun `deprecated with multiple links inside`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * Return the target fragment set by {@link #setTargetFragment} or {@link
- | * #setTargetFragment}.
- | *
- | * @deprecated Instead of using a target fragment to pass results, the fragment requesting a
- | * result should use
- | * {@link java.util.HashMap#containsKey(java.lang.Object) FragmentManager#setFragmentResult(String, Bundle)} to deliver results to
- | * {@link java.util.HashMap#containsKey(java.lang.Object)
- | * FragmentResultListener} instances registered by other fragments via
- | * {@link java.util.HashMap#containsKey(java.lang.Object) FragmentManager#setFragmentResultListener(String, LifecycleOwner,
- | * FragmentResultListener)}.
- | */
- | public class DocGenProcessor {
- | public String setTargetFragment(){
- | return "";
- | }
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage =
- module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- comment {
- +"Return the target fragment set by "
- link { +"setTargetFragment" }
- +" or "
- link { +"setTargetFragment" }
- +"."
- }
- }
- group {
- header(4) { +"Deprecated" }
- comment {
- +"Instead of using a target fragment to pass results, the fragment requesting a result should use "
- link { +"FragmentManager#setFragmentResult(String, Bundle)" }
- +" to deliver results to "
- link { +"FragmentResultListener" }
- +" instances registered by other fragments via "
- link { +"FragmentManager#setFragmentResultListener(String, LifecycleOwner, FragmentResultListener)" }
- +"."
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `deprecated with an html link in multiple lines`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * @deprecated Use
- | * <a href="https://developer.android.com/guide/navigation/navigation-swipe-view ">
- | * TabLayout and ViewPager</a> instead.
- | */
- | public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage =
- module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- header(4) { +"Deprecated" }
- comment {
- +"Use "
- link { +"TabLayout and ViewPager" }
- +" instead."
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
-
- @Test
- fun `deprecated with an multiple inline links`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * FragmentManagerNonConfig stores the retained instance fragments across
- | * activity recreation events.
- | *
- | * <p>Apps should treat objects of this type as opaque, returned by
- | * and passed to the state save and restore process for fragments in
- | * {@link java.util.HashMap#containsKey(java.lang.Object) FragmentController#retainNestedNonConfig()} and
- | * {@link java.util.HashMap#containsKey(java.lang.Object) FragmentController#restoreAllState(Parcelable, FragmentManagerNonConfig)}.</p>
- | *
- | * @deprecated Have your {@link java.util.HashMap FragmentHostCallback} implement
- | * {@link java.util.HashMap } to automatically retain the Fragment's
- | * non configuration state.
- | */
- | public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage =
- module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- comment {
- group {
- +"FragmentManagerNonConfig stores the retained instance fragments across activity recreation events. "
- }
- group {
- +"Apps should treat objects of this type as opaque, returned by and passed to the state save and restore process for fragments in "
- link { +"FragmentController#retainNestedNonConfig()" }
- +" and "
- link { +"FragmentController#restoreAllState(Parcelable, FragmentManagerNonConfig)" }
- +"."
- }
- }
- }
- group {
- header(4) { +"Deprecated" }
- comment {
- +"Have your "
- link { +"FragmentHostCallback" }
- +" implement "
- link { +"java.util.HashMap" }
- +" to automatically retain the Fragment's non configuration state."
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `multiline throws with comment`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- | public class DocGenProcessor {
- | /**
- | * a normal comment
- | *
- | * @throws java.lang.IllegalStateException if the Dialog has not yet been created (before
- | * onCreateDialog) or has been destroyed (after onDestroyView).
- | * @throws java.lang.RuntimeException when {@link java.util.HashMap#containsKey(java.lang.Object) Hash
- | * Map} doesn't contain value.
- | */
- | public static void sample(){ }
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionPage =
- module.findTestType(
- "sample",
- "DocGenProcessor"
- ).children.single { it.name == "sample" } as ContentPage
- functionPage.content.assertNode {
- group {
- header(1) { +"sample" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- skipAllNotMatching() //Signature
- }
- after {
- group { pWrapped("a normal comment") }
- header(4) { +"Throws" }
- table {
- group {
- group {
- link { +"IllegalStateException" }
- }
- comment { +"if the Dialog has not yet been created (before onCreateDialog) or has been destroyed (after onDestroyView)." }
- }
- group {
- group {
- link { +"RuntimeException" }
- }
- comment {
- +"when "
- link { +"Hash Map" }
- +" doesn't contain value."
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @OnlyDescriptors("Fixed in 1.9.20 (IMPORT STAR)")
- @Test
- fun `multiline kotlin throws with comment`() {
- testInline(
- """
- |/src/main/kotlin/sample/sample.kt
- |package sample;
- | /**
- | * a normal comment
- | *
- | * @throws java.lang.IllegalStateException if the Dialog has not yet been created (before
- | * onCreateDialog) or has been destroyed (after onDestroyView).
- | * @exception RuntimeException when [Hash Map][java.util.HashMap.containsKey] doesn't contain value.
- | */
- | fun sample(){ }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionPage = module.findTestType("sample", "sample")
- functionPage.content.assertNode {
- group {
- header(1) { +"sample" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- skipAllNotMatching() //Signature
- }
- after {
- group { pWrapped("a normal comment") }
- header(4) { +"Throws" }
- table {
- group {
- group {
- link {
- check {
- assertEquals(
- "java.lang/IllegalStateException///PointingToDeclaration/",
- (this as ContentDRILink).address.toString()
- )
- }
- +"IllegalStateException"
- }
- }
- comment { +"if the Dialog has not yet been created (before onCreateDialog) or has been destroyed (after onDestroyView)." }
- }
- group {
- group {
- link {
- check {
- assertEquals(
- "kotlin/RuntimeException///PointingToDeclaration/",
- (this as ContentDRILink).address.toString()
- )
- }
- +"RuntimeException"
- }
- }
- comment {
- +"when "
- link { +"Hash Map" }
- +" doesn't contain value."
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `should display fully qualified throws name for unresolved class`() {
- testInline(
- """
- |/src/main/kotlin/sample/sample.kt
- |package sample;
- | /**
- | * a normal comment
- | *
- | * @throws com.example.UnknownException description for non-resolved
- | */
- | fun sample(){ }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionPage =
- module.findTestType("sample", "sample")
- functionPage.content.assertNode {
- group {
- header(1) { +"sample" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- skipAllNotMatching() //Signature
- }
- after {
- group { pWrapped("a normal comment") }
- header(4) { +"Throws" }
- table {
- group {
- group {
- +"com.example.UnknownException"
- }
- comment { +"description for non-resolved" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `multiline throws where exception is not in the same line as description`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- | public class DocGenProcessor {
- | /**
- | * a normal comment
- | *
- | * @throws java.lang.IllegalStateException if the Dialog has not yet been created (before
- | * onCreateDialog) or has been destroyed (after onDestroyView).
- | * @throws java.lang.RuntimeException when
- | * {@link java.util.HashMap#containsKey(java.lang.Object) Hash
- | * Map}
- | * doesn't contain value.
- | */
- | public static void sample(){ }
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionPage =
- module.findTestType(
- "sample",
- "DocGenProcessor"
- ).children.single { it.name == "sample" } as ContentPage
- functionPage.content.assertNode {
- group {
- header(1) { +"sample" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- skipAllNotMatching() //Signature
- }
- after {
- group { pWrapped("a normal comment") }
- header(4) { +"Throws" }
- table {
- group {
- group {
- link {
- check {
- assertEquals(
- "java.lang/IllegalStateException///PointingToDeclaration/",
- (this as ContentDRILink).address.toString()
- )
- }
- +"IllegalStateException"
- }
- }
- comment { +"if the Dialog has not yet been created (before onCreateDialog) or has been destroyed (after onDestroyView)." }
- }
- group {
- group {
- link {
- check {
- assertEquals(
- "java.lang/RuntimeException///PointingToDeclaration/",
- (this as ContentDRILink).address.toString()
- )
- }
- +"RuntimeException"
- }
- }
- comment {
- +"when "
- link { +"Hash Map" }
- +" doesn't contain value."
- }
- }
- }
- }
- }
-
- }
- }
- }
- }
- }
-
-
-
- @Test
- fun `documentation splitted in 2 using enters`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * Listener for handling fragment results.
- | *
- | * This object should be passed to
- | * {@link java.util.HashMap#containsKey(java.lang.Object) FragmentManager#setFragmentResultListener(String, LifecycleOwner, FragmentResultListener)}
- | * and it will listen for results with the same key that are passed into
- | * {@link java.util.HashMap#containsKey(java.lang.Object) FragmentManager#setFragmentResult(String, Bundle)}.
- | *
- | */
- | public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage =
- module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- comment {
- +"Listener for handling fragment results. This object should be passed to "
- link { +"FragmentManager#setFragmentResultListener(String, LifecycleOwner, FragmentResultListener)" }
- +" and it will listen for results with the same key that are passed into "
- link { +"FragmentManager#setFragmentResult(String, Bundle)" }
- +"."
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `multiline return tag with param`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- | public class DocGenProcessor {
- | /**
- | * a normal comment
- | *
- | * @param testParam Sample description for test param that has a type of {@link java.lang.String String}
- | * @return empty string when
- | * {@link java.util.HashMap#containsKey(java.lang.Object) Hash
- | * Map}
- | * doesn't contain value.
- | */
- | public static String sample(String testParam){
- | return "";
- | }
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionPage =
- module.findTestType(
- "sample",
- "DocGenProcessor"
- ).children.single { it.name == "sample" } as ContentPage
- functionPage.content.assertNode {
- group {
- header(1) { +"sample" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- skipAllNotMatching() //Signature
- }
- after {
- group { pWrapped("a normal comment") }
- group {
- header(4) { +"Return" }
- comment {
- +"empty string when "
- link { +"Hash Map" }
- +" doesn't contain value."
- }
- }
- header(4) { +"Parameters" }
- table {
- group {
- +"testParam"
- comment {
- +"Sample description for test param that has a type of "
- link { +"String" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `return tag in kotlin`() {
- testInline(
- """
- |/src/main/kotlin/sample/sample.kt
- |package sample;
- | /**
- | * a normal comment
- | *
- | * @return empty string when [Hash Map][java.util.HashMap.containsKey] doesn't contain value.
- | *
- | */
- |fun sample(): String {
- | return ""
- | }
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val functionPage = module.findTestType("sample", "sample")
- functionPage.content.assertNode {
- group {
- header(1) { +"sample" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- skipAllNotMatching() //Signature
- }
- after {
- group { pWrapped("a normal comment") }
- group {
- header(4) { +"Return" }
- comment {
- +"empty string when "
- link { +"Hash Map" }
- +" doesn't contain value."
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
-
- @Test
- fun `list with links and description`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * Static library support version of the framework's {@link java.lang.String}.
- | * Used to write apps that run on platforms prior to Android 3.0. When running
- | * on Android 3.0 or above, this implementation is still used; it does not try
- | * to switch to the framework's implementation. See the framework {@link java.lang.String}
- | * documentation for a class overview.
- | *
- | * <p>The main differences when using this support version instead of the framework version are:
- | * <ul>
- | * <li>Your activity must extend {@link java.lang.String FragmentActivity}
- | * <li>You must call {@link java.util.HashMap#containsKey(java.lang.Object) FragmentActivity#getSupportFragmentManager} to get the
- | * {@link java.util.HashMap FragmentManager}
- | * </ul>
- | *
- | */
- |public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage = module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- group {
- comment {
- group {
- +"Static library support version of the framework's "
- link { +"java.lang.String" }
- +". Used to write apps that run on platforms prior to Android 3.0."
- +" When running on Android 3.0 or above, this implementation is still used; it does not try to switch to the framework's implementation. See the framework "
- link { +"java.lang.String" }
- +" documentation for a class overview. " //TODO this probably shouldnt have a space but it is minor
- }
- group {
- +"The main differences when using this support version instead of the framework version are: "
- }
- list {
- group {
- +"Your activity must extend "
- link { +"FragmentActivity" }
- }
- group {
- +"You must call "
- link { +"FragmentActivity#getSupportFragmentManager" }
- +" to get the "
- link { +"FragmentManager" }
- }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `documentation with table`() {
- testInline(
- """
- |/src/main/java/sample/DocGenProcessor.java
- |package sample;
- |/**
- | * <table>
- | * <caption>List of supported types</caption>
- | * <tr>
- | * <td>cell 11</td> <td>cell 21</td>
- | * </tr>
- | * <tr>
- | * <td>cell 12</td> <td>cell 22</td>
- | * </tr>
- | * </table>
- | */
- | public class DocGenProcessor { }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val classPage =
- module.findTestType("sample", "DocGenProcessor")
- classPage.content.assertNode {
- group {
- header { +"DocGenProcessor" }
- platformHinted {
- group {
- skipAllNotMatching() //Signature
- }
- comment {
- table {
- check {
- caption!!.assertNode {
- caption {
- +"List of supported types"
- }
- }
- }
- group {
- group {
- +"cell 11"
- }
- group {
- +"cell 21"
- }
- }
- group {
- group {
- +"cell 12"
- }
- group {
- +"cell 22"
- }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
-
- @Test
- fun `undocumented parameter and other tags`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @author Kordyjan
- | * @since 0.11
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- group { pWrapped("comment to function") }
- unnamedTag("Author") { comment { +"Kordyjan" } }
- unnamedTag("Since") { comment { +"0.11" } }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `single parameter`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @param abc comment to param
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- group { pWrapped("comment to function") }
- header(4) { +"Parameters" }
- table {
- group {
- +"abc"
- check {
- val textStyles = children.single { it is ContentText }.style
- assertContains(textStyles, TextStyle.Underlined)
- }
- group { group { +"comment to param" } }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `single parameter in class`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to class
- | * @param abc comment to param
- | */
- |class Foo(abc: String)
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Foo")
- println(page.content)
- page.content.assertNode {
- group {
- header(1) { +"Foo" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Foo",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- group {
- pWrapped("comment to class")
- }
- header(4) { +"Parameters" }
- table {
- group {
- +"abc"
- check {
- val textStyles = children.single { it is ContentText }.style
- assertContains(textStyles, TextStyle.Underlined)
- }
- group { group { +"comment to param" } }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `multiple parameters`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @param first comment to first param
- | * @param second comment to second param
- | * @param[third] comment to third param
- | */
- |fun function(first: String, second: Int, third: Double) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(), "", "", emptySet(), "function", null,
- "first" to ParamAttributes(emptyMap(), emptySet(), "String"),
- "second" to ParamAttributes(emptyMap(), emptySet(), "Int"),
- "third" to ParamAttributes(emptyMap(), emptySet(), "Double")
- )
- }
- after {
- group { group { group { +"comment to function" } } }
- header(4) { +"Parameters" }
- table {
- group {
- +"first"
- check {
- val textStyles = children.single { it is ContentText }.style
- assertContains(textStyles, TextStyle.Underlined)
- }
- group { group { +"comment to first param" } }
- }
- group {
- +"second"
- check {
- val textStyles = children.single { it is ContentText }.style
- assertContains(textStyles, TextStyle.Underlined)
- }
- group { group { +"comment to second param" } }
- }
- group {
- +"third"
- check {
- val textStyles = children.single { it is ContentText }.style
- assertContains(textStyles, TextStyle.Underlined)
- }
- group { group { +"comment to third param" } }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
-
- @Test
- fun `multiple parameters with not natural order`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @param c comment to c param
- | * @param b comment to b param
- | * @param[a] comment to a param
- | */
- |fun function(c: String, b: Int, a: Double) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(), "", "", emptySet(), "function", null,
- "c" to ParamAttributes(emptyMap(), emptySet(), "String"),
- "b" to ParamAttributes(emptyMap(), emptySet(), "Int"),
- "a" to ParamAttributes(emptyMap(), emptySet(), "Double")
- )
- }
- after {
- group { group { group { +"comment to function" } } }
- header(4) { +"Parameters" }
- table {
- group {
- +"c"
- group { group { +"comment to c param" } }
- }
- group {
- +"b"
- group { group { +"comment to b param" } }
- }
- group {
- +"a"
- group { group { +"comment to a param" } }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `multiple parameters without function description`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @param first comment to first param
- | * @param second comment to second param
- | * @param[third] comment to third param
- | */
- |fun function(first: String, second: Int, third: Double) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(), "", "", emptySet(), "function", null,
- "first" to ParamAttributes(emptyMap(), emptySet(), "String"),
- "second" to ParamAttributes(emptyMap(), emptySet(), "Int"),
- "third" to ParamAttributes(emptyMap(), emptySet(), "Double")
- )
- }
- after {
- header(4) { +"Parameters" }
- table {
- group {
- +"first"
- group { group { +"comment to first param" } }
- }
- group {
- +"second"
- group { group { +"comment to second param" } }
- }
- group {
- +"third"
- group { group { +"comment to third param" } }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `function with receiver`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @param abc comment to param
- | * @receiver comment to receiver
- | */
- |fun String.function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignatureWithReceiver(
- emptyMap(),
- "",
- "",
- emptySet(),
- "String",
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- group { pWrapped("comment to function") }
- group {
- header(4) { +"Receiver" }
- pWrapped("comment to receiver")
- }
- header(4) { +"Parameters" }
- table {
- group {
- +"abc"
- group { group { +"comment to param" } }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `missing parameter documentation`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @param first comment to first param
- | * @param[third] comment to third param
- | */
- |fun function(first: String, second: Int, third: Double) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(), "", "", emptySet(), "function", null,
- "first" to ParamAttributes(emptyMap(), emptySet(), "String"),
- "second" to ParamAttributes(emptyMap(), emptySet(), "Int"),
- "third" to ParamAttributes(emptyMap(), emptySet(), "Double")
- )
- }
- after {
- group { group { group { +"comment to function" } } }
- header(4) { +"Parameters" }
- table {
- group {
- +"first"
- group { group { +"comment to first param" } }
- }
- group {
- +"third"
- group { group { +"comment to third param" } }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `parameters mixed with other tags`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * comment to function
- | * @param first comment to first param
- | * @author Kordyjan
- | * @param second comment to second param
- | * @since 0.11
- | * @param[third] comment to third param
- | */
- |fun function(first: String, second: Int, third: Double) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(), "", "", emptySet(), "function", null,
- "first" to ParamAttributes(emptyMap(), emptySet(), "String"),
- "second" to ParamAttributes(emptyMap(), emptySet(), "Int"),
- "third" to ParamAttributes(emptyMap(), emptySet(), "Double")
- )
- }
- after {
- group { pWrapped("comment to function") }
- unnamedTag("Author") { comment { +"Kordyjan" } }
- unnamedTag("Since") { comment { +"0.11" } }
- header(4) { +"Parameters" }
-
- table {
- group {
- +"first"
- group { group { +"comment to first param" } }
- }
- group {
- +"second"
- group { group { +"comment to second param" } }
- }
- group {
- +"third"
- group { group { +"comment to third param" } }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun javaDocCommentWithDocumentedParameters() {
- testInline(
- """
- |/src/main/java/test/Main.java
- |package test
- | public class Main {
- |
- | /**
- | * comment to function
- | * @param first comment to first param
- | * @param second comment to second param
- | */
- | public void sample(String first, String second) {
- |
- | }
- | }
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val sampleFunction = module.dfs {
- it is MemberPageNode && it.dri.first()
- .toString() == "test/Main/sample/#java.lang.String#java.lang.String/PointingToDeclaration/"
- } as MemberPageNode
- val forJvm = (sampleFunction.documentables.firstOrNull() as DFunction).parameters.mapNotNull {
- val jvm = it.documentation.keys.first { it.analysisPlatform == Platform.jvm }
- it.documentation[jvm]
- }
-
- assertEquals(2, forJvm.size)
- val (first, second) = forJvm.map { it.paramsDescription() }
- assertEquals("comment to first param", first)
- assertEquals("comment to second param", second)
- }
- }
- }
-
- private fun DocumentationNode.paramsDescription(): String =
- children.firstIsInstanceOrNull<Param>()?.root?.children?.first()?.children?.firstIsInstanceOrNull<Text>()?.body.orEmpty()
-
-}
diff --git a/plugins/base/src/test/kotlin/content/properties/ContentForClassWithParamsAndPropertiesTest.kt b/plugins/base/src/test/kotlin/content/properties/ContentForClassWithParamsAndPropertiesTest.kt
deleted file mode 100644
index d244567f..00000000
--- a/plugins/base/src/test/kotlin/content/properties/ContentForClassWithParamsAndPropertiesTest.kt
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.properties
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.RootPageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContentForClassWithParamsAndPropertiesTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- fun `should work for a simple property`() {
- propertyTest { rootPage ->
- val node = rootPage.dfs { it.name == "LoadInitialParams" } as ClasslikePageNode
- val actualDocsForPlaceholdersEnabled =
- (node.documentables.firstOrNull() as DClass).constructors.first().parameters.find { it.name == "placeholdersEnabled" }
- ?.documentation?.entries?.first()?.value
- assertEquals(DocumentationNode(listOf(docsForPlaceholdersEnabled)), actualDocsForPlaceholdersEnabled)
- }
- }
-
- @Test
- fun `should work for a simple with linebreak`() {
- propertyTest { rootPage ->
- val node = rootPage.dfs { it.name == "LoadInitialParams" } as ClasslikePageNode
- val actualDocsForRequestedLoadSize =
- (node.documentables.firstOrNull() as DClass).constructors.first().parameters.find { it.name == "requestedLoadSize" }
- ?.documentation?.entries?.first()?.value
- assertEquals(DocumentationNode(listOf(docsForRequestedLoadSize)), actualDocsForRequestedLoadSize)
- }
- }
-
- @Test
- fun `should work with multiline property inline code`() {
- propertyTest { rootPage ->
- val node = rootPage.dfs { it.name == "LoadInitialParams" } as ClasslikePageNode
-
- val actualDocsForRequestedInitialKey =
- (node.documentables.firstOrNull() as DClass).constructors.first().parameters.find { it.name == "requestedInitialKey" }
- ?.documentation?.entries?.first()?.value
- assertEquals(DocumentationNode(listOf(docsForRequestedInitialKey)), actualDocsForRequestedInitialKey)
- }
- }
-
- @Test
- fun `constructor should only the param and constructor tags`() {
- propertyTest { rootPage ->
- val constructorDocs = Description(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Creates an empty group.")
- )
- )
- ),
- emptyMap(), "MARKDOWN_FILE"
- )
- )
- val node = rootPage.dfs { it.name == "LoadInitialParams" } as ClasslikePageNode
-
- val actualDocs =
- (node.documentables.firstOrNull() as DClass).constructors.first().documentation.entries.first().value
- assertEquals(DocumentationNode(listOf(constructorDocs, docsForParam)), actualDocs)
- }
- }
-
- @Test
- fun `class should have all tags`() {
- propertyTest { rootPage ->
- val ownDescription = Description(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Holder object for inputs to loadInitial.")
- )
- )
- ),
- emptyMap(), "MARKDOWN_FILE"
- )
- )
- val node = rootPage.dfs { it.name == "LoadInitialParams" } as ClasslikePageNode
-
- val actualDocs =
- (node.documentables.firstOrNull() as DClass).documentation.entries.first().value
- assertEquals(
- DocumentationNode(
- listOf(
- ownDescription,
- docsForParam,
- docsForRequestedInitialKey,
- docsForRequestedLoadSize,
- docsForPlaceholdersEnabled,
- docsForConstructor
- )
- ),
- actualDocs
- )
- }
- }
-
- @Test
- fun `property should also work with own docs that override the param tag`() {
- propertyTest { rootPage ->
- val ownDescription = Description(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Own docs")
- )
- )
- ),
- emptyMap(), "MARKDOWN_FILE"
- )
- )
- val node = rootPage.dfs { it.name == "ItemKeyedDataSource" } as ClasslikePageNode
-
- val actualDocs =
- (node.documentables.firstOrNull() as DClass).properties.first().documentation.entries.first().value
- assertEquals(
- DocumentationNode(listOf(ownDescription)),
- actualDocs
- )
- }
- }
-
-
- private fun propertyTest(block: (RootPageNode) -> Unit) {
- testInline(
- """ |/src/main/kotlin/test/source.kt
- |package test
- |/**
- | * @property tested Docs from class
- | */
- |abstract class ItemKeyedDataSource<Key : Any, Value : Any> : DataSource<Key, Value>(ITEM_KEYED) {
- | /**
- | * Own docs
- | */
- | val tested = ""
- |
- | /**
- | * Holder object for inputs to loadInitial.
- | *
- | * @param Key Type of data used to query Value types out of the DataSource.
- | * @property requestedInitialKey Load items around this key, or at the beginning of the data set
- | * if `null` is passed.
- | *
- | * Note that this key is generally a hint, and may be ignored if you want to always load from
- | * the beginning.
- | * @property requestedLoadSize Requested number of items to load.
- | *
- | * Note that this may be larger than available data.
- | * @property placeholdersEnabled Defines whether placeholders are enabled, and whether the
- | * loaded total count will be ignored.
- | *
- | * @constructor Creates an empty group.
- | */
- | open class LoadInitialParams<Key : Any>(
- | @JvmField
- | val requestedInitialKey: Key?,
- | @JvmField
- | val requestedLoadSize: Int,
- | @JvmField
- | val placeholdersEnabled: Boolean
- | )
- |}""".trimIndent(), testConfiguration
- ) {
- pagesGenerationStage = block
- }
- }
-
- private val docsForPlaceholdersEnabled = Property(
- root = CustomDocTag(
- listOf(
- P(
- children = listOf(
- Text("Defines whether placeholders are enabled, and whether the loaded total count will be ignored.")
- )
- )
- ), emptyMap(), "MARKDOWN_FILE"
- ),
- name = "placeholdersEnabled"
- )
-
- private val docsForRequestedInitialKey = Property(
- root = CustomDocTag(
- listOf(
- P(
- children = listOf(
- Text("Load items around this key, or at the beginning of the data set if "),
- CodeInline(
- listOf(
- Text("null")
- )
- ),
- Text(" is passed.")
- ),
- params = emptyMap()
- ),
- P(
- children = listOf(
- Text("Note that this key is generally a hint, and may be ignored if you want to always load from the beginning.")
- )
- )
- ), emptyMap(), "MARKDOWN_FILE"
- ),
- name = "requestedInitialKey"
- )
-
- private val docsForRequestedLoadSize = Property(
- root = CustomDocTag(
- listOf(
- P(
- children = listOf(
- Text("Requested number of items to load.")
- )
- ),
- P(
- children = listOf(
- Text("Note that this may be larger than available data.")
- )
- )
- ), emptyMap(), "MARKDOWN_FILE"
- ),
- name = "requestedLoadSize"
- )
-
- private val docsForConstructor = Constructor(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Creates an empty group.")
- )
- )
- ),
- emptyMap(), "MARKDOWN_FILE"
- )
- )
-
- private val docsForParam = Param(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Type of data used to query Value types out of the DataSource.")
- )
- )
- ),
- emptyMap(), "MARKDOWN_FILE"
- ),
- name = "Key"
- )
-}
-
diff --git a/plugins/base/src/test/kotlin/content/receiver/ContentForReceiverTest.kt b/plugins/base/src/test/kotlin/content/receiver/ContentForReceiverTest.kt
deleted file mode 100644
index d94c1106..00000000
--- a/plugins/base/src/test/kotlin/content/receiver/ContentForReceiverTest.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.receiver
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.Receiver
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.pages.ContentHeader
-import org.jetbrains.dokka.pages.ContentText
-import org.jetbrains.dokka.pages.MemberPageNode
-import utils.docs
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-
-class ContentForReceiverTest: BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- fun `should have docs for receiver`(){
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |/**
- | * docs
- | * @receiver docs for string
- | */
- |fun String.asd2(): String = this
- """.trimIndent(),
- testConfiguration
- ){
- documentablesTransformationStage = { module ->
- with(module.packages.flatMap { it.functions }.first()){
- val receiver = docs().firstOrNull { it is Receiver }
- assertNotNull(receiver)
- val content = receiver.dfs { it is Text } as Text
- assertEquals("docs for string", content.body)
- }
- }
- pagesTransformationStage = { rootPageNode ->
- val functionPage = rootPageNode.dfs { it is MemberPageNode } as MemberPageNode
- val header = functionPage.content.dfs { it is ContentHeader && it.children.firstOrNull() is ContentText }
- val text = functionPage.content.dfs { it is ContentText && it.text == "docs for string" }
-
- assertNotNull(header)
- assertNotNull(text)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/samples/ContentForSamplesTest.kt b/plugins/base/src/test/kotlin/content/samples/ContentForSamplesTest.kt
deleted file mode 100644
index d166d8f8..00000000
--- a/plugins/base/src/test/kotlin/content/samples/ContentForSamplesTest.kt
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.samples
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.base.transformers.pages.KOTLIN_PLAYGROUND_SCRIPT
-import org.jetbrains.dokka.model.DisplaySourceSet
-import utils.TestOutputWriterPlugin
-import utils.assertContains
-import utils.classSignature
-import utils.findTestType
-import java.nio.file.Paths
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-
-class ContentForSamplesTest : BaseAbstractTest() {
- private val testDataDir = getTestDataDir("content/samples").toAbsolutePath()
-
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- samples = listOf(
- Paths.get("$testDataDir/samples.kt").toString(),
- )
- }
- }
- }
-
- private val mppTestConfiguration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- samples = listOf(
- Paths.get("$testDataDir/samples.kt").toString(),
- )
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- samples = listOf(
- Paths.get("$testDataDir/samples.kt").toString(),
- )
- }
- sourceSet {
- name = "linuxX64"
- displayName = "linuxX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/linuxX64Main/kotlin/pageMerger/Test.kt")
- samples = listOf(
- Paths.get("$testDataDir/samples.kt").toString(),
- )
- }
- }
- }
-
- @Test
- fun `samples block is rendered in the description`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- | /**
- | * @sample [test.sampleForClassDescription]
- | */
- |class Foo
- """.trimIndent(), testConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Foo")
- assertContains(page.embeddedResources, KOTLIN_PLAYGROUND_SCRIPT)
- page.content.assertNode {
- group {
- header(1) { +"Foo" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Foo"
- )
- header(4) { +"Samples" }
- group {
- codeBlock {
- +"""|
- |fun main() {
- | //sampleStart
- | print("Hello")
- | //sampleEnd
- |}""".trimMargin()
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- renderingStage = { _, _ ->
- assertNotEquals(-1, writerPlugin.writer.contents["root/test/-foo/index.html"]?.indexOf(KOTLIN_PLAYGROUND_SCRIPT))
- }
- }
- }
-
- @Test
- fun `multiplatofrm class with samples in few platforms`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @sample [test.sampleForClassDescription]
- |*/
- |expect open class Parent
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @sample unresolved
- |*/
- |actual open class Parent
- |
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual open class Parent
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- assertContains(page.embeddedResources, KOTLIN_PLAYGROUND_SCRIPT)
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"expect open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- header(4) { +"Samples" }
- group {
- codeBlock {
- +"""|
- |fun main() {
- | //sampleStart
- | print("Hello")
- | //sampleEnd
- |}""".trimMargin()
- }
- check {
- sourceSets.assertSourceSet("common")
- }
- }
- group {
- +"unresolved"
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-}
-
-
-private fun Set<DisplaySourceSet>.assertSourceSet(expectedName: String) {
- assertEquals(1, this.size)
- assertEquals(expectedName, this.first().name)
-}
diff --git a/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt b/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt
deleted file mode 100644
index fb72178b..00000000
--- a/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt
+++ /dev/null
@@ -1,866 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.seealso
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.ContentDRILink
-import utils.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContentForSeeAlsoTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- analysisPlatform = "jvm"
- }
- }
- }
-
- private val mppTestConfiguration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "linuxX64"
- displayName = "linuxX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/linuxX64Main/kotlin/pageMerger/Test.kt")
- }
- }
- }
-
- @Test
- fun `undocumented function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `undocumented seealso`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"abc" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `undocumented seealso without reference for class`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc
- | */
- |class Foo()
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Foo")
- println(page.content)
- page.content.assertNode {
- group {
- header(1) { +"Foo" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Foo"
- )
- header(4) { +"See also" }
- table {
- group {
- +"abc"
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @OnlyDescriptors("No link for `abc` in K1")
- @Test
- fun `undocumented seealso with reference to parameter for class`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc
- | */
- |class Foo(abc: String)
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Foo")
- println(page.content)
- page.content.assertNode {
- group {
- header(1) { +"Foo" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Foo",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- header(4) { +"See also" }
- table {
- group {
- +"abc" // link { +"abc" }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @OnlyDescriptors("issue #3179")
- @Test
- fun `undocumented seealso with reference to property for class`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc
- | */
- |class Foo(val abc: String)
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Foo")
- println(page.content)
- page.content.assertNode {
- group {
- header(1) { +"Foo" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Foo",
- "val abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- header(4) { +"See also" }
- table {
- group {
- link { +"Foo.abc" }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `documented seealso`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc Comment to abc
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"abc" }
- group {
- group { +"Comment to abc" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @OnlyDescriptors("issue #3179")
- @Test
- fun `documented seealso with reference to property for class`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc Comment to abc
- | */
- |class Foo(val abc: String)
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "Foo")
- println(page.content)
- page.content.assertNode {
- group {
- header(1) { +"Foo" }
- platformHinted {
- classSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "Foo",
- "val abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- header(4) { +"See also" }
- table {
- group {
- link { +"Foo.abc" }
- group {
- group { +"Comment to abc" }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `should use fully qualified name for unresolved link`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see com.example.NonExistingClass description for non-existing
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- +"com.example.NonExistingClass"
- group {
- group { +"description for non-existing" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `undocumented seealso with stdlib link`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see Collection
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- link {
- check {
- assertEquals(
- "kotlin.collections/Collection///PointingToDeclaration/",
- (this as ContentDRILink).address.toString()
- )
- }
- +"Collection"
- }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `documented seealso with stdlib link`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see Collection Comment to stdliblink
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"Collection" }
- group {
- group { +"Comment to stdliblink" }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `documented seealso with stdlib link with other tags`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * random comment
- | * @see Collection Comment to stdliblink
- | * @author pikinier20
- | * @since 0.11
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- group { comment { +"random comment" } }
- unnamedTag("Author") { comment { +"pikinier20" } }
- unnamedTag("Since") { comment { +"0.11" } }
-
- header(4) { +"See also" }
- table {
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"Collection" }
- group {
- group { +"Comment to stdliblink" }
- }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `documented multiple see also`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc Comment to abc1
- | * @see abc Comment to abc2
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"abc" }
- group {
- group { +"Comment to abc2" }
- }
- }
- }
-
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `documented multiple see also mixed source`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- | /**
- | * @see abc Comment to abc1
- | * @see[Collection] Comment to collection
- | */
- |fun function(abc: String) {
- | println(abc)
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("test", "function")
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- null,
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"abc" }
- group {
- group { +"Comment to abc1" }
- }
- }
- group {
- //DRI should be "test//abc/#/-1/"
- link { +"Collection" }
- group { group { +"Comment to collection" } }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `should prefix static function and property links with class name`() {
- testInline(
- """
- |/src/main/kotlin/com/example/package/CollectionExtensions.kt
- |package com.example.util
- |
- |object CollectionExtensions {
- | val property = "Hi"
- | fun emptyList() {}
- |}
- |
- |/src/main/kotlin/com/example/foo.kt
- |package com.example
- |
- |import com.example.util.CollectionExtensions.property
- |import com.example.util.CollectionExtensions.emptyList
- |
- |/**
- | * @see [property] static property
- | * @see [emptyList] static emptyList
- | */
- |fun function() {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("com.example", "function")
-
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = emptySet(),
- name = "function",
- returnType = null,
- )
- }
- after {
- header(4) { +"See also" }
- table {
- group {
- link { +"CollectionExtensions.property" }
- group {
- group { +"static property" }
- }
- }
- group {
- link { +"CollectionExtensions.emptyList" }
- group {
- group { +"static emptyList" }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `multiplatform class with seealso in few platforms`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/**
- |* @see Unit
- |*/
- |expect open class Parent
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |val x = 0
- |/**
- |* @see x resolved
- |* @see y unresolved
- |*/
- |actual open class Parent
- |
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual open class Parent
- |
- """.trimMargin(),
- mppTestConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.findTestType("pageMerger", "Parent")
- page.content.assertNode {
- group {
- header(1) { +"Parent" }
- platformHinted {
- group {
- +"expect open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- group {
- +"actual open class "
- link {
- +"Parent"
- }
- }
- header(4) {
- +"See also"
- check {
- assertEquals(2, sourceSets.size)
- }
- }
- table {
- group {
- link { +"Unit" }
- check {
- sourceSets.assertSourceSet("common")
- }
- }
- group {
- link { +"Unit" }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- group {
- link { +"x" }
- group { group { +"resolved" } }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
- group {
- +"y"
- group { group { +"unresolved" } }
- check {
- sourceSets.assertSourceSet("jvm")
- }
- }
-
- check {
- assertEquals(2, sourceSets.size)
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-}
-
-private fun Set<DisplaySourceSet>.assertSourceSet(expectedName: String) {
- assertEquals(1, this.size)
- assertEquals(expectedName, this.first().name)
-}
diff --git a/plugins/base/src/test/kotlin/content/signatures/ConstructorsSignaturesTest.kt b/plugins/base/src/test/kotlin/content/signatures/ConstructorsSignaturesTest.kt
deleted file mode 100644
index 9a413e0e..00000000
--- a/plugins/base/src/test/kotlin/content/signatures/ConstructorsSignaturesTest.kt
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.signatures
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.pages.BasicTabbedContentType
-import org.jetbrains.dokka.pages.ContentPage
-import kotlin.test.Test
-import utils.OnlyDescriptors
-
-class ConstructorsSignaturesTest : BaseAbstractTest() {
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- @Test
- fun `class name without parenthesis`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class SomeClass
- |
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `class name with empty parenthesis`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class SomeClass()
- |
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `class with a parameter`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class SomeClass(a: String)
- |
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- +"("
- group {
- group {
- +"a: "
- group { link { +"String" } }
- }
- }
- +")"
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @Test
- fun `class with a val parameter`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class SomeClass(val a: String, var i: Int)
- |
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- +"("
- group {
- group {
- +"val a: "
- group { link { +"String" } }
- +", "
- }
- group {
- +"var i: "
- group { link { +"Int" } }
- }
- }
- +")"
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- @OnlyDescriptors("Order of constructors is different in K2")
- @Test
- fun `class with a parameterless secondary constructor`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class SomeClass(a: String) {
- | constructor()
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- +"("
- group {
- group {
- +"a: "
- group { link { +"String" } }
- }
- }
- +")"
- }
- }
- }
- tabbedGroup {
- group {
- tab(BasicTabbedContentType.CONSTRUCTOR) {
- header { +"Constructors" }
- table {
- group {
- link { +"SomeClass" }
- platformHinted {
- group {
- +"constructor"
- +"("
- +")"
- }
- group {
- +"constructor"
- +"("
- group {
- group {
- +"a: "
- group { link { +"String" } }
- }
- }
- +")"
- }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
- }
-
-
- @OnlyDescriptors("Order of constructors is different in K2")
- @Test
- fun `class with a few documented constructors`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- | /**
- | * some comment
- | * @constructor ctor comment
- | **/
- |class SomeClass(a: String){
- | /**
- | * ctor one
- | **/
- | constructor(): this("")
- |
- | /**
- | * ctor two
- | **/
- | constructor(b: Int): this("")
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- +"("
- group {
- group {
- +"a: "
- group { link { +"String" } }
- }
- }
- +")"
- }
- skipAllNotMatching()
- }
- }
- tabbedGroup {
- group {
- tab(BasicTabbedContentType.CONSTRUCTOR) {
- header { +"Constructors" }
- table {
- group {
- link { +"SomeClass" }
- platformHinted {
- group {
- +"constructor"
- +"("
- +")"
- }
- group {
- group {
- group { +"ctor one" }
- }
- }
- group {
- +"constructor"
- +"("
- group {
- group {
- +"b: "
- group {
- link { +"Int" }
- }
- }
- }
- +")"
- }
- group {
- group {
- group { +"ctor two" }
- }
- }
- group {
- +"constructor"
- +"("
- group {
- group {
- +"a: "
- group {
- link { +"String" }
- }
- }
- }
- +")"
- }
- group {
- group {
- group { +"ctor comment" }
- }
- }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
- }
-
- @Test
- fun `class with explicitly documented constructor`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- | /**
- | * some comment
- | * @constructor ctor comment
- | **/
- |class SomeClass(a: String)
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "SomeClass" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"SomeClass" }
- platformHinted {
- group {
- +"class "
- link { +"SomeClass" }
- +"("
- group {
- group {
- +"a: "
- group { link { +"String" } }
- }
- }
- +")"
- }
- skipAllNotMatching()
- }
- }
- tabbedGroup {
- group {
- tab(BasicTabbedContentType.CONSTRUCTOR) {
- header { +"Constructors" }
- table {
- group {
- link { +"SomeClass" }
- platformHinted {
- group {
- +"constructor"
- +"("
- group {
- group {
- +"a: "
- group {
- link { +"String" }
- }
- }
- }
- +")"
- }
- group {
- group {
- group { +"ctor comment" }
- }
- }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
- }
-
- @Test
- fun `should render primary constructor, but not constructors block for annotation class`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |annotation class MyAnnotation(val param: String) {}
- """.trimIndent(),
- testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "MyAnnotation" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"MyAnnotation" }
- platformHinted {
- group {
- +"annotation class "
- link { +"MyAnnotation" }
- +"("
- group {
- group {
- +"val param: "
- group { link { +"String" } }
- }
- }
- +")"
- }
- }
- }
- group {
- group {
- group {
- header { +"Properties" }
- table {
- skipAllNotMatching()
- }
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt b/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt
deleted file mode 100644
index 8af9e082..00000000
--- a/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.signatures
-
-import matchers.content.*
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.PackagePageNode
-import utils.ParamAttributes
-import utils.bareSignature
-import utils.propertySignature
-import utils.typealiasSignature
-import kotlin.test.Test
-
-class ContentForSignaturesTest : BaseAbstractTest() {
-
- private val testConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PRIVATE,
- DokkaConfiguration.Visibility.PROTECTED,
- DokkaConfiguration.Visibility.INTERNAL,
- )
- }
- }
- }
-
- @Test
- fun `function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- emptySet(),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `private function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |private fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "private",
- "",
- emptySet(),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `open function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |open fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "open",
- emptySet(),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `function without parameters`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |fun function(): String {
- | return "Hello"
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = emptySet(),
- name = "function",
- returnType = "String",
- )
- }
- }
- }
-
- }
- }
- }
- }
-
-
- @Test
- fun `suspend function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |suspend fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "",
- "",
- setOf("suspend"),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `protected open suspend function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |protected open suspend fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "protected",
- "open",
- setOf("suspend"),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `protected open suspend inline function`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |protected open suspend inline fun function(abc: String): String {
- | return "Hello, " + abc
- |}
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" }
- .children.single { it.name == "function" } as ContentPage
- page.content.assertNode {
- group {
- header(1) { +"function" }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- bareSignature(
- emptyMap(),
- "protected",
- "open",
- setOf("inline", "suspend"),
- "function",
- "String",
- "abc" to ParamAttributes(emptyMap(), emptySet(), "String")
- )
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `property`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |val property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(emptyMap(), "", "", emptySet(), "val", "property", "Int", "6")
- }
- }
- }
- }
-
- @Test
- fun `const property`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |const val property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(emptyMap(), "", "", setOf("const"), "val", "property", "Int", "6")
- }
- }
- }
- }
-
- @Test
- fun `protected property`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |protected val property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(emptyMap(), "protected", "", emptySet(), "val", "property", "Int", "6")
- }
- }
- }
- }
-
- @Test
- fun `protected lateinit property`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |protected lateinit var property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(emptyMap(), "protected", "", setOf("lateinit"), "var", "property", "Int", null)
- }
- }
- }
- }
-
- @Test
- fun `should not display default value for mutable property`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |var property: Int = 6
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- propertySignature(
- annotations = emptyMap(),
- visibility = "",
- modifier = "",
- keywords = setOf(),
- preposition = "var",
- name = "property",
- type = "Int",
- value = null
- )
- }
- }
- }
- }
-
- @Test
- fun `typealias to String`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |typealias Alias = String
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- typealiasSignature("Alias", "String")
- }
- }
- }
- }
-
- @Test
- fun `typealias to Int`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |typealias Alias = Int
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- typealiasSignature("Alias", "Int")
- }
- }
- }
- }
-
- @Test
- fun `typealias to type in same package`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |typealias Alias = X
- |class X
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- typealiasSignature("Alias", "X")
- }
- }
- }
- }
-
- @Test
- fun `typealias to type in different package`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |import other.X
- |typealias Alias = X
- |
- |/src/main/kotlin/test/source2.kt
- |package other
- |class X
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- typealiasSignature("Alias", "X")
- }
- }
- }
- }
-
- @Test
- fun `typealias to type in different package with same name`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |typealias Alias = other.Alias
- |
- |/src/main/kotlin/test/source2.kt
- |package other
- |class Alias
- """.trimIndent(), testConfiguration
- ) {
- pagesTransformationStage = { module ->
- val page = module.children.single { it.name == "test" } as PackagePageNode
- page.content.assertNode {
- typealiasSignature("Alias", "other.Alias")
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/content/typealiases/TypealiasTest.kt b/plugins/base/src/test/kotlin/content/typealiases/TypealiasTest.kt
deleted file mode 100644
index 4015e0f4..00000000
--- a/plugins/base/src/test/kotlin/content/typealiases/TypealiasTest.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package content.typealiases
-
-import matchers.content.*
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.PlatformHintedContent
-import utils.assertNotNull
-import kotlin.test.Test
-
-
-class TypealiasTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(commonStdlibPath!!, jvmStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- @Test
- fun `typealias should have a dedicated page with full documentation`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | /**
- | * Brief text
- | *
- | * some text
- | *
- | * @see String
- | * @throws Unit
- | */
- | typealias A = String
- """,
- configuration
- ) {
- pagesTransformationStage = { module ->
- val content = (module.dfs { it.name == "A" } as ClasslikePageNode).content
- val platformHinted = content.dfs { it is PlatformHintedContent }
- platformHinted.assertNotNull("platformHinted").assertNode {
- group {
- group {
- group {
- +"typealias "
- group { group { link { +"A" } } }
- +" = "
- group { link { +"String" } }
- }
- }
-
- group {
- group {
- group {
- group { +"Brief text" }
- group { +"some text" }
- }
- }
- }
-
- header { +"See also" }
- table {
- group { link { +"String" } }
- }
-
- header { +"Throws" }
- table {
- group { group { link { +"Unit" } } }
- }
- }
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/enums/JavaEnumsTest.kt b/plugins/base/src/test/kotlin/enums/JavaEnumsTest.kt
deleted file mode 100644
index 39c893e9..00000000
--- a/plugins/base/src/test/kotlin/enums/JavaEnumsTest.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package enums
-
-import org.jetbrains.dokka.SourceLinkDefinitionImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import signatures.renderedContent
-import utils.TestOutputWriterPlugin
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavaEnumsTest : BaseAbstractTest() {
-
- private val basicConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- // Shouldn't try to give source links to synthetic methods (values, valueOf) if any are present
- // https://github.com/Kotlin/dokka/issues/2544
- @Test
- fun `java enum with configured source links should not fail build due to any synthetic methods`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- sourceLinks = listOf(
- SourceLinkDefinitionImpl(
- localDirectory = "src/main/java",
- remoteUrl = URL("https://github.com/user/repo/tree/master/src/main/java"),
- remoteLineSuffix = "#L"
- )
- )
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/java/basic/JavaEnum.java
- |package testpackage
- |
- |/**
- |* doc
- |*/
- |public enum JavaEnum {
- | ONE, TWO, THREE
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val enumPage = writerPlugin.writer.renderedContent("root/testpackage/-java-enum/index.html")
- val sourceLink = enumPage.select(".symbol .floating-right")
- .select("a[href]")
- .attr("href")
-
-
- assertEquals(
- "https://github.com/user/repo/tree/master/src/main/java/basic/JavaEnum.java#L6",
- sourceLink
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/enums/KotlinEnumsTest.kt b/plugins/base/src/test/kotlin/enums/KotlinEnumsTest.kt
deleted file mode 100644
index c32a5cc2..00000000
--- a/plugins/base/src/test/kotlin/enums/KotlinEnumsTest.kt
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package enums
-
-import matchers.content.*
-import org.jetbrains.dokka.SourceLinkDefinitionImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DEnum
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.ClasslikePage
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.ContentGroup
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import signatures.renderedContent
-import utils.*
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
-
-class KotlinEnumsTest : BaseAbstractTest() {
-
- @Test
- fun `should preserve enum source ordering for documentables`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package testpackage
- |
- |enum class TestEnum {
- | ZERO,
- | ONE,
- | TWO,
- | THREE,
- | FOUR,
- | FIVE,
- | SIX,
- | SEVEN,
- | EIGHT,
- | NINE
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- documentablesTransformationStage = { module ->
- val testPackage = module.packages[0]
- assertEquals("testpackage", testPackage.name)
-
- val testEnum = testPackage.classlikes[0] as DEnum
- assertEquals("TestEnum", testEnum.name)
-
- val enumEntries = testEnum.entries
- assertEquals(10, enumEntries.count())
-
- assertEquals("ZERO", enumEntries[0].name)
- assertEquals("ONE", enumEntries[1].name)
- assertEquals("TWO", enumEntries[2].name)
- assertEquals("THREE", enumEntries[3].name)
- assertEquals("FOUR", enumEntries[4].name)
- assertEquals("FIVE", enumEntries[5].name)
- assertEquals("SIX", enumEntries[6].name)
- assertEquals("SEVEN", enumEntries[7].name)
- assertEquals("EIGHT", enumEntries[8].name)
- assertEquals("NINE", enumEntries[9].name)
- }
- }
- }
-
- @Test
- fun `should preserve enum source ordering for generated pages`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package testpackage
- |
- |enum class TestEnum {
- | ZERO,
- | ONE,
- | TWO,
- | THREE,
- | FOUR,
- | FIVE,
- | SIX,
- | SEVEN,
- | EIGHT,
- | NINE
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- pagesGenerationStage = { rootPage ->
- val packagePage = rootPage.children[0]
- assertEquals("testpackage", packagePage.name)
-
- val testEnumNode = packagePage.children[0]
- assertEquals("TestEnum", testEnumNode.name)
-
- val enumEntries = testEnumNode.children.filterIsInstance<ClasslikePage>()
- assertEquals(10, enumEntries.size)
-
- assertEquals("ZERO", enumEntries[0].name)
- assertEquals("ONE", enumEntries[1].name)
- assertEquals("TWO", enumEntries[2].name)
- assertEquals("THREE", enumEntries[3].name)
- assertEquals("FOUR", enumEntries[4].name)
- assertEquals("FIVE", enumEntries[5].name)
- assertEquals("SIX", enumEntries[6].name)
- assertEquals("SEVEN", enumEntries[7].name)
- assertEquals("EIGHT", enumEntries[8].name)
- assertEquals("NINE", enumEntries[9].name)
- }
- }
- }
-
- @Test
- fun `should preserve enum source ordering for rendered entries`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package testpackage
- |
- |enum class TestEnum {
- | ZERO,
- | ONE,
- | TWO,
- | THREE,
- | FOUR,
- | FIVE,
- | SIX,
- | SEVEN,
- | EIGHT,
- | NINE
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val enumEntriesOnPage = writerPlugin.writer.renderedContent("root/testpackage/-test-enum/index.html")
- .select("div[data-togglable=ENTRY] .table")
- .select("div.table-row")
- .select("div.keyValue")
- .select("div.title")
- .select("a")
-
- val enumEntries = enumEntriesOnPage.map { it.text() }
- assertEquals(10, enumEntries.size)
-
- assertEquals("ZERO", enumEntries[0])
- assertEquals("ONE", enumEntries[1])
- assertEquals("TWO", enumEntries[2])
- assertEquals("THREE", enumEntries[3])
- assertEquals("FOUR", enumEntries[4])
- assertEquals("FIVE", enumEntries[5])
- assertEquals("SIX", enumEntries[6])
- assertEquals("SEVEN", enumEntries[7])
- assertEquals("EIGHT", enumEntries[8])
- assertEquals("NINE", enumEntries[9])
- }
- }
- }
-
- @Test
- fun `should preserve enum source ordering for navigation menu`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package testpackage
- |
- |enum class TestEnum {
- | ZERO,
- | ONE,
- | TWO,
- | THREE,
- | FOUR,
- | FIVE,
- | SIX,
- | SEVEN,
- | EIGHT,
- | NINE
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val sideMenu = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
-
- assertEquals("ZERO", sideMenu.select("#root-nav-submenu-0-0-0").text())
- assertEquals("ONE", sideMenu.select("#root-nav-submenu-0-0-1").text())
- assertEquals("TWO", sideMenu.select("#root-nav-submenu-0-0-2").text())
- assertEquals("THREE", sideMenu.select("#root-nav-submenu-0-0-3").text())
- assertEquals("FOUR", sideMenu.select("#root-nav-submenu-0-0-4").text())
- assertEquals("FIVE", sideMenu.select("#root-nav-submenu-0-0-5").text())
- assertEquals("SIX", sideMenu.select("#root-nav-submenu-0-0-6").text())
- assertEquals("SEVEN", sideMenu.select("#root-nav-submenu-0-0-7").text())
- assertEquals("EIGHT", sideMenu.select("#root-nav-submenu-0-0-8").text())
- assertEquals("NINE", sideMenu.select("#root-nav-submenu-0-0-9").text())
- }
- }
- }
-
- fun TestOutputWriter.navigationHtml(): Element = contents.getValue("navigation.html").let { Jsoup.parse(it) }
-
- @Test
- fun `should handle companion object within enum`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package testpackage
- |
- |enum class TestEnum {
- | E1,
- | E2;
- | companion object {}
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesTransformationStage = { m ->
- m.packages.let { p ->
- assertTrue(p.isNotEmpty(), "Package list cannot be empty")
- p.first().classlikes.let { c ->
- assertTrue(c.isNotEmpty(), "Classlikes list cannot be empty")
-
- val enum = c.first() as DEnum
- assertNotNull(enum.companion)
- }
- }
- }
- }
- }
-
- @Test
- fun enumWithMethods() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/TestEnum.kt
- |package testpackage
- |
- |
- |interface Sample {
- | fun toBeImplemented(): String
- |}
- |
- |enum class TestEnum: Sample {
- | E1 {
- | override fun toBeImplemented(): String = "e1"
- | }
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesTransformationStage = { m ->
- m.packages.let { p ->
- p.first().classlikes.let { c ->
- val enum = c.first { it is DEnum } as DEnum
- val first = enum.entries.first()
-
- assertNotNull(first.functions.find { it.name == "toBeImplemented" })
- }
- }
- }
- }
- }
-
- @Test
- @OnlyDescriptors("K2 has `compareTo`, that should be suppressed, due to #3196")
- fun `enum should have functions on page`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/TestEnum.kt
- |package testpackage
- |
- |
- |interface Sample {
- | fun toBeImplemented(): String
- |}
- |
- |enum class TestEnum: Sample {
- | E1 {
- | override fun toBeImplemented(): String = "e1"
- | }
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = { root ->
- root.contentPage<ClasslikePageNode>("E1") {
- assertHasFunctions("toBeImplemented")
- }
-
- root.contentPage<ClasslikePageNode>("TestEnum") {
- assertHasFunctions("toBeImplemented", "valueOf", "values")
- }
- }
- }
- }
-
- @Test
- fun enumWithAnnotationsOnEntries() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/TestEnum.kt
- |package testpackage
- |
- |enum class TestEnum {
- | /**
- | Sample docs for E1
- | **/
- | @SinceKotlin("1.3") // This annotation is transparent due to lack of @MustBeDocumented annotation
- | E1
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = { m ->
- val entryNode = m.children.first { it.name == "testpackage" }.children.first { it.name == "TestEnum" }.children.filterIsInstance<ClasslikePageNode>().first()
- val signature = (entryNode.content as ContentGroup).dfs { it is ContentGroup && it.dci.toString() == "[testpackage/TestEnum.E1///PointingToDeclaration/{\"org.jetbrains.dokka.links.EnumEntryDRIExtra\":{\"key\":\"org.jetbrains.dokka.links.EnumEntryDRIExtra\"}}][Cover]" } as ContentGroup
-
- signature.assertNode {
- header(1) { +"E1" }
- platformHinted {
- group {
- group {
- link { +"E1" }
- }
- }
- group {
- group {
- group {
- +"Sample docs for E1"
- }
- }
- }
- }
- }
- }
- }
- }
-
- // Shouldn't try to give source links to synthetic methods (values, valueOf) if any are present
- // Initially reported for Java, making sure it doesn't fail for Kotlin either
- // https://github.com/Kotlin/dokka/issues/2544
- @Test
- fun `kotlin enum with configured source links should not fail the build due to synthetic methods`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- sourceLinks = listOf(
- SourceLinkDefinitionImpl(
- localDirectory = "src/main/kotlin",
- remoteUrl = URL("https://github.com/user/repo/tree/master/src/main/kotlin"),
- remoteLineSuffix = "#L"
- )
- )
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/basic/KotlinEnum.kt
- |package testpackage
- |
- |/**
- |* Doc
- |*/
- |enum class KotlinEnum {
- | ONE, TWO, THREE
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val sourceLink = writerPlugin.writer.renderedContent("root/testpackage/-kotlin-enum/index.html")
- .select(".symbol .floating-right")
- .select("a[href]")
- .attr("href")
-
- assertEquals(
- "https://github.com/user/repo/tree/master/src/main/kotlin/basic/KotlinEnum.kt#L6",
- sourceLink
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt b/plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt
deleted file mode 100644
index 7f187127..00000000
--- a/plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package expect
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import java.nio.file.Files
-import java.nio.file.Path
-import java.nio.file.Paths
-import java.util.concurrent.TimeUnit
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-abstract class AbstractExpectTest(
- val testDir: Path? = Paths.get("src/test", "resources", "expect"),
- val formats: List<String> = listOf("html")
-) : BaseAbstractTest() {
-
- protected fun generateOutput(path: Path, outFormat: String): Path? {
- val config = dokkaConfiguration {
- format = outFormat
- sourceSets {
- sourceSet {
- sourceRoots = listOf(path.toAbsolutePath().asString())
- }
- }
- }
-
- var result: Path? = null
- testFromData(config, cleanupOutput = false) {
- renderingStage = { _, context -> result = context.configuration.outputDir.toPath() }
- }
- return result
- }
-
- protected fun compareOutput(expected: Path, obtained: Path?, gitTimeout: Long = 500) {
- obtained?.let { path ->
- val gitCompare = ProcessBuilder(
- "git",
- "--no-pager",
- "diff",
- expected.asString(),
- path.asString()
- ).also { logger.info("git diff command: ${it.command().joinToString(" ")}") }
- .also { it.redirectErrorStream() }.start()
-
- assertTrue(gitCompare.waitFor(gitTimeout, TimeUnit.MILLISECONDS), "Git timed out after $gitTimeout")
- gitCompare.inputStream.bufferedReader().lines().forEach { logger.info(it) }
- assertEquals(0, gitCompare.exitValue(), "${path.fileName}: outputs don't match")
- } ?: throw AssertionError("obtained path is null")
- }
-
- protected fun compareOutputWithExcludes(
- expected: Path,
- obtained: Path?,
- excludes: List<String>,
- timeout: Long = 500
- ) {
- obtained?.let { _ ->
- val (res, out, err) = runDiff(expected, obtained, excludes, timeout)
- assertEquals(0, res, "Outputs differ:\nstdout - $out\n\nstderr - ${err ?: ""}")
- } ?: throw AssertionError("obtained path is null")
- }
-
- protected fun runDiff(exp: Path, obt: Path, excludes: List<String>, timeout: Long): ProcessResult =
- ProcessBuilder().command(
- listOf("diff", "-ru") + excludes.flatMap { listOf("-x", it) } + listOf("--", exp.asString(), obt.asString())
- ).also {
- it.redirectErrorStream()
- }.start().also { assertTrue(it.waitFor(timeout, TimeUnit.MILLISECONDS), "diff timed out") }.let {
- ProcessResult(it.exitValue(), it.inputStream.bufferResult())
- }
-
-
- protected fun testOutput(p: Path, outFormat: String) {
- val expectOut = p.resolve("out/$outFormat")
- val testOut = generateOutput(p.resolve("src"), outFormat)
- .also { logger.info("Test out: ${it?.asString()}") }
-
- compareOutput(expectOut.toAbsolutePath(), testOut?.toAbsolutePath())
- testOut?.deleteRecursively()
- }
-
- protected fun testOutputWithExcludes(
- p: Path,
- outFormat: String,
- ignores: List<String> = emptyList(),
- timeout: Long = 500
- ) {
- val expected = p.resolve("out/$outFormat")
- generateOutput(p.resolve("src"), outFormat)
- ?.let { obtained ->
- compareOutputWithExcludes(expected, obtained, ignores, timeout)
-
- obtained.deleteRecursively()
- } ?: throw AssertionError("Output not generated for ${p.fileName}")
- }
-
- protected fun generateExpect(p: Path, outFormat: String) {
- val out = p.resolve("out/$outFormat/")
- Files.createDirectories(out)
-
- val ret = generateOutput(p.resolve("src"), outFormat)
- Files.list(out).forEach { it.deleteRecursively() }
- ret?.let { Files.list(it).forEach { f -> f.copyRecursively(out.resolve(f.fileName)) } }
- }
-
-}
diff --git a/plugins/base/src/test/kotlin/expect/ExpectGenerator.kt b/plugins/base/src/test/kotlin/expect/ExpectGenerator.kt
deleted file mode 100644
index 0568ba74..00000000
--- a/plugins/base/src/test/kotlin/expect/ExpectGenerator.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package expect
-
-import kotlin.test.Ignore
-import kotlin.test.Test
-
-class ExpectGenerator : AbstractExpectTest() {
-
- @Ignore
- @Test
- fun generateAll() = testDir?.dirsWithFormats(formats).orEmpty().forEach { (p, f) ->
- generateExpect(p, f)
- }
-}
diff --git a/plugins/base/src/test/kotlin/expect/ExpectTest.kt b/plugins/base/src/test/kotlin/expect/ExpectTest.kt
deleted file mode 100644
index f1eb2a77..00000000
--- a/plugins/base/src/test/kotlin/expect/ExpectTest.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package expect
-
-import org.junit.jupiter.api.DynamicTest.dynamicTest
-import org.junit.jupiter.api.TestFactory
-import kotlin.test.Ignore
-
-class ExpectTest : AbstractExpectTest() {
- private val ignores: List<String> = listOf(
- "images",
- "scripts",
- "images",
- "styles",
- "*.js",
- "*.css",
- "*.svg",
- "*.map"
- )
-
- @Ignore
- @TestFactory
- fun expectTest() = testDir?.dirsWithFormats(formats).orEmpty().map { (p, f) ->
- dynamicTest("${p.fileName}-$f") { testOutputWithExcludes(p, f, ignores) }
- }
-}
diff --git a/plugins/base/src/test/kotlin/expect/ExpectUtils.kt b/plugins/base/src/test/kotlin/expect/ExpectUtils.kt
deleted file mode 100644
index a8b1b187..00000000
--- a/plugins/base/src/test/kotlin/expect/ExpectUtils.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package expect
-
-import java.io.InputStream
-import java.nio.file.Files
-import java.nio.file.Path
-import kotlin.streams.toList
-
-data class ProcessResult(val code: Int, val out: String, val err: String? = null)
-
-internal fun Path.dirsWithFormats(formats: List<String>): List<Pair<Path, String>> =
- Files.list(this).toList().filter { Files.isDirectory(it) }.flatMap { p -> formats.map { p to it } }
-
-internal fun Path.asString() = normalize().toString()
-internal fun Path.deleteRecursively() = toFile().deleteRecursively()
-
-internal fun Path.copyRecursively(target: Path) = toFile().copyRecursively(target.toFile())
-
-internal fun Path.listRecursively(filter: (Path) -> Boolean): List<Path> = when {
- Files.isDirectory(this) -> listOfNotNull(takeIf(filter)) + Files.list(this).toList().flatMap {
- it.listRecursively(
- filter
- )
- }
- Files.isRegularFile(this) -> listOfNotNull(this.takeIf(filter))
- else -> emptyList()
- }
-
-internal fun InputStream.bufferResult(): String = this.bufferedReader().lines().toList().joinToString("\n")
diff --git a/plugins/base/src/test/kotlin/expectActuals/ExpectActualsTest.kt b/plugins/base/src/test/kotlin/expectActuals/ExpectActualsTest.kt
deleted file mode 100644
index 3fc6e5c5..00000000
--- a/plugins/base/src/test/kotlin/expectActuals/ExpectActualsTest.kt
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package expectActuals
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-
-class ExpectActualsTest : BaseAbstractTest() {
-
- @Test
- fun `three same named expect actual classes`() {
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- }
- val commonJ = sourceSet {
- name = "commonJ"
- displayName = "commonJ"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonJMain/kotlin/pageMerger/Test.kt")
- dependentSourceSets = setOf(common.value.sourceSetID)
- }
- val commonN1 = sourceSet {
- name = "commonN1"
- displayName = "commonN1"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonN1Main/kotlin/pageMerger/Test.kt")
- dependentSourceSets = setOf(common.value.sourceSetID)
- }
- val commonN2 = sourceSet {
- name = "commonN2"
- displayName = "commonN2"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonN2Main/kotlin/pageMerger/Test.kt")
- dependentSourceSets = setOf(common.value.sourceSetID)
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(commonJ.value.sourceSetID)
- sourceRoots = listOf("src/jsMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(commonJ.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "linuxX64"
- displayName = "linuxX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(commonN1.value.sourceSetID)
- sourceRoots = listOf("src/linuxX64Main/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "mingwX64"
- displayName = "mingwX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(commonN1.value.sourceSetID)
- sourceRoots = listOf("src/mingwX64Main/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "iosArm64"
- displayName = "iosArm64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(commonN2.value.sourceSetID)
- sourceRoots = listOf("src/iosArm64Main/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "iosX64"
- displayName = "iosX64"
- analysisPlatform = "native"
- dependentSourceSets = setOf(commonN2.value.sourceSetID)
- sourceRoots = listOf("src/iosX64Main/kotlin/pageMerger/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/src/commonJMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |expect class A
- |
- |/src/commonN1Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |expect class A
- |
- |/src/commonN2Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |expect class A
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class A
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class A
- |
- |/src/linuxX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class A
- |
- |/src/mingwX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class A
- |
- |/src/iosArm64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class A
- |
- |/src/iosX64Main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class A
- |
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- val allChildren = it.withDescendants().filterIsInstance<ClasslikePageNode>().toList()
- val commonJ = allChildren.filter { it.name == "[jvm, js]A" }
- val commonN1 = allChildren.filter { it.name == "[mingwX64, linuxX64]A" }
- val commonN2 = allChildren.filter { it.name == "[iosX64, iosArm64]A" }
- val noClass = allChildren.filter { it.name == "A" }
- assertEquals(1, commonJ.size, "There can be only one [jvm, js]A page")
- assertTrue(
- commonJ.first().documentables.firstOrNull()?.sourceSets?.map { it.displayName }
- ?.containsAll(listOf("commonJ", "js", "jvm")) ?: false,
- "A(jvm, js)should have commonJ, js, jvm sources"
- )
-
- assertEquals(1, commonN1.size, "There can be only one [mingwX64, linuxX64]A page")
- assertTrue(
- commonN1.first().documentables.firstOrNull()?.sourceSets?.map { it.displayName }
- ?.containsAll(listOf("commonN1", "linuxX64", "mingwX64")) ?: false,
- "[mingwX64, linuxX64]A should have commonN1, linuxX64, mingwX64 sources"
- )
-
- assertEquals(1, commonN2.size, "There can be only one [iosX64, iosArm64]A page")
- assertTrue(
- commonN2.first().documentables.firstOrNull()?.sourceSets?.map { it.displayName }
- ?.containsAll(listOf("commonN2", "iosArm64", "iosX64")) ?: false,
- "[iosX64, iosArm64]A should have commonN2, iosArm64, iosX64 sources"
- )
-
- assertTrue(noClass.isEmpty(), "There can't be any A page")
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/filter/DeprecationFilterTest.kt b/plugins/base/src/test/kotlin/filter/DeprecationFilterTest.kt
deleted file mode 100644
index 75d82e9b..00000000
--- a/plugins/base/src/test/kotlin/filter/DeprecationFilterTest.kt
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package filter
-
-import org.jetbrains.dokka.DokkaDefaults
-import org.jetbrains.dokka.PackageOptionsImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class DeprecationFilterTest : BaseAbstractTest() {
-
- @Test
- fun `should skip hidden deprecated level regardless of skipDeprecated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- classpath = listOfNotNull(jvmStdlibPath)
- skipDeprecated = false
- perPackageOptions = mutableListOf(
- PackageOptionsImpl(
- "example.*",
- true,
- false,
- false,
- false,
- DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |@Deprecated("dep", level = DeprecationLevel.HIDDEN)
- |fun testFunction() { }
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.isEmpty()
- )
- }
- }
- }
-
- @Test
- fun `function with false global skipDeprecated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- skipDeprecated = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |fun testFunction() { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.size == 1
- )
- }
- }
- }
-
- @Test
- fun `deprecated function with false global skipDeprecated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- skipDeprecated = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |@Deprecated("dep")
- |fun testFunction() { }
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.size == 1
- )
- }
- }
- }
-
- @Test
- fun `deprecated function with true global skipDeprecated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- skipDeprecated = true
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |@Deprecated("dep")
- |fun testFunction() { }
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.isEmpty()
- )
- }
- }
- }
-
- @Test
- fun `should skip deprecated companion object`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- skipDeprecated = true
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |class Test {
- | @Deprecated("dep")
- | companion object {
- | fun method() {}
- | }
- |}
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().classlikes.first().classlikes.isEmpty()
- )
- }
- }
- }
-
- @Test
- fun `deprecated function with false global true package skipDeprecated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- skipDeprecated = false
- perPackageOptions = mutableListOf(
- PackageOptionsImpl(
- "example.*",
- true,
- false,
- true,
- false,
- DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |@Deprecated("dep")
- |fun testFunction() { }
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.isEmpty()
- )
- }
- }
- }
-
- @Test
- fun `deprecated function with true global false package skipDeprecated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- skipDeprecated = true
- perPackageOptions = mutableListOf(
- PackageOptionsImpl("example",
- false,
- false,
- false,
- false,
- DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |@Deprecated("dep")
- |fun testFunction() { }
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.size == 1
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/filter/EmptyPackagesFilterTest.kt b/plugins/base/src/test/kotlin/filter/EmptyPackagesFilterTest.kt
deleted file mode 100644
index c6c6b160..00000000
--- a/plugins/base/src/test/kotlin/filter/EmptyPackagesFilterTest.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package filter
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class EmptyPackagesFilterTest : BaseAbstractTest() {
- @Test
- fun `empty package with false skipEmptyPackages`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- skipEmptyPackages = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.isNotEmpty()
- )
- }
- }
- }
- @Test
- fun `empty package with true skipEmptyPackages`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- skipEmptyPackages = true
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- | class ThisShouldBePresent { }
- |/src/main/kotlin/empty/TestEmpty.kt
- |package empty
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- modules.forEach { module ->
- assertEquals(listOf("example"), module.packages.map { it.name })
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/filter/JavaFileFilterTest.kt b/plugins/base/src/test/kotlin/filter/JavaFileFilterTest.kt
deleted file mode 100644
index 1c74c7ce..00000000
--- a/plugins/base/src/test/kotlin/filter/JavaFileFilterTest.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package filter
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class JavaFileFilterTest : BaseAbstractTest() {
- @Test
- fun `java file should be included`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- skipEmptyPackages = false
- sourceRoots = listOf("src/main/java/basic/Test.java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/basic/Test.java
- |package example;
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.isNotEmpty()
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/filter/JavaVisibilityFilterTest.kt b/plugins/base/src/test/kotlin/filter/JavaVisibilityFilterTest.kt
deleted file mode 100644
index b648f802..00000000
--- a/plugins/base/src/test/kotlin/filter/JavaVisibilityFilterTest.kt
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package filter
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.DokkaDefaults
-import org.jetbrains.dokka.PackageOptionsImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DModule
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.MethodSource
-import testApi.testRunner.dokkaConfiguration
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavaVisibilityFilterTest : BaseAbstractTest() {
-
- @Test
- fun `should document nothing private if no visibilities are included`() {
- testVisibility(
- """
- | public class JavaVisibilityTest {
- | public String publicProperty = "publicProperty";
- | private String privateProperty = "privateProperty";
- |
- | public void publicFunction() { }
- | private void privateFunction() { }
- | }
- """.trimIndent(),
- includedVisibility = DokkaDefaults.documentedVisibilities
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(1, it.size)
- assertEquals("publicProperty", it[0].name)
- }
- clazz.functions.also {
- assertEquals(1, it.size)
- assertEquals("publicFunction", it[0].name)
- }
- }
- }
-
- @Test
- fun `should document private within public class`() {
- testVisibility(
- """
- | public class JavaVisibilityTest {
- | public String publicProperty = "publicProperty";
- | protected String noise = "noise";
- |
- | private String privateProperty = "privateProperty";
- |
- | public void publicFunction() { }
- | private void privateFunction() { }
- | }
- """.trimIndent(),
- includedVisibility = setOf(DokkaConfiguration.Visibility.PUBLIC, DokkaConfiguration.Visibility.PRIVATE)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(2, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("privateProperty", it[1].name)
- }
- clazz.functions.also {
- assertEquals(2, it.size)
- assertEquals("publicFunction", it[0].name)
- assertEquals("privateFunction", it[1].name)
- }
- }
- }
-
- @Test
- fun `should document package private within private class`() {
- testVisibility(
- """
- | public class JavaVisibilityTest {
- | public String publicProperty = "publicProperty";
- | protected String noise = "noise";
- |
- | String packagePrivateProperty = "packagePrivateProperty";
- |
- | public void publicFunction() { }
- | void packagePrivateFunction() { }
- | }
- """.trimIndent(),
- includedVisibility = setOf(DokkaConfiguration.Visibility.PUBLIC, DokkaConfiguration.Visibility.PACKAGE)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(2, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("packagePrivateProperty", it[1].name)
- }
- clazz.functions.also {
- assertEquals(2, it.size)
- assertEquals("publicFunction", it[0].name)
- assertEquals("packagePrivateFunction", it[1].name)
- }
- }
- }
-
- @Test
- fun `should document protected within public class`() {
- testVisibility(
- """
- | public class JavaVisibilityTest {
- | public String publicProperty = "publicProperty";
- | String noise = "noise";
- |
- | protected String protectedProperty = "protectedProperty";
- |
- | public void publicFunction() { }
- | protected void protectedFunction() { }
- | }
- """.trimIndent(),
- includedVisibility = setOf(DokkaConfiguration.Visibility.PUBLIC, DokkaConfiguration.Visibility.PROTECTED)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(2, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("protectedProperty", it[1].name)
- }
- clazz.functions.also {
- assertEquals(2, it.size)
- assertEquals("publicFunction", it[0].name)
- assertEquals("protectedFunction", it[1].name)
- }
- }
- }
-
- @Test
- fun `should include all visibilities`() {
- testVisibility(
- """
- | public class JavaVisibilityTest {
- | public String publicProperty = "publicProperty";
- | private String privateProperty = "privateProperty";
- | String packagePrivateProperty = "packagePrivateProperty";
- | protected String protectedProperty = "protectedProperty";
- |
- | public void publicFunction() { }
- | private void privateFunction() { }
- | void packagePrivateFunction() { }
- | protected void protectedFunction() { }
- | }
- """.trimIndent(),
- includedVisibility = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PRIVATE,
- DokkaConfiguration.Visibility.PROTECTED,
- DokkaConfiguration.Visibility.PACKAGE,
- )
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(4, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("privateProperty", it[1].name)
- assertEquals("packagePrivateProperty", it[2].name)
- assertEquals("protectedProperty", it[3].name)
- }
- clazz.functions.also {
- assertEquals(4, it.size)
- assertEquals("publicFunction", it[0].name)
- assertEquals("privateFunction", it[1].name)
- assertEquals("packagePrivateFunction", it[2].name)
- assertEquals("protectedFunction", it[3].name)
- }
- }
- }
-
- private fun testVisibility(body: String, includedVisibility: Set<DokkaConfiguration.Visibility>, asserts: (List<DModule>) -> Unit) {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- documentedVisibilities = includedVisibility
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/basic/JavaVisibilityTest.java
- |package example;
- |
- $body
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = asserts
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["nonPublicPermutations", "publicPermutations"])
- fun `includeNonPublic - should include package private java class`(configuration: ConfigurationWithVisibility) {
- testInline(
- """
- |/src/main/java/basic/VisibilityTest.java
- |package basic;
- |
- |${configuration.visibilityKeyword} class VisibilityTest {
- | static void test() {
- |
- | }
- |}
- """.trimMargin(),
- configuration.configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertEquals(configuration.expectedClasslikes, it.first().packages.first().classlikes.size)
- }
- }
- }
-
- data class ConfigurationWithVisibility(
- val visibilityKeyword: String,
- val configuration: DokkaConfigurationImpl,
- val expectedClasslikes: Int
- )
-
- companion object TestDataSources {
- @Suppress("DEPRECATION") // for includeNonPublic
- val globalExcludes = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/")
- }
- }
- }
-
- @Suppress("DEPRECATION") // for includeNonPublic
- val globalIncludes = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = true
- sourceRoots = listOf("src/")
- }
- }
- }
-
- @Suppress("DEPRECATION") // for includeNonPublic
- val globalIncludesPackageExcludes = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = true
- sourceRoots = listOf("src/")
- perPackageOptions = mutableListOf(
- PackageOptionsImpl(
- "basic",
- includeNonPublic = false,
- reportUndocumented = false,
- skipDeprecated = false,
- suppress = false,
- documentedVisibilities = DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- @Suppress("DEPRECATION") // for includeNonPublic
- val globalExcludesPackageIncludes = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/")
- perPackageOptions = mutableListOf(
- PackageOptionsImpl(
- "basic",
- true,
- false,
- false,
- false,
- DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- @JvmStatic
- fun nonPublicPermutations() = listOf("protected", "", "private").flatMap { keyword ->
- listOf(globalIncludes, globalExcludesPackageIncludes).map { configuration ->
- ConfigurationWithVisibility(keyword, configuration, expectedClasslikes = 1)
- } + listOf(globalExcludes, globalExcludes).map { configuration ->
- ConfigurationWithVisibility(keyword, configuration, expectedClasslikes = 0)
- }
- }
-
- @JvmStatic
- fun publicPermutations() =
- listOf(globalIncludes, globalExcludesPackageIncludes, globalExcludes, globalExcludes).map { configuration ->
- ConfigurationWithVisibility("public", configuration, expectedClasslikes = 1)
- }
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt b/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt
deleted file mode 100644
index 240982c5..00000000
--- a/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package filter
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.FunctionalTypeConstructor
-import org.jetbrains.dokka.model.GenericTypeConstructor
-import org.jetbrains.dokka.model.Invariance
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-import utils.OnlyDescriptors
-
-class KotlinArrayDocumentableReplacerTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- @Test
- fun `function with array type params`() {
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |fun testFunction(param1: Array<Int>, param2: Array<Boolean>,
- | param3: Array<Float>, param4: Array<Double>,
- | param5: Array<Long>, param6: Array<Short>,
- | param7: Array<Char>, param8: Array<Byte>) { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val params = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()?.parameters
-
- val typeArrayNames = listOf("IntArray", "BooleanArray", "FloatArray", "DoubleArray", "LongArray", "ShortArray",
- "CharArray", "ByteArray")
-
- assertEquals(typeArrayNames.size, params?.size)
- params?.forEachIndexed{ i, param ->
- assertEquals(GenericTypeConstructor(DRI("kotlin", typeArrayNames[i]), emptyList()),
- param.type)
- }
- }
- }
- }
- @Test
- fun `function with specific parameters of array type`() {
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |fun testFunction(param1: Array<Array<Int>>, param2: (Array<Int>) -> Array<Int>) { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val params = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()?.parameters
- assertEquals(
- Invariance(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList())),
- (params?.firstOrNull()?.type as? GenericTypeConstructor)?.projections?.firstOrNull())
- assertEquals(
- Invariance(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList())),
- (params?.get(1)?.type as? FunctionalTypeConstructor)?.projections?.get(0))
- assertEquals(
- Invariance(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList())),
- (params?.get(1)?.type as? FunctionalTypeConstructor)?.projections?.get(1))
- }
- }
- }
- @Test
- fun `property with array type`() {
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |class MyTest {
- | val isEmpty: Array<Boolean>
- | get() = emptyList
- | set(value) {
- | field = value
- | }
- |}
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val myTestClass = it.firstOrNull()?.packages?.firstOrNull()?.classlikes?.firstOrNull()
- val property = myTestClass?.properties?.firstOrNull()
-
- assertEquals(GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
- property?.type)
- assertEquals(GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
- property?.getter?.type)
- assertEquals(GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
- property?.setter?.parameters?.firstOrNull()?.type)
- }
- }
- }
- @Test
- fun `typealias with array type`() {
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |typealias arr = Array<Int>
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val arrTypealias = it.firstOrNull()?.packages?.firstOrNull()?.typealiases?.firstOrNull()
-
- assertEquals(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
- arrTypealias?.underlyingType?.values?.firstOrNull())
- }
- }
- }
-
- // Unreal case: Upper bound of a type parameter cannot be an array
- @Test
- fun `generic fun and class`() {
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |fun<T : Array<Int>> testFunction() { }
- |class myTestClass<T : Array<Int>>{ }
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val testFun = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()
- val myTestClass = it.firstOrNull()?.packages?.firstOrNull()?.classlikes?.firstOrNull() as? DClass
-
- assertEquals(GenericTypeConstructor(DRI("kotlin","IntArray"), emptyList()),
- testFun?.generics?.firstOrNull()?.bounds?.firstOrNull())
- assertEquals(GenericTypeConstructor(DRI("kotlin","IntArray"), emptyList()),
- myTestClass?.generics?.firstOrNull()?.bounds?.firstOrNull())
- }
- }
- }
-
- @OnlyDescriptors("Fix module.contentScope in new Standalone API") // TODO fix module.contentScope [getKtModuleForKtElement]
- @Test
- fun `no jvm source set`() {
- val configurationWithNoJVM = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- analysisPlatform = "jvm"
- }
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/TestJS.kt")
- analysisPlatform = "js"
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |fun testFunction(param: Array<Int>)
- |
- |
- |/src/main/kotlin/basic/TestJS.kt
- |package example
- |
- |fun testFunction(param: Array<Int>)
- """.trimMargin(),
- configurationWithNoJVM
- ) {
- preMergeDocumentablesTransformationStage = {
- val paramsJS = it[1].packages.firstOrNull()?.functions?.firstOrNull()?.parameters
- assertNotEquals(
- GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
- paramsJS?.firstOrNull()?.type)
-
- val paramsJVM = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()?.parameters
- assertEquals(
- GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
- paramsJVM?.firstOrNull()?.type)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/filter/VisibilityFilterTest.kt b/plugins/base/src/test/kotlin/filter/VisibilityFilterTest.kt
deleted file mode 100644
index 872e5865..00000000
--- a/plugins/base/src/test/kotlin/filter/VisibilityFilterTest.kt
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package filter
-
-import org.jetbrains.dokka.DokkaConfiguration.Visibility
-import org.jetbrains.dokka.DokkaDefaults
-import org.jetbrains.dokka.PackageOptionsImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DEnum
-import org.jetbrains.dokka.model.DModule
-import kotlin.test.*
-
-class VisibilityFilterTest : BaseAbstractTest() {
-
- @Test
- fun `should document only public for defaults`() {
- testVisibility(
- """
- | val publicProperty: String = "publicProperty"
- | private val privateProperty: String = "privateProperty"
- |
- | fun publicFun() { }
- | private fun privateFun() { }
- """.trimIndent(),
- visibilities = DokkaDefaults.documentedVisibilities
- ) { module ->
- val pckg = module.first().packages.first()
- pckg.properties.also {
- assertEquals(1, it.size)
- assertEquals("publicProperty", it[0].name)
- }
- pckg.functions.also {
- assertEquals(1, it.size)
- assertEquals("publicFun", it[0].name)
- }
- }
- }
-
- @Test
- fun `should document public`() {
- testVisibility(
- """
- | class TestClass<out V> {
- | private var privateToThisVisibility: V? = null
- | val publicProperty: String = "publicProperty"
- | internal val noise: String = "noise"
- |
- | private val privateProperty: String = "privateProperty"
- |
- | fun publicFun() { }
- |
- | private fun privateFun() { }
- | }
- """.trimIndent(),
- visibilities = setOf(Visibility.PUBLIC)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(1, it.size)
- assertEquals("publicProperty", it[0].name)
- }
- clazz.functions.also {
- assertEquals(1, it.size)
- assertEquals("publicFun", it[0].name)
- }
- }
- }
-
- @Test
- fun `should document only private`() {
- testVisibility(
- """
- | public val noiseMember: String = "noise"
- | internal fun noiseFun() { }
- | class NoisePublicClass { }
- |
- | private val privateProperty: String = "privateProperty"
- | private fun privateFun() { }
- """.trimIndent(),
- visibilities = setOf(Visibility.PRIVATE)
- ) { module ->
- val pckg = module.first().packages.first()
-
- assertTrue(pckg.classlikes.isEmpty())
- pckg.properties.also {
- assertEquals(1, it.size)
- assertEquals("privateProperty", it[0].name)
- }
- pckg.functions.also {
- assertEquals(1, it.size)
- assertEquals("privateFun", it[0].name)
- }
- }
- }
-
- @Test
- fun `should document only internal`() {
- testVisibility(
- """
- | public val noiseMember: String = "noise"
- | private fun noiseFun() { }
- | class NoisePublicClass { }
- |
- | internal val internalProperty: String = "privateProperty"
- | internal fun internalFun() { }
- """.trimIndent(),
- visibilities = setOf(Visibility.INTERNAL)
- ) { module ->
- val pckg = module.first().packages.first()
-
- assertTrue(pckg.classlikes.isEmpty())
- pckg.properties.also {
- assertEquals(1, it.size)
- assertEquals("internalProperty", it[0].name)
- }
- pckg.functions.also {
- assertEquals(1, it.size)
- assertEquals("internalFun", it[0].name)
- }
- }
- }
-
- @Test
- fun `should document private within public class`() {
- testVisibility(
- """
- | class TestClass {
- | val publicProperty: String = "publicProperty"
- | internal val noise: String = "noise"
- |
- | private val privateProperty: String = "privateProperty"
- |
- | fun publicFun() { }
- |
- | private fun privateFun() { }
- | }
- """.trimIndent(),
- visibilities = setOf(Visibility.PUBLIC, Visibility.PRIVATE)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(2, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("privateProperty", it[1].name)
- }
- clazz.functions.also {
- assertEquals(2, it.size)
- assertEquals("publicFun", it[0].name)
- assertEquals("privateFun", it[1].name)
- }
- }
- }
-
- @Test
- fun `should document internal within public class`() {
- testVisibility(
- """
- | class TestClass {
- | val publicProperty: String = "publicProperty"
- | protected val noise: String = "noise"
- |
- | internal val internalProperty: String = "internalProperty"
- |
- | fun publicFun() { }
- |
- | internal fun internalFun() { }
- | }
- """.trimIndent(),
- visibilities = setOf(Visibility.PUBLIC, Visibility.INTERNAL)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(2, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("internalProperty", it[1].name)
- }
- clazz.functions.also {
- assertEquals(2, it.size)
- assertEquals("publicFun", it[0].name)
- assertEquals("internalFun", it[1].name)
- }
- }
- }
-
- @Test
- fun `should document protected within public class`() {
- testVisibility(
- """
- | class TestClass {
- | val publicProperty: String = "publicProperty"
- | internal val noise: String = "noise"
- |
- | protected val protectedProperty: String = "protectedProperty"
- |
- | fun publicFun() { }
- |
- | protected fun protectedFun() { }
- | }
- """.trimIndent(),
- visibilities = setOf(Visibility.PUBLIC, Visibility.PROTECTED)
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(2, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("protectedProperty", it[1].name)
- }
- clazz.functions.also {
- assertEquals(2, it.size)
- assertEquals("publicFun", it[0].name)
- assertEquals("protectedFun", it[1].name)
- }
- }
- }
-
- @Test
- fun `should document all visibilities`() {
- testVisibility(
- """
- | class TestClass {
- | val publicProperty: String = "publicProperty"
- |
- | private val privateProperty: String = "privateProperty"
- | internal val internalProperty: String = "internalProperty"
- | protected val protectedProperty: String = "protectedProperty"
- |
- | fun publicFun() { }
- |
- | private fun privateFun() { }
- | internal fun internalFun() { }
- | protected fun protectedFun() { }
- | }
- """.trimIndent(),
- visibilities = setOf(
- Visibility.PUBLIC,
- Visibility.PRIVATE,
- Visibility.PROTECTED,
- Visibility.INTERNAL
- )
- ) { module ->
- val clazz = module.first().packages.first().classlikes.filterIsInstance<DClass>().first()
- clazz.properties.also {
- assertEquals(4, it.size)
- assertEquals("publicProperty", it[0].name)
- assertEquals("privateProperty", it[1].name)
- assertEquals("internalProperty", it[2].name)
- assertEquals("protectedProperty", it[3].name)
- }
- clazz.functions.also {
- assertEquals(4, it.size)
- assertEquals("publicFun", it[0].name)
- assertEquals("privateFun", it[1].name)
- assertEquals("internalFun", it[2].name)
- assertEquals("protectedFun", it[3].name)
- }
- }
- }
-
- @Test
- fun `should ignore visibility settings for another package`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- perPackageOptions = listOf(
- PackageOptionsImpl(
- matchingRegex = "other",
- documentedVisibilities = setOf(Visibility.PRIVATE),
- includeNonPublic = false,
- reportUndocumented = false,
- skipDeprecated = false,
- suppress = false
- )
- )
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- | fun publicFun() { }
- |
- | private fun privateFun() { }
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val functions = it.first().packages.first().functions
- assertEquals(1, functions.size)
- assertEquals("publicFun", functions[0].name)
- }
- }
- }
-
- @Test
- fun `should choose package visibility settings over global`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- documentedVisibilities = setOf(Visibility.INTERNAL)
- perPackageOptions = listOf(
- PackageOptionsImpl(
- matchingRegex = "example",
- documentedVisibilities = setOf(Visibility.PRIVATE),
- includeNonPublic = false,
- reportUndocumented = false,
- skipDeprecated = false,
- suppress = false
- )
- )
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- | internal fun internalFun() { }
- |
- | private fun privateFun() { }
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val functions = it.first().packages.first().functions
- assertEquals(1, functions.size)
- assertEquals("privateFun", functions[0].name)
- }
- }
- }
-
- @Test
- fun `private setter should be hidden if only PUBLIC is documented`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- documentedVisibilities = setOf(Visibility.PUBLIC)
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |var property: Int = 0
- |private set
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertNull(
- it.first().packages.first().properties.first().setter
- )
- }
- }
- }
-
- @Test
- fun `should choose new documentedVisibilities over deprecated includeNonPublic`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = true
- documentedVisibilities = setOf(Visibility.INTERNAL)
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- | internal fun internalFun() { }
- |
- | private fun privateFun() { }
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- val functions = it.first().packages.first().functions
- assertEquals(1, functions.size)
- assertEquals("internalFun", functions[0].name)
- }
- }
- }
-
- @Test
- fun `includeNonPublic - public function with false global`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |fun testFunction() { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.size == 1
- )
- }
- }
- }
-
- @Test
- fun `includeNonPublic - private function with false global`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |private fun testFunction() { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.isEmpty()
- )
- }
- }
- }
-
- @Test
- fun `includeNonPublic - private function with true global`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- includeNonPublic = true
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |private fun testFunction() { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.size == 1
- )
- }
- }
- }
-
- @Test
- fun `private setter with false global includeNonPublic`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |var property: Int = 0
- |private set
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertNull(
- it.first().packages.first().properties.first().setter
- )
- }
- }
- }
-
- @Test
- fun `includeNonPublic - private function with false global true package`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- includeNonPublic = false
- perPackageOptions = mutableListOf(
- PackageOptionsImpl(
- "example",
- true,
- false,
- false,
- false,
- DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |private fun testFunction() { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.size == 1
- )
- }
- }
- }
-
- @Test
- fun `includeNonPublic - private function with true global false package`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- includeNonPublic = true
- perPackageOptions = mutableListOf(
- PackageOptionsImpl(
- "example",
- false,
- false,
- false,
- false,
- DokkaDefaults.documentedVisibilities
- )
- )
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |private fun testFunction() { }
- |
- |
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertTrue(
- it.first().packages.first().functions.isEmpty()
- )
- }
- }
- }
-
- @Test
- fun `includeNonPublic - private typealias should be skipped`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- |private typealias ABC = Int
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = {
- assertEquals(0, it.first().packages.first().typealiases.size)
- }
- }
- }
-
- @Test
- fun `includeNonPublic - internal property from enum should be skipped`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = false
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package enums
- |
- |enum class Test(internal val value: Int) {
- | A(0) {
- | override fun testFun(): Float = 0.05F
- | },
- | B(1) {
- | override fun testFun(): Float = 0.1F
- | };
- |
- | internal open fun testFun(): Float = 0.5F
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesTransformationStage = { module ->
- val enum = module.packages.flatMap { it.classlikes }.filterIsInstance<DEnum>().first()
- val entry = enum.entries.first()
-
- assertFalse("testFun" in entry.functions.map { it.name })
- assertFalse("value" in entry.properties.map { it.name })
- assertFalse("testFun" in enum.functions.map { it.name })
- }
- }
- }
-
- @Test
- fun `includeNonPublic - internal property from enum`() {
- @Suppress("DEPRECATION")
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- includeNonPublic = true
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package enums
- |
- |enum class Test(internal val value: Int) {
- | A(0) {
- | override fun testFun(): Float = 0.05F
- | },
- | B(1) {
- | override fun testFun(): Float = 0.1F
- | };
- |
- | internal open fun testFun(): Float = 0.5F
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesTransformationStage = { module ->
- val enum = module.packages.flatMap { it.classlikes }.filterIsInstance<DEnum>().first()
- val entry = enum.entries.first()
-
- assertTrue("testFun" in entry.functions.map { it.name })
- assertTrue("value" in entry.properties.map { it.name })
- assertTrue("testFun" in enum.functions.map { it.name })
- }
- }
- }
-
-
- private fun testVisibility(
- body: String,
- visibilities: Set<Visibility>,
- asserts: (List<DModule>) -> Unit
- ) {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- documentedVisibilities = visibilities
- sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/basic/Test.kt
- |package example
- |
- $body
- |
- """.trimMargin(),
- configuration
- ) {
- preMergeDocumentablesTransformationStage = asserts
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/issues/IssuesTest.kt b/plugins/base/src/test/kotlin/issues/IssuesTest.kt
deleted file mode 100644
index 007b01ff..00000000
--- a/plugins/base/src/test/kotlin/issues/IssuesTest.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package issues
-
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DFunction
-import utils.AbstractModelTest
-import utils.name
-import kotlin.test.Test
-
-class IssuesTest : AbstractModelTest("/src/main/kotlin/issues/Test.kt", "issues") {
-
- @Test
- fun errorClasses() {
- inlineModelTest(
- """
- |class Test(var value: String) {
- | fun test(): List<String> = emptyList()
- | fun brokenApply(v: String) = apply { value = v }
- |
- | fun brokenRun(v: String) = run {
- | value = v
- | this
- | }
- |
- | fun brokenLet(v: String) = let {
- | it.value = v
- | it
- | }
- |
- | fun brokenGenerics() = listOf("a", "b", "c")
- |
- | fun working(v: String) = doSomething()
- |
- | fun doSomething(): String = "Hello"
- |}
- """,
- configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- ) {
- with((this / "issues" / "Test").cast<DClass>()) {
- (this / "working").cast<DFunction>().type.name equals "String"
- (this / "doSomething").cast<DFunction>().type.name equals "String"
- (this / "brokenGenerics").cast<DFunction>().type.name equals "List"
- (this / "brokenApply").cast<DFunction>().type.name equals "Test"
- (this / "brokenRun").cast<DFunction>().type.name equals "Test"
- (this / "brokenLet").cast<DFunction>().type.name equals "Test"
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
deleted file mode 100644
index 1b73ffee..00000000
--- a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package linkableContent
-
-import org.jetbrains.dokka.SourceLinkDefinitionImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.base.transformers.pages.sourcelinks.SourceLinksTransformer
-import org.jetbrains.dokka.model.WithGenerics
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.pages.*
-import org.jsoup.Jsoup
-import utils.TestOutputWriterPlugin
-import utils.assertNotNull
-import java.net.URL
-import java.nio.file.Paths
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotEquals
-import kotlin.test.assertNotNull
-import utils.OnlyDescriptorsMPP
-
-class LinkableContentTest : BaseAbstractTest() {
-
- @OnlyDescriptorsMPP("#3238")
- @Test
- fun `Include module and package documentation`() {
-
- val testDataDir = getTestDataDir("multiplatform/basicMultiplatformTest").toAbsolutePath()
- val includesDir = getTestDataDir("linkable/includes").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf(Paths.get("$testDataDir/commonMain/kotlin").toString())
- }
- val jvmAndJsSecondCommonMain = sourceSet {
- name = "jvmAndJsSecondCommonMain"
- displayName = "jvmAndJsSecondCommonMain"
- analysisPlatform = "common"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmAndJsSecondCommonMain/kotlin").toString())
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jsMain/kotlin").toString())
- includes = listOf(Paths.get("$includesDir/include2.md").toString())
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString())
- includes = listOf(Paths.get("$includesDir/include1.md").toString())
- }
- }
- }
-
- testFromData(configuration) {
- documentablesMergingStage = {
- assertEquals(2, it.documentation.size)
- assertEquals(2, it.packages.size)
- assertEquals(1, it.packages.first().documentation.size)
- assertEquals(1, it.packages.last().documentation.size)
- }
- }
-
- }
-
- @Test
- fun `Sources multiplatform class documentation`() {
-
- val testDataDir = getTestDataDir("linkable/sources").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
-
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf(Paths.get("$testDataDir/commonMain/kotlin").toString())
- }
- val jvmAndJsSecondCommonMain = sourceSet {
- name = "jvmAndJsSecondCommonMain"
- displayName = "jvmAndJsSecondCommonMain"
- analysisPlatform = "common"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmAndJsSecondCommonMain/kotlin").toString())
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jsMain/kotlin").toString())
- sourceLinks = listOf(
- SourceLinkDefinitionImpl(
- localDirectory = "$testDataDir/jsMain/kotlin",
- remoteUrl = URL("https://github.com/user/repo/tree/master/src/jsMain/kotlin"),
- remoteLineSuffix = "#L"
- )
- )
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString())
- sourceLinks = listOf(
- SourceLinkDefinitionImpl(
- localDirectory = "$testDataDir/jvmMain/kotlin",
- remoteUrl = URL("https://github.com/user/repo/tree/master/src/jvmMain/kotlin"),
- remoteLineSuffix = "#L"
- )
- )
- }
- }
- }
-
- testFromData(configuration) {
- renderingStage = { rootPageNode, dokkaContext ->
- val newRoot = SourceLinksTransformer(dokkaContext).invoke(rootPageNode)
- val moduleChildren = newRoot.children
- assertEquals(1, moduleChildren.size)
- val packageChildren = moduleChildren.first().children
- assertEquals(2, packageChildren.size)
- packageChildren.forEach {
- val name = it.name.substringBefore("Class")
- val signature = (it as? ClasslikePageNode)?.content?.dfs { it is ContentGroup && it.dci.kind == ContentKind.Symbol }.assertNotNull("signature")
- val crl = signature.children.last().children[1] as? ContentResolvedLink
- assertEquals(
- "https://github.com/user/repo/tree/master/src/${name.toLowerCase()}Main/kotlin/${name}Class.kt#L7",
- crl?.address
- )
- }
- }
- }
- }
-
- @OnlyDescriptorsMPP("#3238")
- @Test
- fun `Samples multiplatform documentation`() {
-
- val testDataDir = getTestDataDir("linkable/samples").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf(Paths.get("$testDataDir/commonMain/kotlin").toString())
- }
- val jvmAndJsSecondCommonMain = sourceSet {
- name = "jvmAndJsSecondCommonMain"
- displayName = "jvmAndJsSecondCommonMain"
- analysisPlatform = "common"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmAndJsSecondCommonMain/kotlin").toString())
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jsMain/kotlin").toString())
- samples = listOf("$testDataDir/jsMain/resources/Samples.kt")
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString())
- samples = listOf("$testDataDir/jvmMain/resources/Samples.kt")
- }
- }
- }
-
- testFromData(configuration) {
- renderingStage = { rootPageNode, _ ->
- // TODO [beresnev] :(((
-// val newRoot = DefaultSamplesTransformer(dokkaContext).invoke(rootPageNode)
- val newRoot = rootPageNode
- val moduleChildren = newRoot.children
- assertEquals(1, moduleChildren.size)
- val packageChildren = moduleChildren.first().children
- assertEquals(2, packageChildren.size)
- packageChildren.forEach { pageNode ->
- val name = pageNode.name.substringBefore("Class")
- val classChildren = pageNode.children
- assertEquals(2, classChildren.size)
- val function = classChildren.find { it.name == "printWithExclamation" }
- val text = (function as MemberPageNode).content.let { it as ContentGroup }.children.last()
- .let { it as ContentDivergentGroup }.children.single().after
- .let { it as ContentGroup }.children.last()
- .let { it as ContentGroup }.children.single()
- .let { it as ContentCodeBlock }.children.single()
- .let { it as ContentText }.text
- assertEquals(
- """|import p2.${name}Class
- |fun main() {
- | //sampleStart
- | ${name}Class().printWithExclamation("Hi, $name")
- | //sampleEnd
- |}""".trimMargin(),
- text
- )
- }
- }
- }
- }
-
- @Test
- fun `Documenting return type for a function in inner class with generic parent`() {
- testInline(
- """
- |/src/main/kotlin/test/source.kt
- |package test
- |
- |class Sample<S>(first: S){
- | inner class SampleInner {
- | fun foo(): S = TODO()
- | }
- |}
- |
- """.trimIndent(),
- dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "js"
- }
- }
- }
- ) {
- renderingStage = { module, _ ->
- val sample = module.children.single { it.name == "test" }
- .children.single { it.name == "Sample" } as ClasslikePageNode
- val foo = sample
- .children
- .single { it.name == "SampleInner" }
- .let { it as ClasslikePageNode }
- .children
- .single { it.name == "foo" }
- .let { it as MemberPageNode }
-
- val returnTypeNode = foo.content.dfs {
- val link = (it as? ContentDRILink)?.children
- val child = link?.first() as? ContentText
- child?.text == "S"
- } as? ContentDRILink
-
- assertEquals(
- (sample.documentables.firstOrNull() as WithGenerics).generics.first().dri,
- returnTypeNode?.address
- )
- }
- }
- }
-
- @Test
- fun `Include module and package documentation with codeblock`() {
-
- val testDataDir = getTestDataDir("multiplatform/basicMultiplatformTest").toAbsolutePath()
- val includesDir = getTestDataDir("linkable/includes").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- sourceSet {
- analysisPlatform = "js"
- sourceRoots = listOf("jsMain").map {
- Paths.get("$testDataDir/$it/kotlin").toString()
- }
- name = "js"
- includes = listOf(Paths.get("$includesDir/include2.md").toString())
- }
- sourceSet {
- analysisPlatform = "jvm"
- sourceRoots = listOf("jvmMain").map {
- Paths.get("$testDataDir/$it/kotlin").toString()
- }
- name = "jvm"
- includes = listOf(Paths.get("$includesDir/include1.md").toString())
- }
- }
- }
-
- testFromData(configuration) {
- documentablesMergingStage = {
- assertNotEquals(null, it.packages.first().documentation.values.single().dfs {
- (it as? Text)?.body?.contains("@SqlTable") ?: false
- })
- }
- }
-
- }
-
- @Test
- fun `Include module with description parted in two files`() {
-
- val testDataDir = getTestDataDir("multiplatform/basicMultiplatformTest").toAbsolutePath()
- val includesDir = getTestDataDir("linkable/includes").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf(Paths.get("$testDataDir/commonMain/kotlin").toString())
- }
- val jvmAndJsSecondCommonMain = sourceSet {
- name = "jvmAndJsSecondCommonMain"
- displayName = "jvmAndJsSecondCommonMain"
- analysisPlatform = "common"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmAndJsSecondCommonMain/kotlin").toString())
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jsMain/kotlin").toString())
- includes = listOf(Paths.get("$includesDir/include2.md").toString())
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString())
- includes = listOf(
- Paths.get("$includesDir/include1.md").toString(),
- Paths.get("$includesDir/include11.md").toString()
- )
- }
- }
- }
-
- testFromData(configuration) {
- documentablesMergingStage = { module ->
- val value = module.documentation.entries.single {
- it.key.displayName == "jvm"
- }.value
- assertNotNull(value.dfs {
- (it as? Text)?.body == "This is second JVM documentation for module example"
- })
-
- assertNotNull(value.dfs {
- (it as? Text)?.body == "This is JVM documentation for module example"
- })
- }
- }
- }
-
- @Test
- fun `should have a correct link to declaration from another source set`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- val common = sourceSet {
- sourceRoots = listOf("src/commonMain")
- analysisPlatform = "common"
- name = "common"
- displayName = "common"
- }
- sourceSet {
- sourceRoots = listOf("src/jvmMain/")
- analysisPlatform = "jvm"
- name = "jvm"
- displayName = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- }
- }
- }
-
- testInline(
- """
- /src/commonMain/main.kt
- class A
- /src/jvmMain/main.kt
- /**
- * link to [A]
- */
- class B
- """.trimIndent()
- ,
- pluginOverrides = listOf(writerPlugin),
- configuration = configuration
- ) {
- renderingStage = { _, _ ->
- val page =
- Jsoup.parse(writerPlugin.writer.contents.getValue("root/[root]/-b/index.html"))
- val link = page.select(".paragraph a").single()
- assertEquals("../-a/index.html", link.attr("href"))
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt b/plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt
deleted file mode 100644
index 6dce09fc..00000000
--- a/plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package linking
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRIExtraContainer
-import org.jetbrains.dokka.links.EnumEntryDRIExtra
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.DocumentationLink
-import org.jetbrains.dokka.pages.ContentDRILink
-import org.jetbrains.dokka.pages.ContentPage
-import org.jsoup.Jsoup
-import utils.TestOutputWriterPlugin
-import java.nio.file.Paths
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import utils.OnlyDescriptors
-
-class EnumValuesLinkingTest : BaseAbstractTest() {
-
- @OnlyDescriptors // TODO
- @Test
- fun `check if enum values are correctly linked`() {
- val writerPlugin = TestOutputWriterPlugin()
- val testDataDir = getTestDataDir("linking").toAbsolutePath()
- testFromData(
- dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString())
- analysisPlatform = "jvm"
- name = "jvm"
- }
- }
- },
- pluginOverrides = listOf(writerPlugin)
- ) {
- documentablesTransformationStage = {
- val classlikes = it.packages.single().children
- assertEquals(4, classlikes.size)
-
- val javaLinker = classlikes.single { it.name == "JavaLinker" }
- javaLinker.documentation.values.single().children.run {
- when (val kotlinLink = this[0].children[1].children[1]) {
- is DocumentationLink -> kotlinLink.dri.run {
- assertEquals("KotlinEnum.ON_CREATE", this.classNames)
- assertEquals(null, this.callable)
- assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra])
- }
- else -> throw AssertionError("Link node is not DocumentationLink type")
- }
-
- when (val javaLink = this[0].children[2].children[1]) {
- is DocumentationLink -> javaLink.dri.run {
- assertEquals("JavaEnum.ON_DECEIT", this.classNames)
- assertEquals(null, this.callable)
- assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra])
- }
- else -> throw AssertionError("Link node is not DocumentationLink type")
- }
- }
-
- val kotlinLinker = classlikes.single { it.name == "KotlinLinker" }
- kotlinLinker.documentation.values.single().children.run {
- when (val kotlinLink = this[0].children[0].children[5]) {
- is DocumentationLink -> kotlinLink.dri.run {
- assertEquals("KotlinEnum.ON_CREATE", this.classNames)
- assertEquals(null, this.callable)
- assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra])
- }
- else -> throw AssertionError("Link node is not DocumentationLink type")
- }
-
- when (val javaLink = this[0].children[0].children[9]) {
- is DocumentationLink -> javaLink.dri.run {
- assertEquals("JavaEnum.ON_DECEIT", this.classNames)
- assertEquals(null, this.callable)
- assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra])
- }
- else -> throw AssertionError("Link node is not DocumentationLink type")
- }
- }
-
- assertEquals(
- javaLinker.documentation.values.single().children[0].children[1].children[1].let { it as? DocumentationLink }?.dri,
- kotlinLinker.documentation.values.single().children[0].children[0].children[5].let { it as? DocumentationLink }?.dri
- )
-
- assertEquals(
- javaLinker.documentation.values.single().children[0].children[2].children[1].let { it as? DocumentationLink }?.dri,
- kotlinLinker.documentation.values.single().children[0].children[0].children[9].let { it as? DocumentationLink }?.dri
- )
- }
-
- renderingStage = { rootPageNode, _ ->
- val classlikes = rootPageNode.children.single().children
- assertEquals(4, classlikes.size)
-
- val javaLinker = classlikes.single { it.name == "JavaLinker" }
- (javaLinker as ContentPage).run {
- assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "KotlinEnum.ON_CREATE" })
- assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "JavaEnum.ON_DECEIT" })
- }
-
- val kotlinLinker = classlikes.single { it.name == "KotlinLinker" }
- (kotlinLinker as ContentPage).run {
- assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "KotlinEnum.ON_CREATE" })
- assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "JavaEnum.ON_DECEIT" })
- }
-
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/linking.source/-java-linker/index.html"))
- .select("a[href=\"../-kotlin-enum/-o-n_-c-r-e-a-t-e/index.html\"]")
- .assertOnlyOneElement()
-
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/linking.source/-java-linker/index.html"))
- .select("a[href=\"../-java-enum/-o-n_-d-e-c-e-i-t/index.html\"]")
- .assertOnlyOneElement()
-
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/linking.source/-kotlin-linker/index.html"))
- .select("a[href=\"../-kotlin-enum/-o-n_-c-r-e-a-t-e/index.html\"]")
- .assertOnlyOneElement()
-
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/linking.source/-kotlin-linker/index.html"))
- .select("a[href=\"../-java-enum/-o-n_-d-e-c-e-i-t/index.html\"]")
- .assertOnlyOneElement()
- }
- }
- }
-
- private fun <T> List<T>.assertOnlyOneElement() {
- if (isEmpty() || size > 1) {
- throw AssertionError("Single element expected in list: $this")
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/locationProvider/AndroidExternalLocationProviderTest.kt b/plugins/base/src/test/kotlin/locationProvider/AndroidExternalLocationProviderTest.kt
deleted file mode 100644
index 1d107947..00000000
--- a/plugins/base/src/test/kotlin/locationProvider/AndroidExternalLocationProviderTest.kt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package locationProvider
-
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.external.javadoc.AndroidExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class AndroidExternalLocationProviderTest : BaseAbstractTest() {
- private val android = ExternalDocumentation(
- URL("https://developer.android.com/reference/kotlin"),
- PackageList(
- RecognizedLinkFormat.DokkaHtml,
- mapOf("" to setOf("android.content", "android.net")),
- emptyMap(),
- URL("file://not-used")
- )
- )
- private val androidx = ExternalDocumentation(
- URL("https://developer.android.com/reference/kotlin"),
- PackageList(
- RecognizedLinkFormat.DokkaHtml,
- mapOf("" to setOf("androidx.appcompat.app")),
- emptyMap(),
- URL("file://not-used")
- )
- )
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- private fun getTestLocationProvider(
- externalDocumentation: ExternalDocumentation,
- context: DokkaContext? = null
- ): DefaultExternalLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- return AndroidExternalLocationProvider(externalDocumentation, dokkaContext)
- }
-
- @Test
- fun `#1230 anchor to a method from AndroidX`() {
- val locationProvider = getTestLocationProvider(androidx)
- val dri = DRI(
- "androidx.appcompat.app",
- "AppCompatActivity",
- Callable("findViewById", null, listOf(TypeConstructor("kotlin.Int", emptyList())))
- )
-
- assertEquals(
- "${androidx.documentationURL}/androidx/appcompat/app/AppCompatActivity.html#findviewbyid",
- locationProvider.resolve(dri)
- )
- }
-
- @Test
- fun `anchor to a method from Android`() {
- val locationProvider = getTestLocationProvider(android)
- val dri = DRI(
- "android.content",
- "ContextWrapper",
- Callable(
- "checkCallingUriPermission",
- null,
- listOf(
- TypeConstructor("android.net.Uri", emptyList()),
- TypeConstructor("kotlin.Int", emptyList())
- )
- )
- )
-
- assertEquals(
- "${android.documentationURL}/android/content/ContextWrapper.html#checkcallinguripermission",
- locationProvider.resolve(dri)
- )
- }
-
- @Test
- fun `should return null for method not in list`() {
- val locationProvider = getTestLocationProvider(android)
- val dri = DRI(
- "foo",
- "Bar",
- Callable(
- "baz",
- null,
- emptyList()
- )
- )
-
- assertEquals(null, locationProvider.resolve(dri))
- }
-}
diff --git a/plugins/base/src/test/kotlin/locationProvider/DefaultExternalLocationProviderTest.kt b/plugins/base/src/test/kotlin/locationProvider/DefaultExternalLocationProviderTest.kt
deleted file mode 100644
index c4c3c1e4..00000000
--- a/plugins/base/src/test/kotlin/locationProvider/DefaultExternalLocationProviderTest.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package locationProvider
-
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class DefaultExternalLocationProviderTest : BaseAbstractTest() {
- private val testDataDir =
- getTestDataDir("locationProvider").toAbsolutePath().toString().removePrefix("/").let { "/$it" }
- private val kotlinLang = "https://kotlinlang.org/api/latest/jvm/stdlib"
- private val packageListURL = URL("file://$testDataDir/stdlib-package-list")
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- private fun getTestLocationProvider(context: DokkaContext? = null): DefaultExternalLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- val packageList = PackageList.load(packageListURL, 8, true)!!
- val externalDocumentation =
- ExternalDocumentation(URL(kotlinLang), packageList)
- return DefaultExternalLocationProvider(externalDocumentation, ".html", dokkaContext)
- }
-
- @Test
- fun `ordinary link`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI("kotlin.reflect", "KVisibility")
-
- assertEquals("$kotlinLang/kotlin.reflect/-k-visibility/index.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `relocation in package list`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "",
- "",
- Callable(
- "longArray",
- null,
- listOf(
- TypeConstructor("kotlin.Int", emptyList()),
- TypeConstructor("kotlin.Any", emptyList())
- )
- )
- )
-
- assertEquals("$kotlinLang/kotlin-stdlib/[JS root]/long-array.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `should return null for class not in list`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "foo",
- "Bar"
- )
-
- assertEquals(null, locationProvider.resolve(dri))
- }
-}
diff --git a/plugins/base/src/test/kotlin/locationProvider/Dokka010ExternalLocationProviderTest.kt b/plugins/base/src/test/kotlin/locationProvider/Dokka010ExternalLocationProviderTest.kt
deleted file mode 100644
index 338e7495..00000000
--- a/plugins/base/src/test/kotlin/locationProvider/Dokka010ExternalLocationProviderTest.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package locationProvider
-
-import org.jetbrains.dokka.base.resolvers.external.Dokka010ExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class Dokka010ExternalLocationProviderTest : BaseAbstractTest() {
- private val testDataDir =
- getTestDataDir("locationProvider").toAbsolutePath().toString().removePrefix("/").let { "/$it" }
- private val kotlinLang = "https://kotlinlang.org/api/latest/jvm/stdlib"
- private val packageListURL = URL("file://$testDataDir/old-package-list")
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- private fun getTestLocationProvider(context: DokkaContext? = null): Dokka010ExternalLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- val packageList = PackageList.load(packageListURL, 8, true)!!
- val externalDocumentation =
- ExternalDocumentation(URL(kotlinLang), packageList)
- return Dokka010ExternalLocationProvider(externalDocumentation, ".html", dokkaContext)
- }
-
- @Test
- fun `ordinary link`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI("kotlin.reflect", "KVisibility")
-
- assertEquals("$kotlinLang/kotlin.reflect/-k-visibility/index.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `relocation in package list`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI("kotlin.text", "StringBuilder")
-
- assertEquals("$kotlinLang/kotlin.relocated.text/-string-builder/index.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `method relocation in package list`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "kotlin",
- "",
- Callable(
- "minus",
- null,
- listOf(
- TypeConstructor("java.math.BigDecimal", emptyList()),
- TypeConstructor("java.math.BigDecimal", emptyList())
- )
- )
- )
-
- assertEquals("$kotlinLang/kotlin/java.math.-big-decimal/minus.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `#1268 companion part should be stripped`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "kotlin",
- "Int.Companion",
- Callable(
- "MIN_VALUE",
- null,
- emptyList()
- )
- )
-
- assertEquals("$kotlinLang/kotlin/-int/-m-i-n_-v-a-l-u-e.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `companion part should be stripped in relocations`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "kotlin",
- "Int.Companion",
- Callable(
- "MAX_VALUE",
- null,
- emptyList()
- )
- )
-
- assertEquals("$kotlinLang/kotlin/-int/max-value.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `should return null for method not in list`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "foo",
- "Bar",
- Callable(
- "baz",
- null,
- emptyList()
- )
- )
-
- assertEquals(null, locationProvider.resolve(dri))
- }
-}
diff --git a/plugins/base/src/test/kotlin/locationProvider/DokkaLocationProviderTest.kt b/plugins/base/src/test/kotlin/locationProvider/DokkaLocationProviderTest.kt
deleted file mode 100644
index dce19f70..00000000
--- a/plugins/base/src/test/kotlin/locationProvider/DokkaLocationProviderTest.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package locationProvider
-
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class DokkaLocationProviderTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- private fun getTestLocationProvider(root: RootPageNode, context: DokkaContext? = null): DokkaLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- return DokkaLocationProvider(root, dokkaContext, ".html")
- }
-
- @DslMarker
- annotation class TestNavigationDSL
-
- @TestNavigationDSL
- class NavigationDSL {
- companion object {
- private val stubDCI = DCI(
- setOf(
- DRI("kotlin", "Any")
- ),
- ContentKind.Comment
- )
- val stubContentNode = ContentText("", stubDCI, emptySet())
- }
-
- operator fun invoke(name: String, fn: ModulesDsl.() -> Unit): RendererSpecificRootPage {
- val modules = ModulesDsl().also { it.fn() }
- return RendererSpecificRootPage(name = name, children = modules.pages, RenderingStrategy.DoNothing)
- }
-
- @TestNavigationDSL
- class ModulesDsl(val pages: MutableList<ModulePageNode> = mutableListOf()) {
- fun modulePage(name: String, fn: PackageDsl.() -> Unit) {
- val packages = PackageDsl().also { it.fn() }
- pages.add(
- ModulePageNode(
- name = name,
- children = packages.pages,
- content = stubContentNode
- )
- )
- }
- }
-
- @TestNavigationDSL
- class PackageDsl(val pages: MutableList<PackagePageNode> = mutableListOf()) {
- fun packagePage(name: String, fn: ClassDsl.() -> Unit) {
- val packages = ClassDsl().also { it.fn() }
- pages.add(
- PackagePageNode(
- name = name,
- children = packages.pages,
- content = stubContentNode,
- dri = emptySet()
- )
- )
- }
- }
-
- @TestNavigationDSL
- class ClassDsl(val pages: MutableList<ClasslikePageNode> = mutableListOf()) {
- fun classPage(name: String) {
- pages.add(
- ClasslikePageNode(
- name = name,
- children = emptyList(),
- content = stubContentNode,
- dri = emptySet()
- )
- )
- }
- }
- }
-
- @Test
- fun `links to a package with or without a class`() {
- val root = NavigationDSL()("Root") {
- modulePage("Module") {
- packagePage("Package") {}
- }
- }
- val packagePage = root.children.first().children.first() as PackagePageNode
- val locationProvider = getTestLocationProvider(root)
- val resolvedLink = locationProvider.resolve(packagePage)
- val localToRoot = locationProvider.pathToRoot(packagePage)
-
- val rootWithClass = NavigationDSL()("Root") {
- modulePage("Module") {
- packagePage("Package") {
- classPage("ClassA")
- }
- }
- }
- val packagePageWithClass = rootWithClass.children.first().children.first() as PackagePageNode
-
- val locationProviderWithClass = getTestLocationProvider(rootWithClass)
- val localToRootWithClass = locationProviderWithClass.pathToRoot(packagePageWithClass)
- val resolvedLinkWithClass = locationProviderWithClass.resolve(packagePageWithClass)
-
- assertEquals("-module/Package.html", resolvedLink)
- assertEquals("../", localToRoot)
-
- assertEquals("-module/Package/index.html", resolvedLinkWithClass)
- assertEquals("../../", localToRootWithClass)
- }
-}
diff --git a/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt b/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt
deleted file mode 100644
index 1a747429..00000000
--- a/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package locationProvider
-
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.external.javadoc.JavadocExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.DRIExtraContainer
-import org.jetbrains.dokka.links.EnumEntryDRIExtra
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavadocExternalLocationProviderTest : BaseAbstractTest() {
- private val testDataDir =
- getTestDataDir("locationProvider").toAbsolutePath().toString().removePrefix("/").let { "/$it" }
-
- private val jdk = "https://docs.oracle.com/javase/8/docs/api/"
- private val jdkPackageListURL = URL("file://$testDataDir/jdk8-package-list")
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- private fun getTestLocationProvider(context: DokkaContext? = null): DefaultExternalLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- val packageList = PackageList.load(jdkPackageListURL, 8, true)!!
- val externalDocumentation =
- ExternalDocumentation(URL(jdk), packageList)
- return JavadocExternalLocationProvider(externalDocumentation, "--", "-", dokkaContext)
- }
-
- @Test
- fun `link to enum entity of javadoc`() {
- val locationProvider = getTestLocationProvider()
- val ktDri = DRI(
- "java.nio.file",
- "StandardOpenOption.CREATE",
- extra = DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()
- )
- val javaDri = DRI(
- "java.nio.file",
- "StandardOpenOption.CREATE",
- null,
- PointingToDeclaration,
- DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()
- )
-
- assertEquals(
- "https://docs.oracle.com/javase/8/docs/api/java/nio/file/StandardOpenOption.html#CREATE",
- locationProvider.resolve(ktDri)
- )
-
- assertEquals(
- "https://docs.oracle.com/javase/8/docs/api/java/nio/file/StandardOpenOption.html#CREATE",
- locationProvider.resolve(javaDri)
- )
- }
-
- @Test
- fun `link to nested class of javadoc`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI(
- "java.rmi.activation",
- "ActivationGroupDesc.CommandEnvironment"
- )
-
- assertEquals(
- "https://docs.oracle.com/javase/8/docs/api/java/rmi/activation/ActivationGroupDesc.CommandEnvironment.html",
- locationProvider.resolve(dri)
- )
- }
-}
diff --git a/plugins/base/src/test/kotlin/locationProvider/MultiModuleLinkingTest.kt b/plugins/base/src/test/kotlin/locationProvider/MultiModuleLinkingTest.kt
deleted file mode 100644
index 17327c4c..00000000
--- a/plugins/base/src/test/kotlin/locationProvider/MultiModuleLinkingTest.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package locationProvider
-
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProvider
-import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class MultiModuleLinkingTest : BaseAbstractTest() {
- private val testDataDir =
- getTestDataDir("locationProvider").toAbsolutePath().toString().removePrefix("/").let { "/$it" }
- private val exampleDomain = "https://example.com"
- private val packageListURL = URL("file://$testDataDir/multi-module-package-list")
- private val kotlinLang = "https://kotlinlang.org/api/latest/jvm/stdlib"
- private val stdlibPackageListURL = URL("file://$testDataDir/stdlib-package-list")
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- private fun getTestLocationProvider(context: DokkaContext? = null): DefaultExternalLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- val packageList = PackageList.load(packageListURL, 8, true)!!
- val externalDocumentation =
- ExternalDocumentation(URL(exampleDomain), packageList)
- return DefaultExternalLocationProvider(externalDocumentation, ".html", dokkaContext)
- }
-
- private fun getStdlibTestLocationProvider(context: DokkaContext? = null): DefaultExternalLocationProvider {
- val dokkaContext = context ?: DokkaContext.create(configuration, logger, emptyList())
- val packageList = PackageList.load(stdlibPackageListURL, 8, true)!!
- val externalDocumentation =
- ExternalDocumentation(URL(kotlinLang), packageList)
- return DefaultExternalLocationProvider(externalDocumentation, ".html", dokkaContext)
- }
-
- @Test
- fun `should link to a multi-module declaration`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI("baz", "BazClass")
-
- assertEquals("$exampleDomain/moduleB/baz/-baz-class/index.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `should not fail on non-present package`() {
- val stdlibLocationProvider = getStdlibTestLocationProvider()
- val locationProvider = getTestLocationProvider()
- val dri = DRI("baz", "BazClass")
-
- assertEquals(null, stdlibLocationProvider.resolve(dri))
- assertEquals("$exampleDomain/moduleB/baz/-baz-class/index.html", locationProvider.resolve(dri))
- }
-
- @Test
- fun `should handle relocations`() {
- val locationProvider = getTestLocationProvider()
- val dri = DRI("", "NoPackageClass")
-
- assertEquals("$exampleDomain/moduleB/[root]/-no-package-class/index.html", locationProvider.resolve(dri))
- }
-}
diff --git a/plugins/base/src/test/kotlin/markdown/KDocTest.kt b/plugins/base/src/test/kotlin/markdown/KDocTest.kt
deleted file mode 100644
index 89f58f1b..00000000
--- a/plugins/base/src/test/kotlin/markdown/KDocTest.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package markdown
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DPackage
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.pages.ModulePageNode
-import kotlin.test.assertEquals
-
-abstract class KDocTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/example/Test.kt")
- }
- }
- }
-
- private fun interpolateKdoc(kdoc: String) = """
- |/src/main/kotlin/example/Test.kt
- |package example
- | /**
- ${kdoc.split("\n").joinToString("") { "| *$it\n" } }
- | */
- |class Test
- """.trimMargin()
-
- private fun actualDocumentationNode(modulePageNode: ModulePageNode) =
- (modulePageNode.documentables.firstOrNull()?.children?.first() as DPackage)
- .classlikes.single()
- .documentation.values.single()
-
-
- protected fun executeTest(kdoc: String, expectedDocumentationNode: DocumentationNode) {
- testInline(
- interpolateKdoc(kdoc),
- configuration
- ) {
- pagesGenerationStage = {
- assertEquals(
- expectedDocumentationNode,
- actualDocumentationNode(it as ModulePageNode)
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/markdown/LinkTest.kt b/plugins/base/src/test/kotlin/markdown/LinkTest.kt
deleted file mode 100644
index f783892f..00000000
--- a/plugins/base/src/test/kotlin/markdown/LinkTest.kt
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package markdown
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.*
-import org.jetbrains.dokka.model.WithGenerics
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.ContentDRILink
-import org.jetbrains.dokka.pages.MemberPageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-
-class LinkTest : BaseAbstractTest() {
-
- @Test
- fun linkToClassLoader() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/parser")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/parser/Test.kt
- |package parser
- |
- | /**
- | * Some docs that link to [ClassLoader.clearAssertionStatus]
- | */
- |fun test(x: ClassLoader) = x.clearAssertionStatus()
- |
- """.trimMargin(),
- configuration
- ) {
- renderingStage = { rootPageNode, _ ->
- assertNotNull((rootPageNode.children.single().children.single() as MemberPageNode)
- .content
- .dfs { node ->
- node is ContentDRILink &&
- node.address.toString() == "parser//test/#java.lang.ClassLoader/PointingToDeclaration/"
- }
- )
- }
- }
- }
-
- @Test
- fun returnTypeShouldHaveLinkToOuterClassFromInner() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- displayName = "JVM"
- }
- }
- }
- //This does not contain a package to check for situation when the package has to be artificially generated
- testInline(
- """
- |/src/main/kotlin/parser/Test.kt
- |
- |class Outer<OUTER> {
- | inner class Inner<INNER> {
- | fun foo(): OUTER = TODO()
- | }
- |}
- """.trimMargin(),
- configuration
- ) {
- renderingStage = { rootPageNode, _ ->
- val root = rootPageNode.children.single().children.single() as ClasslikePageNode
- val innerClass = root.children.first { it is ClasslikePageNode }
- val foo = innerClass.children.first { it.name == "foo" } as MemberPageNode
- val destinationDri = (root.documentables.firstOrNull() as WithGenerics).generics.first().dri.toString()
-
- assertEquals(destinationDri, "/Outer///PointingToGenericParameters(0)/")
- assertNotNull(foo.content.dfs { it is ContentDRILink && it.address.toString() == destinationDri })
- }
- }
- }
-
- @Test
- fun `link to parameter #238`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- |/**
- |* Link to [waitAMinute]
- |*/
- |fun stop(hammerTime: String, waitAMinute: String) {}
- |
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val parameter = module.dfs { it.name == "waitAMinute" }
- val link = module.dfs { it.name == "stop" }!!.documentation.values.single()
- .dfs { it is DocumentationLink } as DocumentationLink
-
- assertEquals(parameter!!.dri, link.dri)
- }
- }
- }
-
- @Test
- fun `link with exclamation mark`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package example
- |
- |/**
- |* Link to ![waitAMinute]
- |*/
- |fun stop(hammerTime: String, waitAMinute: String) {}
- |
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val functionDocs = module.packages.flatMap { it.functions }.first().documentation.values.first()
- val expected = Description(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Link to !"),
- DocumentationLink(
- dri = DRI(
- packageName = "example",
- callable = Callable(
- "stop",
- receiver = null,
- params = listOf(
- TypeConstructor("kotlin.String", emptyList()),
- TypeConstructor("kotlin.String", emptyList())
- )
- ),
- target = PointingToCallableParameters(1)
- ),
- children = listOf(
- Text("waitAMinute")
- ),
- params = mapOf("href" to "[waitAMinute]")
- )
- )
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expected, functionDocs.children.first())
- }
- }
- }
-
- @Test
- fun `link to property with exclamation mark`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Testing.kt
- |package example
- |
- |/**
- |* Link to ![Testing.property]
- |*/
- |class Testing {
- | var property = ""
- |}
- |
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val functionDocs = module.packages.flatMap { it.classlikes }.first().documentation.values.first()
- val expected = Description(
- root = CustomDocTag(
- children = listOf(
- P(
- children = listOf(
- Text("Link to !"),
- DocumentationLink(
- dri = DRI(
- packageName = "example",
- classNames = "Testing",
- callable = Callable("property", null, emptyList()),
- target = PointingToDeclaration
- ),
- children = listOf(
- Text("Testing.property")
- ),
- params = mapOf("href" to "[Testing.property]")
- )
- )
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expected, functionDocs.children.first())
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/markdown/ParserTest.kt b/plugins/base/src/test/kotlin/markdown/ParserTest.kt
deleted file mode 100644
index bcca27c4..00000000
--- a/plugins/base/src/test/kotlin/markdown/ParserTest.kt
+++ /dev/null
@@ -1,1633 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.tests
-
-import markdown.KDocTest
-
-import org.jetbrains.dokka.analysis.markdown.jb.MARKDOWN_ELEMENT_FILE_NAME
-import org.jetbrains.dokka.analysis.markdown.jb.MarkdownParser
-import org.jetbrains.dokka.model.doc.*
-import kotlin.test.Ignore
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-
-class ParserTest : KDocTest() {
-
- private fun parseMarkdownToDocNode(text: String) =
- MarkdownParser( { null }, "").parseStringToDocNode(text)
-
- @Test
- fun `Simple text`() {
- val kdoc = """
- | This is simple test of string
- | Next line
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(P(listOf(Text("This is simple test of string Next line")))),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Simple text with new line`() {
- val kdoc = """
- | This is simple test of string\
- | Next line
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("This is simple test of string"),
- Br,
- Text("Next line")
- )
- )
- ),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Text with Bold and Emphasis decorators`() {
- val kdoc = """
- | This is **simple** test of _string_
- | Next **_line_**
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("This is "),
- B(listOf(Text("simple"))),
- Text(" test of "),
- I(listOf(Text("string"))),
- Text(" Next "),
- B(listOf(I(listOf(Text("line")))))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Text with Colon`() {
- val kdoc = """
- | This is simple text with: colon!
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(P(listOf(Text("This is simple text with: colon!")))),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Multilined text`() {
- val kdoc = """
- | Text
- | and
- | String
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(P(listOf(Text("Text and String")))),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Paragraphs`() {
- val kdoc = """
- | Paragraph number
- | one
- |
- | Paragraph\
- | number two
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(listOf(Text("Paragraph number one"))),
- P(listOf(Text("Paragraph"), Br, Text("number two")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Emphasis with star`() {
- val kdoc = " *text*"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(P(listOf(I(listOf(Text("text")))))),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Underscores that are not Emphasis`() {
- val kdoc = "text_with_underscores"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(P(listOf(Text("text_with_underscores")))),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Emphasis with underscores`() {
- val kdoc = "_text_"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(P(listOf(I(listOf(Text("text")))))),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Stars as italic bounds`() {
- val kdoc = "The abstract syntax tree node for a multiplying expression. A multiplying\n" +
- "expression is a binary expression where the operator is a multiplying operator\n" +
- "such as \"*\", \"/\", or \"mod\". A simple example would be \"5*x\"."
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text(
- "The abstract syntax tree node for a multiplying expression. A multiplying " +
- "expression is a binary expression where the operator is a multiplying operator " +
- "such as \""
- ),
- I(listOf(Text("\", \"/\", or \"mod\". A simple example would be \"5"))),
- Text("x\".")
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Stars as bold bounds`() {
- val kdoc = "The abstract syntax tree node for a multiplying expression. A multiplying\n" +
- "expression is a binary expression where the operator is a multiplying operator\n" +
- "such as \"**\", \"/\", or \"mod\". A simple example would be \"5**x\"."
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text(
- "The abstract syntax tree node for a multiplying expression. A multiplying " +
- "expression is a binary expression where the operator is a multiplying operator " +
- "such as \""
- ),
- B(listOf(Text("\", \"/\", or \"mod\". A simple example would be \"5"))),
- Text("x\".")
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Embedded star`() {
- val kdoc = "Embedded*Star"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(listOf(Text("Embedded*Star")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
-
- @Test
- fun `Unordered list`() {
- val kdoc = """
- | * list item 1
- | * list item 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("list item 1"))))),
- Li(listOf(P(listOf(Text("list item 2")))))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Unordered list with multilines`() {
- val kdoc = """
- | * list item 1
- | continue 1
- | * list item 2\
- | continue 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("list item 1 continue 1"))))),
- Li(listOf(P(listOf(Text("list item 2"), Br, Text("continue 2")))))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Unordered list with Bold`() {
- val kdoc = """
- | * list **item** 1
- | continue 1
- | * list __item__ 2
- | continue 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ul(
- listOf(
- Li(
- listOf(
- P(
- listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 1 continue 1")
- )
- )
- )
- ),
- Li(
- listOf(
- P(
- listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 2 continue 2")
- )
- )
- )
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Unordered list with nested bullets`() {
- val kdoc = """
- | * Outer first
- | Outer next line
- | * Outer second
- | - Middle first
- | Middle next line
- | - Middle second
- | + Inner first
- | Inner next line
- | - Middle third
- | * Outer third
- |
- | New paragraph""".trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- )
- ),
- Li(listOf(P(listOf(Text("Middle third")))))
- )
- ),
- Li(listOf(P(listOf(Text("Outer third")))))
- )
- ),
- P(listOf(Text("New paragraph")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Ordered list`() {
- val kdoc = """
- | 1. list item 1
- | 2. list item 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("list item 1"))))),
- Li(listOf(P(listOf(Text("list item 2")))))
- ),
- mapOf("start" to "1")
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
-
- @Test
- fun `Ordered list beginning from other number`() {
- val kdoc = """
- | 9. list item 1
- | 12. list item 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("list item 1"))))),
- Li(listOf(P(listOf(Text("list item 2")))))
- ),
- mapOf("start" to "9")
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Ordered list with multilines`() {
- val kdoc = """
- | 2. list item 1
- | continue 1
- | 3. list item 2
- | continue 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("list item 1 continue 1"))))),
- Li(listOf(P(listOf(Text("list item 2 continue 2")))))
- ),
- mapOf("start" to "2")
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Ordered list with Bold`() {
- val kdoc = """
- | 1. list **item** 1
- | continue 1
- | 2. list __item__ 2
- | continue 2
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ol(
- listOf(
- Li(
- listOf(
- P(
- listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 1 continue 1")
- )
- )
- )
- ),
- Li(
- listOf(
- P(
- listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 2 continue 2")
- )
- )
- )
- )
- ),
- mapOf("start" to "1")
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Ordered list with nested bullets`() {
- val kdoc = """
- | 1. Outer first
- | Outer next line
- | 2. Outer second
- | 1. Middle first
- | Middle next line
- | 2. Middle second
- | 1. Inner first
- | Inner next line
- | 5. Middle third
- | 4. Outer third
- |
- | New paragraph""".trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- ),
- mapOf("start" to "1")
- ),
- Li(listOf(P(listOf(Text("Middle third")))))
- ),
- mapOf("start" to "1")
- ),
- Li(listOf(P(listOf(Text("Outer third")))))
- ),
- mapOf("start" to "1")
- ),
- P(listOf(Text("New paragraph")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Ordered nested in Unordered nested in Ordered list`() {
- val kdoc = """
- | 1. Outer first
- | Outer next line
- | 2. Outer second
- | + Middle first
- | Middle next line
- | + Middle second
- | 1. Inner first
- | Inner next line
- | + Middle third
- | 4. Outer third
- |
- | New paragraph""".trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- ),
- mapOf("start" to "1")
- ),
- Li(listOf(P(listOf(Text("Middle third")))))
- )
- ),
- Li(listOf(P(listOf(Text("Outer third")))))
- ),
- mapOf("start" to "1")
- ),
- P(listOf(Text("New paragraph")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Header and two paragraphs`() {
- val kdoc = """
- | # Header 1
- | Following text
- |
- | New paragraph
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- H1(listOf(Text("Header 1"))),
- P(listOf(Text("Following text"))),
- P(listOf(Text("New paragraph")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Ignore //TODO: ATX_2 to ATX_6 and sometimes ATX_1 from jetbrains parser consumes white space. Need to handle it in their library
- @Test
- fun `All headers`() {
- val kdoc = """
- | # Header 1
- | Text 1
- | ## Header 2
- | Text 2
- | ### Header 3
- | Text 3
- | #### Header 4
- | Text 4
- | ##### Header 5
- | Text 5
- | ###### Header 6
- | Text 6
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- H1(listOf(Text("Header 1"))),
- P(listOf(Text("Text 1"))),
- H2(listOf(Text("Header 2"))),
- P(listOf(Text("Text 2"))),
- H3(listOf(Text("Header 3"))),
- P(listOf(Text("Text 3"))),
- H4(listOf(Text("Header 4"))),
- P(listOf(Text("Text 4"))),
- H5(listOf(Text("Header 5"))),
- P(listOf(Text("Text 5"))),
- H6(listOf(Text("Header 6"))),
- P(listOf(Text("Text 6")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Bold New Line Bold`() {
- val kdoc = """
- | **line 1**\
- | **line 2**
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- B(listOf(Text("line 1"))),
- Br,
- B(listOf(Text("line 2")))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Horizontal rule`() {
- val kdoc = """
- | ***
- | text 1
- | ___
- | text 2
- | ***
- | text 3
- | ___
- | text 4
- | ***
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- HorizontalRule,
- P(listOf(Text("text 1"))),
- HorizontalRule,
- P(listOf(Text("text 2"))),
- HorizontalRule,
- P(listOf(Text("text 3"))),
- HorizontalRule,
- P(listOf(Text("text 4"))),
- HorizontalRule
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Blockquote`() {
- val kdoc = """
- | > Blockquotes are very handy in email to emulate reply text.
- | > This line is part of the same quote.
- |
- | Quote break.
- |
- | > Quote
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- BlockQuote(
- listOf(
- P(
- listOf(
- Text("Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.")
- )
- )
- )
- ),
- P(listOf(Text("Quote break."))),
- BlockQuote(
- listOf(
- P(listOf(Text("Quote")))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
-
- @Test
- fun `Blockquote nested`() {
- val kdoc = """
- | > text 1
- | > text 2
- | >> text 3
- | >> text 4
- | >
- | > text 5
- |
- | Quote break.
- |
- | > Quote
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- BlockQuote(
- listOf(
- P(listOf(Text("text 1 text 2"))),
- BlockQuote(
- listOf(
- P(listOf(Text("text 3 text 4")))
- )
- ),
- P(listOf(Text("text 5")))
- )
- ),
- P(listOf(Text("Quote break."))),
- BlockQuote(
- listOf(
- P(listOf(Text("Quote")))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Ignore //TODO: Again ATX_1 consumes white space
- @Test
- fun `Blockquote nested with fancy text enhancement`() {
- val kdoc = """
- | > text **1**
- | > text 2
- | >> # text 3
- | >> * text 4
- | >> * text 5
- | >
- | > text 6
- |
- | Quote break.
- |
- | > Quote
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- BlockQuote(
- listOf(
- P(
- listOf(
- Text("text "),
- B(listOf(Text("1"))),
- Text("\ntext 2")
- )
- ),
- BlockQuote(
- listOf(
- H1(listOf(Text("text 3"))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("text 4"))))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("text 5")))))
- )
- )
- )
- )
- )
- ),
- P(listOf(Text("text 6")))
- )
- ),
- P(listOf(Text("Quote break."))),
- BlockQuote(
- listOf(
- P(listOf(Text("Quote")))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Simple Code Block`() {
- val kdoc = """
- | `Some code`
- | Sample text
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- CodeInline(listOf(Text("Some code"))),
- Text(" Sample text")
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Multilined Code Block`() {
- val kdoc = """
- | ```kotlin
- | @Suppress("UNUSED_VARIABLE")
- | val x: Int = 0
- | val y: String = "Text"
- |
- | val z: Boolean = true
- | for(i in 0..10) {
- | println(i)
- | }
- | ```
- | Sample text
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- CodeBlock(
- listOf(
- Text("@Suppress(\"UNUSED_VARIABLE\")"), Br,
- Text("val x: Int = 0"), Br,
- Text("val y: String = \"Text\""), Br, Br,
- Text(" val z: Boolean = true"), Br,
- Text("for(i in 0..10) {"), Br,
- Text(" println(i)"), Br,
- Text("}")
- ),
- mapOf("lang" to "kotlin")
- ),
- P(listOf(Text("Sample text")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
-
- @Test
- fun `Inline link`() {
- val kdoc = """
- | [I'm an inline-style link](https://www.google.com)
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- A(
- listOf(Text("I'm an inline-style link")),
- mapOf("href" to "https://www.google.com")
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Inline link with title`() {
- val kdoc = """
- | [I'm an inline-style link with title](https://www.google.com "Google's Homepage")
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- A(
- listOf(Text("I'm an inline-style link with title")),
- mapOf("href" to "https://www.google.com", "title" to "Google's Homepage")
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Full reference link`() {
- val kdoc = """
- | [I'm a reference-style link][Arbitrary case-insensitive reference text]
- |
- | [arbitrary case-insensitive reference text]: https://www.mozilla.org
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- A(
- listOf(Text("I'm a reference-style link")),
- mapOf("href" to "https://www.mozilla.org")
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Full reference link with number`() {
- val kdoc = """
- | [You can use numbers for reference-style link definitions][1]
- |
- | [1]: http://slashdot.org
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- A(
- listOf(Text("You can use numbers for reference-style link definitions")),
- mapOf("href" to "http://slashdot.org")
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Short reference link`() {
- val kdoc = """
- | Or leave it empty and use the [link text itself].
- |
- | [link text itself]: http://www.reddit.com
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("Or leave it empty and use the "),
- A(
- listOf(Text("link text itself")),
- mapOf("href" to "http://www.reddit.com")
- ),
- Text(".")
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Autolink`() {
- val kdoc = """
- | URLs and URLs in angle brackets will automatically get turned into links.
- | http://www.example.com or <http://www.example.com> and sometimes
- | example.com (but not on Github, for example).
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or "),
- A(
- listOf(Text("http://www.example.com")),
- mapOf("href" to "http://www.example.com")
- ),
- Text(" and sometimes example.com (but not on Github, for example).")
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Various links`() {
- val kdoc = """
- | [I'm an inline-style link](https://www.google.com)
- |
- | [I'm an inline-style link with title](https://www.google.com "Google's Homepage")
- |
- | [I'm a reference-style link][Arbitrary case-insensitive reference text]
- |
- | [You can use numbers for reference-style link definitions][1]
- |
- | Or leave it empty and use the [link text itself].
- |
- | URLs and URLs in angle brackets will automatically get turned into links.
- | http://www.example.com or <http://www.example.com> and sometimes
- | example.com (but not on Github, for example).
- |
- | Some text to show that the reference links can follow later.
- |
- | [arbitrary case-insensitive reference text]: https://www.mozilla.org
- | [1]: http://slashdot.org
- | [link text itself]: http://www.reddit.com
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- A(
- listOf(Text("I'm an inline-style link")),
- mapOf("href" to "https://www.google.com")
- )
- )
- ),
- P(
- listOf(
- A(
- listOf(Text("I'm an inline-style link with title")),
- mapOf("href" to "https://www.google.com", "title" to "Google's Homepage")
- )
- )
- ),
- P(
- listOf(
- A(
- listOf(Text("I'm a reference-style link")),
- mapOf("href" to "https://www.mozilla.org")
- )
- )
- ),
- P(
- listOf(
- A(
- listOf(Text("You can use numbers for reference-style link definitions")),
- mapOf("href" to "http://slashdot.org")
- )
- )
- ),
- P(
- listOf(
- Text("Or leave it empty and use the "),
- A(
- listOf(Text("link text itself")),
- mapOf("href" to "http://www.reddit.com")
- ),
- Text(".")
- )
- ),
- P(
- listOf(
- Text("URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or "),
- A(
- listOf(Text("http://www.example.com")),
- mapOf("href" to "http://www.example.com")
- ),
- Text(" and sometimes example.com (but not on Github, for example).")
- )
- ),
- P(listOf(Text("Some text to show that the reference links can follow later.")))
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Windows Carriage Return Line Feed`() {
- val kdoc = "text\r\ntext"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("text text")
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun image() {
- val kdoc = "![Sample image](https://www.google.pl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png)"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Img(
- emptyList(),
- mapOf(
- "href" to "https://www.google.pl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png",
- "alt" to "Sample image"
- )
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Bold + italic + link`() {
- val kdoc = "It's very easy to make some words **bold** and other words *italic* with Markdown.\n" +
- "You can even [link to Google!](http://google.com)"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("It's very easy to make some words "),
- B(listOf(Text("bold"))),
- Text(" and other words "),
- I(listOf(Text("italic"))),
- Text(" with Markdown. You can even "),
- A(listOf(Text("link to Google!")), mapOf("href" to "http://google.com"))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Codeblock from indent`() {
- val kdoc = "Here is some example how to use conditional instructions:\n\n" +
- " val x = 1\n" +
- " val y = 2\n" +
- " if (x == 1) {\n" +
- " println(y)\n" +
- " }"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(listOf(Text("Here is some example how to use conditional instructions:"))),
- CodeBlock(
- listOf(
- Text(
- "val x = 1\n" +
- "val y = 2\n" +
- "if (x == 1) {\n" +
- " println(y)\n" +
- "}"
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Table`() {
- val kdoc = "First Header | Second Header\n" +
- "------------ | -------------\n" +
- "Content from cell 1 | Content from cell 2\n" +
- "Content in the first column | Content in the second column"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- Table(
- listOf(
- Th(
- listOf(
- Td(
- listOf(
- Text("First Header")
- )
- ),
- Td(
- listOf(
- Text("Second Header")
- )
- )
- )
- ),
- Tr(
- listOf(
- Td(
- listOf(
- Text("Content from cell 1")
- )
- ),
- Td(
- listOf(
- Text("Content from cell 2")
- )
- )
- )
- ),
- Tr(
- listOf(
- Td(
- listOf(
- Text("Content in the first column")
- )
- ),
- Td(
- listOf(
- Text("Content in the second column")
- )
- )
- )
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `Text with Strikethrough`() {
- val kdoc = """
- | This is ~~strikethroughed~~
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("This is "),
- Strikethrough(listOf(Text("strikethroughed")))
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `short link without destination`() {
- val kdoc = """
- | This is [link]()
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- Text("This is "),
- A(
- listOf(Text("link")),
- mapOf("href" to "")
- )
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
-
- @Test
- fun `exception thrown by empty header should point to location of a file`() {
- val kdoc = """
- | ###
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(emptyList())
- val exception = runCatching { executeTest(kdoc, expectedDocumentationNode) }.exceptionOrNull()
-
- val expectedMessage = "Wrong AST Tree. Header does not contain expected content in Test.kt/example.Test, element starts from offset 0 and ends 3: ###"
- assertTrue(
- exception?.message == expectedMessage
- || /* for K2 */ exception?.cause?.cause?.message == expectedMessage
- )
- }
-
- @Test
- fun `should ignore html comments`() {
- val kdoc = """
- | # Example <!--- not visible in header --> Kdoc
- | <!-- not visible alone -->
- | Pre <!--- not visible --> visible
- """.trimMargin()
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- H1(
- listOf(
- Text("Example "),
- Text("<!--- not visible in header -->", params = mapOf("content-type" to "html")),
- Text(" Kdoc")
- )
- ),
- Text("<!-- not visible alone -->", params = mapOf("content-type" to "html")),
- P(
- listOf(
- Text("Pre "),
- Text("<!--- not visible -->", params = mapOf("content-type" to "html")),
- Text(" visible")
- )
- )
- ),
- name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `code with backticks`() {
- val kdoc = "` `` ` ` ``` `"
- val expectedDocumentationNode = DocumentationNode(
- listOf(
- Description(
- CustomDocTag(
- listOf(
- P(
- listOf(
- CodeInline(listOf(Text("`` "))),
- Text(" "),
- CodeInline(listOf(Text("``` "))),
- )
- )
- ), name = MARKDOWN_ELEMENT_FILE_NAME
- )
- )
- )
- )
- executeTest(kdoc, expectedDocumentationNode)
- }
-
- @Test
- fun `should filter spaces in markdown`() {
- val markdown = """
- | sdsdds f,*()hhh
- | dssd hf
- |
- | sdsdsds sdd
- |
- |
- | eweww
- |
- |
- |
- """.trimMargin()
- val actualDocumentationNode = parseMarkdownToDocNode(markdown).children
- val expectedDocumentationNode = listOf(
- P(listOf(Text(" sdsdds f,*()hhh dssd hf"))),
- P(listOf(Text(" sdsdsds sdd"))),
- P(listOf(Text(" eweww ")))
- )
- assertEquals(actualDocumentationNode, expectedDocumentationNode)
- }
-
- @Test // exists due to #3231
- fun `should ignore the leading whitespace in header in-between the hash symbol and header text`() {
- val markdown = """
- | # first header
- | ## second header
- | ### third header
- """.trimMargin()
- val actualDocumentationNode = parseMarkdownToDocNode(markdown).children
- val expectedDocumentationNode = listOf(
- H1(listOf(Text("first header"))),
- H2(listOf(Text("second header"))),
- H3(listOf(Text("third header"))),
- )
- assertEquals(actualDocumentationNode, expectedDocumentationNode)
- }
-
- @Test // exists due to #3231
- fun `should ignore trailing whitespace in header`() {
- val markdown = """
- | # first header
- | ## second header
- | ### third header
- """.trimMargin()
- val actualDocumentationNode = parseMarkdownToDocNode(markdown).children
- val expectedDocumentationNode = listOf(
- H1(listOf(Text("first header"))),
- H2(listOf(Text("second header"))),
- H3(listOf(Text("third header"))),
- )
- assertEquals(actualDocumentationNode, expectedDocumentationNode)
- }
-
- @Test // exists due to #3231
- fun `should ignore leading and trailing whitespace in header, but not whitespace in the middle`() {
- val markdown = """
- | # first header
- | ## second ~~header~~ in a **long** sentence ending with whitespaces
- | ### third header
- """.trimMargin()
- val actualDocumentationNode = parseMarkdownToDocNode(markdown).children
- val expectedDocumentationNode = listOf(
- H1(listOf(Text("first header"))),
- H2(listOf(
- Text("second "),
- Strikethrough(listOf(Text("header"))),
- Text(" in a "),
- B(listOf(Text("long"))),
- Text(" sentence ending with whitespaces")
- )),
- H3(listOf(Text("third header"))),
- )
- assertEquals(actualDocumentationNode, expectedDocumentationNode)
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/model/ClassesTest.kt b/plugins/base/src/test/kotlin/model/ClassesTest.kt
deleted file mode 100644
index c18dfafb..00000000
--- a/plugins/base/src/test/kotlin/model/ClassesTest.kt
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.links.sureClassNames
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.KotlinModifier.*
-import kotlin.test.assertNull
-import kotlin.test.Test
-import utils.*
-
-
-class ClassesTest : AbstractModelTest("/src/main/kotlin/classes/Test.kt", "classes") {
-
- @Test
- fun emptyClass() {
- inlineModelTest(
- """
- |class Klass {}"""
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- children counts 4
- }
- }
- }
-
- @Test
- fun classWithConstructor() {
- inlineModelTest(
- """
- |class Klass(name: String)
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- children counts 4
-
- with(constructors.firstOrNull().assertNotNull("Constructor")) {
- visibility.values allEquals KotlinVisibility.Public
- parameters counts 1
- with(parameters.firstOrNull().assertNotNull("Constructor parameter")) {
- name equals "name"
- type.name equals "String"
- }
- }
-
- }
- }
- }
-
- @Test
- fun classWithFunction() {
- inlineModelTest(
- """
- |class Klass {
- | fun fn() {}
- |}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- children counts 5
-
- with((this / "fn").cast<DFunction>()) {
- type.name equals "Unit"
- parameters counts 0
- visibility.values allEquals KotlinVisibility.Public
- }
- }
- }
- }
-
- @Test
- fun classWithProperty() {
- inlineModelTest(
- """
- |class Klass {
- | val name: String = ""
- |}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- children counts 5
-
- with((this / "name").cast<DProperty>()) {
- name equals "name"
- // TODO property name
- }
- }
- }
- }
-
- @Test
- fun classWithCompanionObject() {
- inlineModelTest(
- """
- |class Klass() {
- | companion object {
- | val x = 1
- | fun foo() {}
- | }
- |}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- children counts 5
-
- with((this / "Companion").cast<DObject>()) {
- name equals "Companion"
- children counts 5
-
- with((this / "x").cast<DProperty>()) {
- name equals "x"
- }
-
- with((this / "foo").cast<DFunction>()) {
- name equals "foo"
- parameters counts 0
- type.name equals "Unit"
- }
- }
-
- with((this.companion).cast<DObject>()) {
- name equals "Companion"
- children counts 5
-
- with((this / "x").cast<DProperty>()) {
- name equals "x"
- }
-
- with((this / "foo").cast<DFunction>()) {
- name equals "foo"
- parameters counts 0
- type.name equals "Unit"
- }
- }
- }
- }
- }
-
- @Test
- fun dataClass() {
- inlineModelTest(
- """
- |data class Klass() {}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- visibility.values allEquals KotlinVisibility.Public
- with(extra[AdditionalModifiers]!!.content.entries.single().value.assertNotNull("Extras")) {
- this counts 1
- first() equals ExtraModifiers.KotlinOnlyModifiers.Data
- }
- }
- }
- }
-
- @Test
- fun sealedClass() {
- inlineModelTest(
- """
- |sealed class Klass() {}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- modifier.values.forEach { it equals Sealed }
- }
- }
- }
-
- @Test
- fun annotatedClassWithAnnotationParameters() {
- inlineModelTest(
- """
- |@Deprecated("should no longer be used") class Foo() {}
- """
- ) {
- with((this / "classes" / "Foo").cast<DClass>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "Deprecated"
- params.entries counts 1
- (params["message"].assertNotNull("message") as StringValue).value equals "should no longer be used"
- }
- }
- }
- }
- }
-
- @Test
- fun notOpenClass() {
- inlineModelTest(
- """
- |open class C() {
- | open fun f() {}
- |}
- |
- |class D() : C() {
- | override fun f() {}
- |}
- """
- ) {
- val C = (this / "classes" / "C").cast<DClass>()
- val D = (this / "classes" / "D").cast<DClass>()
-
- with(C) {
- modifier.values.forEach { it equals Open }
- with((this / "f").cast<DFunction>()) {
- modifier.values.forEach { it equals Open }
- }
- }
- with(D) {
- modifier.values.forEach { it equals Final }
- with((this / "f").cast<DFunction>()) {
- modifier.values.forEach { it equals Open }
- }
- D.supertypes.flatMap { it.component2() }.firstOrNull()?.typeConstructor?.dri equals C.dri
- }
- }
- }
-
- @Test
- fun indirectOverride() {
- inlineModelTest(
- """
- |abstract class C() {
- | abstract fun foo()
- |}
- |
- |abstract class D(): C()
- |
- |class E(): D() {
- | override fun foo() {}
- |}
- """
- ) {
- val C = (this / "classes" / "C").cast<DClass>()
- val D = (this / "classes" / "D").cast<DClass>()
- val E = (this / "classes" / "E").cast<DClass>()
-
- with(C) {
- modifier.values.forEach { it equals Abstract }
- ((this / "foo").cast<DFunction>()).modifier.values.forEach { it equals Abstract }
- }
-
- with(D) {
- modifier.values.forEach { it equals Abstract }
- }
-
- with(E) {
- modifier.values.forEach { it equals Final }
-
- }
- D.supers.single().typeConstructor.dri equals C.dri
- E.supers.single().typeConstructor.dri equals D.dri
- }
- }
-
- @Test
- fun innerClass() {
- inlineModelTest(
- """
- |class C {
- | inner class D {}
- |}
- """
- ) {
- with((this / "classes" / "C").cast<DClass>()) {
-
- with((this / "D").cast<DClass>()) {
- with(extra[AdditionalModifiers]!!.content.entries.single().value.assertNotNull("AdditionalModifiers")) {
- this counts 1
- first() equals ExtraModifiers.KotlinOnlyModifiers.Inner
- }
- }
- }
- }
- }
-
- @Test
- fun companionObjectExtension() {
- inlineModelTest(
- """
- |class Klass {
- | companion object Default {}
- |}
- |
- |/**
- | * The def
- | */
- |val Klass.Default.x: Int get() = 1
- """
- ) {
- with((this / "classes").cast<DPackage>()) {
- properties.single().name equals "x"
- (properties.single().receiver?.dri?.callable?.receiver as? TypeConstructor)?.fullyQualifiedName equals "classes.Klass.Default"
- }
- }
- }
-
- @Test
- fun secondaryConstructor() {
- inlineModelTest(
- """
- |class C() {
- | /** This is a secondary constructor. */
- | constructor(s: String): this() {}
- |}
- """
- ) {
- with((this / "classes" / "C").cast<DClass>()) {
- name equals "C"
- constructors counts 2
-
- constructors.map { it.name } allEquals "C"
-
- with(constructors.find { it.parameters.isEmpty() } notNull "C()") {
- parameters counts 0
- }
-
- with(constructors.find { it.parameters.isNotEmpty() } notNull "C(String)") {
- parameters counts 1
- with(parameters.firstOrNull() notNull "Constructor parameter") {
- name equals "s"
- type.name equals "String"
- }
- }
- }
- }
- }
-
- @Test
- fun sinceKotlin() {
- inlineModelTest(
- """
- |/**
- | * Useful
- | */
- |@SinceKotlin("1.1")
- |class C
- """
- ) {
- with((this / "classes" / "C").cast<DClass>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "SinceKotlin"
- params.entries counts 1
- (params["version"].assertNotNull("version") as StringValue).value equals "1.1"
- }
- }
- }
- }
- }
-
- @Test
- fun privateCompanionObject() {
- inlineModelTest(
- """
- |class Klass {
- | private companion object {
- | fun fn() {}
- | val a = 0
- | }
- |}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- assertNull(companion, "Companion should not be visible by default")
- }
- }
- }
-
- @Test
- fun companionObject() {
- inlineModelTest(
- """
- |class Klass {
- | companion object {
- | fun fn() {}
- | val a = 0
- | }
- |}
- """
- ) {
- with((this / "classes" / "Klass").cast<DClass>()) {
- name equals "Klass"
- with((this / "Companion").cast<DObject>()) {
- name equals "Companion"
- visibility.values allEquals KotlinVisibility.Public
-
- with((this / "fn").cast<DFunction>()) {
- name equals "fn"
- parameters counts 0
- receiver equals null
- }
- }
- }
- }
- }
-
- @Test
- fun annotatedClass() {
- inlineModelTest(
- """@Suppress("abc") class Foo() {}"""
- ) {
- with((this / "classes" / "Foo").cast<DClass>()) {
- with(
- extra[Annotations]?.directAnnotations?.values?.firstOrNull()?.firstOrNull()
- .assertNotNull("annotations")
- ) {
- dri.toString() equals "kotlin/Suppress///PointingToDeclaration/"
- (params["names"].assertNotNull("param") as ArrayValue).value equals listOf(StringValue("abc"))
- }
- }
- }
- }
-
- @OnlyDescriptors("Bug in descriptors, DRI of entry should have [EnumEntryDRIExtra]")
- @Test
- fun javaAnnotationClass() {
- inlineModelTest(
- """
- |import java.lang.annotation.Retention
- |import java.lang.annotation.RetentionPolicy
- |
- |@Retention(RetentionPolicy.SOURCE)
- |public annotation class throws()
- """
- ) {
- with((this / "classes" / "throws").cast<DAnnotation>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "Retention"
- params["value"].assertNotNull("value") equals EnumValue(
- "RetentionPolicy.SOURCE",
- DRI("java.lang.annotation", "RetentionPolicy.SOURCE")
- )
- }
- }
- }
- }
- }
-
- @Test
- fun genericAnnotationClass() {
- inlineModelTest(
- """annotation class Foo<A,B,C,D:Number>() {}"""
- ) {
- with((this / "classes" / "Foo").cast<DAnnotation>()) {
- generics.map { it.name to it.bounds.first().name } equals listOf(
- "A" to "Any",
- "B" to "Any",
- "C" to "Any",
- "D" to "Number"
- )
- }
- }
- }
-
- @Test
- fun nestedGenericClasses() {
- inlineModelTest(
- """
- |class Outer<OUTER> {
- | inner class Inner<INNER, T : OUTER> { }
- |}
- """.trimMargin()
- ) {
- with((this / "classes" / "Outer").cast<DClass>()) {
- val inner = classlikes.single().cast<DClass>()
- inner.generics.map { it.name to it.bounds.first().name } equals listOf("INNER" to "Any", "T" to "OUTER")
- }
- }
- }
-
- @Test
- fun allImplementedInterfaces() {
- inlineModelTest(
- """
- | interface Highest { }
- | open class HighestImpl: Highest { }
- | interface Lower { }
- | interface LowerImplInterface: Lower { }
- | class Tested : HighestImpl(), LowerImplInterface { }
- """.trimIndent()
- ) {
- with((this / "classes" / "Tested").cast<DClass>()) {
- extra[ImplementedInterfaces]?.interfaces?.entries?.single()?.value?.map { it.dri.sureClassNames }
- ?.sorted() equals listOf("Highest", "Lower", "LowerImplInterface").sorted()
- }
- }
- }
-
- @Test
- fun multipleClassInheritance() {
- inlineModelTest(
- """
- | open class A { }
- | open class B: A() { }
- | class Tested : B() { }
- """.trimIndent()
- ) {
- with((this / "classes" / "Tested").cast<DClass>()) {
- supertypes.entries.single().value.map { it.typeConstructor.dri.sureClassNames }.single() equals "B"
- }
- }
- }
-
- @Test
- fun multipleClassInheritanceWithInterface() {
- inlineModelTest(
- """
- | open class A { }
- | open class B: A() { }
- | interface X { }
- | interface Y : X { }
- | class Tested : B(), Y { }
- """.trimIndent()
- ) {
- with((this / "classes" / "Tested").cast<DClass>()) {
- supertypes.entries.single().value.map { it.typeConstructor.dri.sureClassNames to it.kind }
- .sortedBy { it.first } equals listOf(
- "B" to KotlinClassKindTypes.CLASS,
- "Y" to KotlinClassKindTypes.INTERFACE
- )
- }
- }
- }
-
- @Test
- fun doublyTypealiasedException() {
- inlineModelTest(
- """
- | typealias B = RuntimeException
- | typealias A = B
- """.trimMargin()
- ) {
- with((this / "classes" / "A").cast<DTypeAlias>()) {
- extra[ExceptionInSupertypes].assertNotNull("Typealias A should have ExceptionInSupertypes in its extra field")
- }
- with((this / "classes" / "B").cast<DTypeAlias>()) {
- extra[ExceptionInSupertypes].assertNotNull("Typealias B should have ExceptionInSupertypes in its extra field")
- }
- }
- }
-
- @Test
- fun `inline classes`() {
- inlineModelTest(
- """
- | inline class X(val example: String)
- |
- | @JvmInline
- | value class InlineTest(val x: String)
- """.trimMargin()
- ) {
- with((this / "classes" / "X").cast<DClass>()) {
- name equals "X"
- properties.first().name equals "example"
- extra[AdditionalModifiers]?.content?.values?.firstOrNull()
- ?.firstOrNull() equals ExtraModifiers.KotlinOnlyModifiers.Inline
- }
- }
- }
-
- @Test
- fun `value classes`() {
- inlineModelTest(
- """
- | @JvmInline
- | value class InlineTest(val example: String)
- """.trimMargin()
- ) {
- val classlike = packages.flatMap { it.classlikes }.first() as DClass
- classlike.name equals "InlineTest"
- classlike.properties.first().name equals "example"
- classlike.extra[AdditionalModifiers]?.content?.values?.firstOrNull()
- ?.firstOrNull() equals ExtraModifiers.KotlinOnlyModifiers.Value
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/CommentTest.kt b/plugins/base/src/test/kotlin/model/CommentTest.kt
deleted file mode 100644
index 6b00f2f0..00000000
--- a/plugins/base/src/test/kotlin/model/CommentTest.kt
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DProperty
-import org.jetbrains.dokka.model.doc.*
-import utils.AbstractModelTest
-import utils.assertNotNull
-import utils.comments
-import utils.docs
-import kotlin.test.Test
-
-class CommentTest : AbstractModelTest("/src/main/kotlin/comment/Test.kt", "comment") {
-
- @Test
- fun codeBlockComment() {
- inlineModelTest(
- """
- |/**
- | * ```brainfuck
- | * ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
- | * ```
- | */
- |val prop1 = ""
- |
- |
- |/**
- | * ```
- | * a + b - c
- | * ```
- | */
- |val prop2 = ""
- """
- ) {
- with((this / "comment" / "prop1").cast<DProperty>()) {
- name equals "prop1"
- with(this.docs().firstOrNull()?.children?.firstOrNull()?.assertNotNull("Code")) {
- (this?.children?.firstOrNull() as? Text)
- ?.body equals "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."
-
- this?.params?.get("lang") equals "brainfuck"
- }
- }
- with((this / "comment" / "prop2").cast<DProperty>()) {
- name equals "prop2"
- with(this.docs().firstOrNull()?.children?.firstOrNull()?.assertNotNull("Code")) {
- (this?.children?.firstOrNull() as? Text)
- ?.body equals "a + b - c"
-
- this?.params?.get("lang") equals null
- }
- }
- }
- }
-
- @Test
- fun codeBlockWithIndentationComment() {
- inlineModelTest(
- """
- |/**
- | * 1.
- | * ```
- | * line 1
- | * line 2
- | * ```
- | */
- |val prop1 = ""
- """
- ) {
- with((this / "comment" / "prop1").cast<DProperty>()) {
- name equals "prop1"
- with(this.docs().firstOrNull()?.children?.firstOrNull()?.assertNotNull("Code")) {
- val codeBlockChildren = ((this?.children?.firstOrNull() as? Li)?.children?.firstOrNull() as? CodeBlock)?.children
- (codeBlockChildren?.get(0) as? Text)?.body equals " line 1"
- (codeBlockChildren?.get(1) as? Br) notNull "Br"
- (codeBlockChildren?.get(2) as? Text)?.body equals " line 2"
- }
- }
- }
- }
-
- @Test
- fun emptyDoc() {
- inlineModelTest(
- """
- val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- name equals "property"
- comments() equals ""
- }
- }
- }
-
- @Test
- fun emptyDocButComment() {
- inlineModelTest(
- """
- |/* comment */
- |val property = "test"
- |fun tst() = property
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals ""
- }
- }
- }
-
- @Test
- fun multilineDoc() {
- inlineModelTest(
- """
- |/**
- | * doc1
- | *
- | * doc2
- | * doc3
- | */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "doc1\ndoc2 doc3\n"
- }
- }
- }
-
- @Test
- fun multilineDocWithComment() {
- inlineModelTest(
- """
- |/**
- | * doc1
- | *
- | * doc2
- | * doc3
- | */
- |// comment
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "doc1\ndoc2 doc3\n"
- }
- }
- }
-
- @Test
- fun oneLineDoc() {
- inlineModelTest(
- """
- |/** doc */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "doc\n"
- }
- }
- }
-
- @Test
- fun oneLineDocWithComment() {
- inlineModelTest(
- """
- |/** doc */
- |// comment
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "doc\n"
- }
- }
- }
-
- @Test
- fun oneLineDocWithEmptyLine() {
- inlineModelTest(
- """
- |/** doc */
- |
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "doc\n"
- }
- }
- }
-
- @Test
- fun emptySection() {
- inlineModelTest(
- """
- |/**
- | * Summary
- | * @one
- | */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "Summary\n\none: []"
- with(docs().find { it is CustomTagWrapper && it.name == "one" }.assertNotNull("'one' entry")) {
- root.children counts 0
- root.params.keys counts 0
- }
- }
- }
- }
-
- @Test
- fun quotes() {
- inlineModelTest(
- """
- |/** it's "useful" */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals """it's "useful"
-"""
- }
- }
- }
-
- @Test
- fun section1() {
- inlineModelTest(
- """
- |/**
- | * Summary
- | * @one section one
- | */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "Summary\n\none: [section one\n]"
- }
- }
- }
-
-
- @Test
- fun section2() {
- inlineModelTest(
- """
- |/**
- | * Summary
- | * @one section one
- | * @two section two
- | */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "Summary\n\none: [section one\n]\ntwo: [section two\n]"
- }
- }
- }
-
- @Test
- fun multilineSection() {
- inlineModelTest(
- """
- |/**
- | * Summary
- | * @one
- | * line one
- | * line two
- | */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "Summary\n\none: [line one line two\n]"
- }
- }
- }
-
- @Test
- fun `should be space between Markdown nodes`() {
- inlineModelTest(
- """
- |/**
- | * Rotates paths by `amount` **radians** around (`x`, `y`).
- | */
- |val property = "test"
- """
- ) {
- with((this / "comment" / "property").cast<DProperty>()) {
- comments() equals "Rotates paths by amount radians around (x, y).\n"
- }
- }
- }
-
- @Test
- fun `should remove spaces inside indented code block`() {
- inlineModelTest(
- """
- |/**
- | * Welcome:
- | *
- | * ```kotlin
- | * fun main() {
- | * println("Hello World!")
- | * }
- | * ```
- | *
- | * fun thisIsACodeBlock() {
- | * val butWhy = "per markdown spec, because four-spaces prefix"
- | * }
- | */
- |class Foo
- """
- ) {
- with((this / "comment" / "Foo").cast<DClass>()) {
- docs()[0].children[2] equals CodeBlock(
- listOf(
- Text(
- "fun thisIsACodeBlock() {\n" +
- " val butWhy = \"per markdown spec, because four-spaces prefix\"\n" +
- "}"
- )
- )
- )
- }
- }
- }
-
-}
diff --git a/plugins/base/src/test/kotlin/model/ExtensionsTest.kt b/plugins/base/src/test/kotlin/model/ExtensionsTest.kt
deleted file mode 100644
index a428dd1d..00000000
--- a/plugins/base/src/test/kotlin/model/ExtensionsTest.kt
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.base.transformers.documentables.CallableExtensions
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.DInterface
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import utils.AbstractModelTest
-import kotlin.test.Test
-
-class ExtensionsTest : AbstractModelTest("/src/main/kotlin/classes/Test.kt", "classes") {
- private fun <T : WithExtraProperties<R>, R : Documentable> T.checkExtension(name: String = "extension") =
- with(extra[CallableExtensions]?.extensions) {
- this notNull "extensions"
- this counts 1
- (this?.single() as? DFunction)?.name equals name
- }
-
- @Test
- fun `should be extension for subclasses`() {
- inlineModelTest(
- """
- |open class A
- |open class B: A()
- |open class C: B()
- |open class D: C()
- |fun B.extension() = ""
- """
- ) {
- with((this / "classes" / "B").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "C").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "D").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "A").cast<DClass>()) {
- extra[CallableExtensions] equals null
- }
- }
- }
-
- @Test
- fun `should be extension for interfaces`() {
- inlineModelTest(
- """
- |interface I
- |interface I2 : I
- |open class A: I2
- |fun I.extension() = ""
- """
- ) {
-
- with((this / "classes" / "A").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "I2").cast<DInterface>()) {
- checkExtension()
- }
- with((this / "classes" / "I").cast<DInterface>()) {
- checkExtension()
- }
- }
- }
-
- @Test
- fun `should be extension for external classes`() {
- inlineModelTest(
- """
- |abstract class A<T>: AbstractList<T>()
- |fun<T> AbstractCollection<T>.extension() {}
- |
- |class B:Exception()
- |fun Throwable.extension() = ""
- """
- ) {
- with((this / "classes" / "A").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "B").cast<DClass>()) {
- checkExtension()
- }
- }
- }
-
- @Test
- fun `should be extension for typealias`() {
- inlineModelTest(
- """
- |open class A
- |open class B: A()
- |open class C: B()
- |open class D: C()
- |typealias B2 = B
- |fun B2.extension() = ""
- """
- ) {
- with((this / "classes" / "B").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "C").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "D").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "A").cast<DClass>()) {
- extra[CallableExtensions] equals null
- }
- }
- }
-
- @Test
- fun `should be extension for java classes`() {
- val testConfiguration = dokkaConfiguration {
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/")
- classpath += jvmStdlibPath!!
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/classes/Test.kt
- | package classes
- | fun A.extension() = ""
- |
- |/src/main/kotlin/classes/A.java
- | package classes;
- | public class A {}
- |
- | /src/main/kotlin/classes/B.java
- | package classes;
- | public class B extends A {}
- """,
- configuration = testConfiguration
- ) {
- documentablesTransformationStage = {
- it.run {
- with((this / "classes" / "B").cast<DClass>()) {
- checkExtension()
- }
- with((this / "classes" / "A").cast<DClass>()) {
- checkExtension()
- }
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/FunctionsTest.kt b/plugins/base/src/test/kotlin/model/FunctionsTest.kt
deleted file mode 100644
index a6291bb1..00000000
--- a/plugins/base/src/test/kotlin/model/FunctionsTest.kt
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import utils.AbstractModelTest
-import utils.assertNotNull
-import utils.comments
-import utils.OnlyDescriptors
-import utils.name
-import kotlin.test.Test
-
-class FunctionTest : AbstractModelTest("/src/main/kotlin/function/Test.kt", "function") {
-
- @Test
- fun function() {
- inlineModelTest(
- """
- |/**
- | * Function fn
- | */
- |fun fn() {}
- """
- ) {
- with((this / "function" / "fn").cast<DFunction>()) {
- name equals "fn"
- type.name equals "Unit"
- this.children.assertCount(0, "Function children: ")
- }
- }
- }
-
- @Test
- fun overloads() {
- inlineModelTest(
- """
- |/**
- | * Function fn
- | */
- |fun fn() {}
- | /**
- | * Function fn(Int)
- | */
- |fun fn(i: Int) {}
- """
- ) {
- with((this / "function").cast<DPackage>()) {
- val fn1 = functions.find {
- it.name == "fn" && it.parameters.isEmpty()
- }.assertNotNull("fn()")
- val fn2 = functions.find {
- it.name == "fn" && it.parameters.isNotEmpty()
- }.assertNotNull("fn(Int)")
-
- with(fn1) {
- name equals "fn"
- parameters.assertCount(0)
- }
-
- with(fn2) {
- name equals "fn"
- parameters.assertCount(1)
- parameters.first().type.name equals "Int"
- }
- }
- }
- }
-
- @Test
- fun functionWithReceiver() {
- inlineModelTest(
- """
- |/**
- | * Function with receiver
- | */
- |fun String.fn() {}
- |
- |/**
- | * Function with receiver
- | */
- |fun String.fn(x: Int) {}
- """
- ) {
- with((this / "function").cast<DPackage>()) {
- val fn1 = functions.find {
- it.name == "fn" && it.parameters.isEmpty()
- }.assertNotNull("fn()")
- val fn2 = functions.find {
- it.name == "fn" && it.parameters.count() == 1
- }.assertNotNull("fn(Int)")
-
- with(fn1) {
- name equals "fn"
- parameters counts 0
- receiver.assertNotNull("fn() receiver")
- }
-
- with(fn2) {
- name equals "fn"
- parameters counts 1
- receiver.assertNotNull("fn(Int) receiver")
- parameters.first().type.name equals "Int"
- }
- }
- }
- }
-
- @Test
- fun functionWithParams() {
- inlineModelTest(
- """
- |/**
- | * Multiline
- | *
- | * Function
- | * Documentation
- | */
- |fun function(/** parameter */ x: Int) {
- |}
- """
- ) {
- with((this / "function" / "function").cast<DFunction>()) {
- comments() equals "Multiline\nFunction Documentation\n"
-
- name equals "function"
- parameters counts 1
- parameters.firstOrNull().assertNotNull("Parameter: ").also {
- it.name equals "x"
- it.type.name equals "Int"
- it.comments() equals "parameter\n"
- }
-
- type.assertNotNull("Return type: ").name equals "Unit"
- }
- }
- }
-
- @Test
- fun functionWithNotDocumentedAnnotation() {
- inlineModelTest(
- """
- |@Suppress("FOO") fun f() {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "Suppress"
- params.entries counts 1
- (params["names"].assertNotNull("param") as ArrayValue).value equals listOf(StringValue("FOO"))
- }
- }
- }
- }
- }
-
- @Test
- fun inlineFunction() {
- inlineModelTest(
- """
- |inline fun f(a: () -> String) {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- extra[AdditionalModifiers]!!.content.entries.single().value counts 1
- extra[AdditionalModifiers]!!.content.entries.single().value exists ExtraModifiers.KotlinOnlyModifiers.Inline
- }
- }
- }
-
- @Test
- fun suspendFunction() {
- inlineModelTest(
- """
- |suspend fun f() {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- extra[AdditionalModifiers]!!.content.entries.single().value counts 1
- extra[AdditionalModifiers]!!.content.entries.single().value exists ExtraModifiers.KotlinOnlyModifiers.Suspend
- }
- }
- }
-
- @Test
- fun suspendInlineFunctionOrder() {
- inlineModelTest(
- """
- |suspend inline fun f(a: () -> String) {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- extra[AdditionalModifiers]!!.content.entries.single().value counts 2
- extra[AdditionalModifiers]!!.content.entries.single().value exists ExtraModifiers.KotlinOnlyModifiers.Suspend
- extra[AdditionalModifiers]!!.content.entries.single().value exists ExtraModifiers.KotlinOnlyModifiers.Inline
- }
- }
- }
-
- @Test
- fun inlineSuspendFunctionOrderChanged() {
- inlineModelTest(
- """
- |inline suspend fun f(a: () -> String) {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- with(extra[AdditionalModifiers]!!.content.entries.single().value.assertNotNull("AdditionalModifiers")) {
- this counts 2
- this exists ExtraModifiers.KotlinOnlyModifiers.Suspend
- this exists ExtraModifiers.KotlinOnlyModifiers.Inline
- }
- }
- }
- }
-
- @OnlyDescriptors("Bug in descriptors, DRI of entry should have [EnumEntryDRIExtra]")
- @Test
- fun functionWithAnnotatedParam() {
- inlineModelTest(
- """
- |@Target(AnnotationTarget.VALUE_PARAMETER)
- |@Retention(AnnotationRetention.SOURCE)
- |@MustBeDocumented
- |public annotation class Fancy
- |
- |fun function(@Fancy notInlined: () -> Unit) {}
- """
- ) {
- with((this / "function" / "Fancy").cast<DAnnotation>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 3
- with(associate { it.dri.classNames to it }) {
- with(this["Target"].assertNotNull("Target")) {
- (params["allowedTargets"].assertNotNull("allowedTargets") as ArrayValue).value equals listOf(
- EnumValue(
- "AnnotationTarget.VALUE_PARAMETER",
- DRI("kotlin.annotation", "AnnotationTarget.VALUE_PARAMETER")
- )
- )
- }
- with(this["Retention"].assertNotNull("Retention")) {
- (params["value"].assertNotNull("value") as EnumValue) equals EnumValue(
- "AnnotationRetention.SOURCE",
- DRI("kotlin.annotation", "AnnotationRetention.SOURCE")
- )
- }
- this["MustBeDocumented"].assertNotNull("MustBeDocumented").params.entries counts 0
- }
- }
-
- }
- with((this / "function" / "function" / "notInlined").cast<DParameter>()) {
- with(this.extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "Fancy"
- params.entries counts 0
- }
- }
- }
- }
- }
-
- @Test
- fun functionWithNoinlineParam() {
- inlineModelTest(
- """
- |fun f(noinline notInlined: () -> Unit) {}
- """
- ) {
- with((this / "function" / "f" / "notInlined").cast<DParameter>()) {
- extra[AdditionalModifiers]!!.content.entries.single().value counts 1
- extra[AdditionalModifiers]!!.content.entries.single().value exists ExtraModifiers.KotlinOnlyModifiers.NoInline
- }
- }
- }
-
- @OnlyDescriptors("Bug in descriptors, DRI of entry should have [EnumEntryDRIExtra]")
- @Test
- fun annotatedFunctionWithAnnotationParameters() {
- inlineModelTest(
- """
- |@Target(AnnotationTarget.VALUE_PARAMETER)
- |@Retention(AnnotationRetention.SOURCE)
- |@MustBeDocumented
- |public annotation class Fancy(val size: Int)
- |
- |@Fancy(1) fun f() {}
- """
- ) {
- with((this / "function" / "Fancy").cast<DAnnotation>()) {
- constructors counts 1
- with(constructors.first()) {
- parameters counts 1
- with(parameters.first()) {
- type.name equals "Int"
- name equals "size"
- }
- }
-
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 3
- with(associate { it.dri.classNames to it }) {
- with(this["Target"].assertNotNull("Target")) {
- (params["allowedTargets"].assertNotNull("allowedTargets") as ArrayValue).value equals listOf(
- EnumValue(
- "AnnotationTarget.VALUE_PARAMETER",
- DRI("kotlin.annotation", "AnnotationTarget.VALUE_PARAMETER")
- )
- )
- }
- with(this["Retention"].assertNotNull("Retention")) {
- (params["value"].assertNotNull("value") as EnumValue) equals EnumValue(
- "AnnotationRetention.SOURCE",
- DRI("kotlin.annotation", "AnnotationRetention.SOURCE")
- )
- }
- this["MustBeDocumented"].assertNotNull("MustBeDocumented").params.entries counts 0
- }
- }
-
- }
- with((this / "function" / "f").cast<DFunction>()) {
- with(this.extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(this.first()) {
- dri.classNames equals "Fancy"
- params.entries counts 1
- (params["size"] as IntValue).value equals 1
- }
- }
- }
- }
- }
-
- @Test
- fun functionWithDefaultStringParameter() {
- inlineModelTest(
- """
- |/src/main/kotlin/function/Test.kt
- |package function
- |fun f(x: String = "") {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- parameters.forEach { p ->
- p.name equals "x"
- p.type.name.assertNotNull("Parameter type: ") equals "String"
- p.extra[DefaultValue]?.expression?.get(sourceSets.single()) equals StringConstant("")
- }
- }
- }
- }
-
- @Test
- fun functionWithDefaultFloatParameter() {
- inlineModelTest(
- """
- |/src/main/kotlin/function/Test.kt
- |package function
- |fun f(x: Float = 3.14f) {}
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- parameters.forEach { p ->
- p.name equals "x"
- p.type.name.assertNotNull("Parameter type: ") equals "Float"
- p.extra[DefaultValue]?.expression?.get(sourceSets.single()) equals FloatConstant(3.14f)
- }
- }
- }
- }
-
- @Test
- fun sinceKotlin() {
- inlineModelTest(
- """
- |/**
- | * Quite useful [String]
- | */
- |@SinceKotlin("1.1")
- |fun f(): String = "1.1 rulezz"
- """
- ) {
- with((this / "function" / "f").cast<DFunction>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "SinceKotlin"
- params.entries counts 1
- (params["version"].assertNotNull("version") as StringValue).value equals "1.1"
- }
- }
- }
- }
- }
-
-}
diff --git a/plugins/base/src/test/kotlin/model/InheritorsTest.kt b/plugins/base/src/test/kotlin/model/InheritorsTest.kt
deleted file mode 100644
index 459dd9ac..00000000
--- a/plugins/base/src/test/kotlin/model/InheritorsTest.kt
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.transformers.documentables.InheritorsInfo
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.DInterface
-import org.jetbrains.dokka.model.doc.P
-import org.jetbrains.dokka.model.doc.Text
-import utils.AbstractModelTest
-import utils.assertNotNull
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class InheritorsTest : AbstractModelTest("/src/main/kotlin/inheritors/Test.kt", "inheritors") {
-
- @Test
- fun simple() {
- inlineModelTest(
- """|interface A{}
- |class B() : A {}
- """.trimMargin(),
- ) {
- with((this / "inheritors" / "A").cast<DInterface>()) {
- val map = extra[InheritorsInfo].assertNotNull("InheritorsInfo").value
- with(map.keys.also { it counts 1 }.find { it.analysisPlatform == Platform.jvm }.assertNotNull("jvm key").let { map[it]!! }
- ) {
- this counts 1
- first().classNames equals "B"
- }
- }
- }
- }
-
- @Test
- fun sealed() {
- inlineModelTest(
- """|sealed class A {}
- |class B() : A() {}
- |class C() : A() {}
- |class D()
- """.trimMargin(),
- ) {
- with((this / "inheritors" / "A").cast<DClass>()) {
- val map = extra[InheritorsInfo].assertNotNull("InheritorsInfo").value
- with(map.keys.also { it counts 1 }.find { it.analysisPlatform == Platform.jvm }.assertNotNull("jvm key").let { map[it]!! }
- ) {
- this counts 2
- mapNotNull { it.classNames }.sorted() equals listOf("B", "C")
- }
- }
- }
- }
-
- @Test
- fun multiplatform() {
- val configuration = dokkaConfiguration {
- sourceSets {
- val commonSourceSet = sourceSet {
- name = "common"
- sourceRoots = listOf("common/src/")
- analysisPlatform = "common"
- }
- sourceSet {
- name = "jvm"
- sourceRoots = listOf("jvm/src/")
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(commonSourceSet.value.sourceSetID)
- }
- sourceSet {
- name = "js"
- sourceRoots = listOf("js/src/")
- analysisPlatform = "js"
- dependentSourceSets = setOf(commonSourceSet.value.sourceSetID)
- }
- }
- }
-
- testInline(
- """
- |/common/src/main/kotlin/inheritors/Test.kt
- |package inheritors
- |interface A{}
- |/jvm/src/main/kotlin/inheritors/Test.kt
- |package inheritors
- |class B() : A {}
- |/js/src/main/kotlin/inheritors/Test.kt
- |package inheritors
- |class B() : A {}
- |class C() : A {}
- """.trimMargin(),
- configuration,
- cleanupOutput = false,
- ) {
- documentablesTransformationStage = { m ->
- with((m / "inheritors" / "A").cast<DInterface>()) {
- val map = extra[InheritorsInfo].assertNotNull("InheritorsInfo").value
- with(map.keys.also { it counts 2 }) {
- with(find { it.analysisPlatform == Platform.jvm }.assertNotNull("jvm key").let { map[it]!! }) {
- this counts 1
- first().classNames equals "B"
- }
- with(find { it.analysisPlatform == Platform.js }.assertNotNull("js key").let { map[it]!! }) {
- this counts 2
- val classes = listOf("B", "C")
- assertTrue(all { classes.contains(it.classNames) }, "One of subclasses missing in js" )
- }
- }
-
- }
- }
- }
- }
-
- @Test
- fun `should inherit docs`() {
- val expectedDoc = listOf(P(listOf(Text("some text"))))
- inlineModelTest(
- """|interface A<out E> {
- | /**
- | * some text
- | */
- | val a: Int
- |
- | /**
- | * some text
- | */
- | fun b(): E
- |}
- |open class C
- |class B<out E>() : C(), A<out E> {
- | val a = 0
- | override fun b(): E {}
- |}
- """.trimMargin(),
- platform = Platform.common.toString()
- ) {
- with((this / "inheritors" / "A").cast<DInterface>()) {
- with(this / "a") {
- val propDoc = this?.documentation?.values?.single()?.children?.first()?.children
- propDoc equals expectedDoc
- }
- with(this / "b") {
- val funDoc = this?.documentation?.values?.single()?.children?.first()?.children
- funDoc equals expectedDoc
- }
-
- }
-
- with((this / "inheritors" / "B").cast<DClass>()) {
- with(this / "a") {
- val propDoc = this?.documentation?.values?.single()?.children?.first()?.children
- propDoc equals expectedDoc
- }
- }
- }
- }
-
-// TODO [beresnev] fix, needs access to analysis
-// class IgnoreCommonBuiltInsPlugin : DokkaPlugin() {
-// private val kotlinAnalysisPlugin by lazy { plugin<DescriptorKotlinAnalysisPlugin>() }
-// @Suppress("unused")
-// val stdLibKotlinAnalysis by extending {
-// kotlinAnalysisPlugin.kotlinAnalysis providing { ctx ->
-// ProjectKotlinAnalysis(
-// sourceSets = ctx.configuration.sourceSets,
-// logger = ctx.logger,
-// analysisConfiguration = DokkaAnalysisConfiguration(ignoreCommonBuiltIns = true)
-// )
-// } override kotlinAnalysisPlugin.defaultKotlinAnalysis
-// }
-//
-// @OptIn(DokkaPluginApiPreview::class)
-// override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
-// PluginApiPreviewAcknowledgement
-// }
-// @Test
-// fun `should inherit docs for stdLib #2638`() {
-// val testConfiguration = dokkaConfiguration {
-// suppressObviousFunctions = false
-// sourceSets {
-// sourceSet {
-// sourceRoots = listOf("src/")
-// analysisPlatform = "common"
-// languageVersion = "1.4"
-// }
-// }
-// }
-//
-// inlineModelTest(
-// """
-// package kotlin.collections
-//
-// import kotlin.internal.PlatformDependent
-//
-// /**
-// * Classes that inherit from this interface can be represented as a sequence of elements that can
-// * be iterated over.
-// * @param T the type of element being iterated over. The iterator is covariant in its element type.
-// */
-// public interface Iterable<out T> {
-// /**
-// * Returns an iterator over the elements of this object.
-// */
-// public operator fun iterator(): Iterator<T>
-// }
-//
-// /**
-// * Classes that inherit from this interface can be represented as a sequence of elements that can
-// * be iterated over and that supports removing elements during iteration.
-// * @param T the type of element being iterated over. The mutable iterator is invariant in its element type.
-// */
-// public interface MutableIterable<out T> : Iterable<T> {
-// /**
-// * Returns an iterator over the elements of this sequence that supports removing elements during iteration.
-// */
-// override fun iterator(): MutableIterator<T>
-// }
-//
-// /**
-// * A generic collection of elements. Methods in this interface support only read-only access to the collection;
-// * read/write access is supported through the [MutableCollection] interface.
-// * @param E the type of elements contained in the collection. The collection is covariant in its element type.
-// */
-// public interface Collection<out E> : Iterable<E> {
-// // Query Operations
-// /**
-// * Returns the size of the collection.
-// */
-// public val size: Int
-//
-// /**
-// * Returns `true` if the collection is empty (contains no elements), `false` otherwise.
-// */
-// public fun isEmpty(): Boolean
-//
-// /**
-// * Checks if the specified element is contained in this collection.
-// */
-// public operator fun contains(element: @UnsafeVariance E): Boolean
-//
-// override fun iterator(): Iterator<E>
-//
-// // Bulk Operations
-// /**
-// * Checks if all elements in the specified collection are contained in this collection.
-// */
-// public fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean
-// }
-//
-// /**
-// * A generic collection of elements that supports adding and removing elements.
-// *
-// * @param E the type of elements contained in the collection. The mutable collection is invariant in its element type.
-// */
-// public interface MutableCollection<E> : Collection<E>, MutableIterable<E> {
-// // Query Operations
-// override fun iterator(): MutableIterator<E>
-//
-// // Modification Operations
-// /**
-// * Adds the specified element to the collection.
-// *
-// * @return `true` if the element has been added, `false` if the collection does not support duplicates
-// * and the element is already contained in the collection.
-// */
-// public fun add(element: E): Boolean
-//
-// /**
-// * Removes a single instance of the specified element from this
-// * collection, if it is present.
-// *
-// * @return `true` if the element has been successfully removed; `false` if it was not present in the collection.
-// */
-// public fun remove(element: E): Boolean
-//
-// // Bulk Modification Operations
-// /**
-// * Adds all of the elements of the specified collection to this collection.
-// *
-// * @return `true` if any of the specified elements was added to the collection, `false` if the collection was not modified.
-// */
-// public fun addAll(elements: Collection<E>): Boolean
-//
-// /**
-// * Removes all of this collection's elements that are also contained in the specified collection.
-// *
-// * @return `true` if any of the specified elements was removed from the collection, `false` if the collection was not modified.
-// */
-// public fun removeAll(elements: Collection<E>): Boolean
-//
-// /**
-// * Retains only the elements in this collection that are contained in the specified collection.
-// *
-// * @return `true` if any element was removed from the collection, `false` if the collection was not modified.
-// */
-// public fun retainAll(elements: Collection<E>): Boolean
-//
-// /**
-// * Removes all elements from this collection.
-// */
-// public fun clear(): Unit
-// }
-//
-// /**
-// * A generic ordered collection of elements. Methods in this interface support only read-only access to the list;
-// * read/write access is supported through the [MutableList] interface.
-// * @param E the type of elements contained in the list. The list is covariant in its element type.
-// */
-// public interface List<out E> : Collection<E> {
-// // Query Operations
-//
-// override val size: Int
-// override fun isEmpty(): Boolean
-// override fun contains(element: @UnsafeVariance E): Boolean
-// override fun iterator(): Iterator<E>
-//
-// // Bulk Operations
-// override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean
-//
-// // Positional Access Operations
-// /**
-// * Returns the element at the specified index in the list.
-// */
-// public operator fun get(index: Int): E
-//
-// // Search Operations
-// /**
-// * Returns the index of the first occurrence of the specified element in the list, or -1 if the specified
-// * element is not contained in the list.
-// */
-// public fun indexOf(element: @UnsafeVariance E): Int
-//
-// /**
-// * Returns the index of the last occurrence of the specified element in the list, or -1 if the specified
-// * element is not contained in the list.
-// */
-// public fun lastIndexOf(element: @UnsafeVariance E): Int
-//
-// // List Iterators
-// /**
-// * Returns a list iterator over the elements in this list (in proper sequence).
-// */
-// public fun listIterator(): ListIterator<E>
-//
-// /**
-// * Returns a list iterator over the elements in this list (in proper sequence), starting at the specified [index].
-// */
-// public fun listIterator(index: Int): ListIterator<E>
-//
-// // View
-// /**
-// * Returns a view of the portion of this list between the specified [fromIndex] (inclusive) and [toIndex] (exclusive).
-// * The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa.
-// *
-// * Structural changes in the base list make the behavior of the view undefined.
-// */
-// public fun subList(fromIndex: Int, toIndex: Int): List<E>
-// }
-//
-// // etc
-// """.trimMargin(),
-// platform = Platform.common.toString(),
-// configuration = testConfiguration,
-// prependPackage = false,
-// pluginsOverrides = listOf(IgnoreCommonBuiltInsPlugin())
-// ) {
-// with((this / "kotlin.collections" / "List" / "contains").cast<DFunction>()) {
-// documentation.size equals 1
-//
-// }
-// }
-// }
-
- @Test
- fun `should inherit docs in case of diamond inheritance`() {
- inlineModelTest(
- """
- public interface Collection2<out E> {
- /**
- * Returns `true` if the collection is empty (contains no elements), `false` otherwise.
- */
- public fun isEmpty(): Boolean
-
- /**
- * Checks if the specified element is contained in this collection.
- */
- public operator fun contains(element: @UnsafeVariance E): Boolean
- }
-
- public interface MutableCollection2<E> : Collection2<E>, MutableIterable2<E>
-
-
- public interface List2<out E> : Collection2<E> {
- override fun isEmpty(): Boolean
- override fun contains(element: @UnsafeVariance E): Boolean
- }
-
- public interface MutableList2<E> : List2<E>, MutableCollection2<E>
-
- public class AbstractMutableList2<E> : MutableList2<E> {
- protected constructor()
-
- // From List
-
- override fun isEmpty(): Boolean = size == 0
- public override fun contains(element: E): Boolean = indexOf(element) != -1
- }
- public class ArrayDeque2<E> : AbstractMutableList2<E> {
- override fun isEmpty(): Boolean = size == 0
- public override fun contains(element: E): Boolean = indexOf(element) != -1
-
- }
- """.trimMargin()
- ) {
- with((this / "inheritors" / "ArrayDeque2" / "isEmpty").cast<DFunction>()) {
- documentation.size equals 1
- }
- with((this / "inheritors" / "ArrayDeque2" / "contains").cast<DFunction>()) {
- documentation.size equals 1
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/JavaTest.kt b/plugins/base/src/test/kotlin/model/JavaTest.kt
deleted file mode 100644
index ff706c5e..00000000
--- a/plugins/base/src/test/kotlin/model/JavaTest.kt
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.transformers.documentables.InheritorsInfo
-import org.jetbrains.dokka.links.*
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.Param
-import org.jetbrains.dokka.model.doc.Text
-import utils.AbstractModelTest
-import utils.assertContains
-import utils.assertNotNull
-import utils.name
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = Platform.jvm.toString()
- classpath += jvmStdlibPath!!
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PRIVATE,
- DokkaConfiguration.Visibility.PROTECTED,
- DokkaConfiguration.Visibility.PACKAGE,
- )
- }
- }
- }
-
- @Test
- fun function() {
- inlineModelTest(
- """
- |class Test {
- | /**
- | * Summary for Function
- | * @param name is String parameter
- | * @param value is int parameter
- | */
- | public void fn(String name, int value) {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- name equals "Test"
- children counts 2 // default constructor and function
- with((this / "fn").cast<DFunction>()) {
- name equals "fn"
- val params = parameters.map { it.documentation.values.first().children.first() as Param }
- params.map { it.firstMemberOfType<Text>().body } equals listOf(
- "is String parameter",
- "is int parameter"
- )
- }
- }
- }
- }
-
- @Test fun allImplementedInterfacesInJava() {
- inlineModelTest(
- """
- |interface Highest { }
- |interface Lower extends Highest { }
- |class Extendable { }
- |class Tested extends Extendable implements Lower { }
- """, configuration = configuration){
- with((this / "java" / "Tested").cast<DClass>()){
- extra[ImplementedInterfaces]?.interfaces?.entries?.single()?.value?.map { it.dri.sureClassNames }?.sorted() equals listOf("Highest", "Lower").sorted()
- }
- }
- }
-
- @Test fun multipleClassInheritanceWithInterface() {
- inlineModelTest(
- """
- |interface Highest { }
- |interface Lower extends Highest { }
- |class Extendable { }
- |class Tested extends Extendable implements Lower { }
- """, configuration = configuration){
- with((this / "java" / "Tested").cast<DClass>()) {
- supertypes.entries.single().value.map { it.typeConstructor.dri.sureClassNames to it.kind }.sortedBy { it.first } equals listOf("Extendable" to JavaClassKindTypes.CLASS, "Lower" to JavaClassKindTypes.INTERFACE)
- }
- }
- }
-
- @Test
- fun superClass() {
- inlineModelTest(
- """
- |public class Foo extends Exception implements Cloneable {}
- """, configuration = configuration
- ) {
- with((this / "java" / "Foo").cast<DClass>()) {
- val sups = listOf("Exception", "Cloneable")
- assertTrue(
- sups.all { s -> supertypes.values.flatten().any { it.typeConstructor.dri.classNames == s } })
- "Foo must extend ${sups.joinToString(", ")}"
- }
- }
- }
-
- @Test
- fun arrayType() {
- inlineModelTest(
- """
- |class Test {
- | public String[] arrayToString(int[] data) {
- | return null;
- | }
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- name equals "Test"
- children counts 2 // default constructor and function
-
- with((this / "arrayToString").cast<DFunction>()) {
- name equals "arrayToString"
- type.name equals "Array"
- with(parameters.firstOrNull().assertNotNull("parameters")) {
- name equals "data"
- type.name equals "Array"
- }
- }
- }
- }
- }
-
- @Test
- fun typeParameter() {
- inlineModelTest(
- """
- |class Foo<T extends Comparable<T>> {
- | public <E> E foo();
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Foo").cast<DClass>()) {
- generics counts 1
- generics[0].dri.classNames equals "Foo"
- (functions[0].type as? TypeParameter)?.dri?.run {
- packageName equals "java"
- name equals "Foo"
- callable?.name equals "foo"
- }
- }
- }
- }
-
- @Test
- fun typeParameterIntoDifferentClasses2596() {
- inlineModelTest(
- """
- |class GenericDocument { }
- |public interface DocumentClassFactory<T> {
- | String getSchemaName();
- | GenericDocument toGenericDocument(T document);
- | T fromGenericDocument(GenericDocument genericDoc);
- |}
- |
- |public final class DocumentClassFactoryRegistry {
- | public <T> DocumentClassFactory<T> getOrCreateFactory(T documentClass) {
- | return null;
- | }
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "DocumentClassFactory").cast<DInterface>()) {
- generics counts 1
- generics[0].dri.classNames equals "DocumentClassFactory"
- }
- with((this / "java" / "DocumentClassFactoryRegistry").cast<DClass>()) {
- functions.forEach {
- (it.type as GenericTypeConstructor).dri.classNames equals "DocumentClassFactory"
- ((it.type as GenericTypeConstructor).projections[0] as TypeParameter).dri.classNames equals "DocumentClassFactoryRegistry"
- }
- }
- }
- }
-
- @Test
- fun constructors() {
- inlineModelTest(
- """
- |class Test {
- | public Test() {}
- |
- | public Test(String s) {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- name equals "Test"
-
- constructors counts 2
- constructors.forEach { it.name equals "Test" }
- constructors.find { it.parameters.isEmpty() }.assertNotNull("Test()")
-
- with(constructors.find { it.parameters.isNotEmpty() }.assertNotNull("Test(String)")) {
- parameters.firstOrNull()?.type?.name equals "String"
- }
- }
- }
- }
-
- @Test
- fun innerClass() {
- inlineModelTest(
- """
- |class InnerClass {
- | public class D {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "InnerClass").cast<DClass>()) {
- children counts 2 // default constructor and inner class
- with((this / "D").cast<DClass>()) {
- name equals "D"
- children counts 1 // default constructor
- }
- }
- }
- }
-
- @Test
- fun varargs() {
- inlineModelTest(
- """
- |class Foo {
- | public void bar(String... x);
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Foo").cast<DClass>()) {
- name equals "Foo"
- children counts 2 // default constructor and function
-
- with((this / "bar").cast<DFunction>()) {
- name equals "bar"
- with(parameters.firstOrNull().assertNotNull("parameter")) {
- name equals "x"
- type.name equals "Array"
- }
- }
- }
- }
- }
-
- @Test
- fun fields() {
- inlineModelTest(
- """
- |class Test {
- | public int i;
- | public static final String s;
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- children counts 3 // default constructor + 2 props
-
- with((this / "i").cast<DProperty>()) {
- getter equals null
- setter equals null
- }
-
- with((this / "s").cast<DProperty>()) {
- getter equals null
- setter equals null
- }
- }
- }
- }
-
- @Test
- fun staticMethod() {
- inlineModelTest(
- """
- |class C {
- | public static void foo() {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "C" / "foo").cast<DFunction>()) {
- with(extra[AdditionalModifiers]!!.content.entries.single().value.assertNotNull("AdditionalModifiers")) {
- this counts 1
- first() equals ExtraModifiers.JavaOnlyModifiers.Static
- }
- }
- }
- }
-
- @Test
- fun throwsList() {
- inlineModelTest(
- """
- |class C {
- | public void foo() throws java.io.IOException, ArithmeticException {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "C" / "foo").cast<DFunction>()) {
- with(extra[CheckedExceptions]?.exceptions?.entries?.single()?.value.assertNotNull("CheckedExceptions")) {
- this counts 2
- first().packageName equals "java.io"
- first().classNames equals "IOException"
- get(1).packageName equals "java.lang"
- get(1).classNames equals "ArithmeticException"
- }
- }
- }
- }
-
- @Test
- fun annotatedAnnotation() {
- inlineModelTest(
- """
- |import java.lang.annotation.*;
- |
- |@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
- |public @interface Attribute {
- | String value() default "";
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Attribute").cast<DAnnotation>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- with(single()) {
- dri.classNames equals "Target"
- (params["value"].assertNotNull("value") as ArrayValue).value equals listOf(
- EnumValue("ElementType.FIELD", DRI("java.lang.annotation", "ElementType")),
- EnumValue("ElementType.TYPE", DRI("java.lang.annotation", "ElementType")),
- EnumValue("ElementType.METHOD", DRI("java.lang.annotation", "ElementType"))
- )
- }
- }
- }
- }
- }
-
- @Test
- fun javaLangObject() {
- inlineModelTest(
- """
- |class Test {
- | public Object fn() { return null; }
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Test" / "fn").cast<DFunction>()) {
- assertTrue(type is JavaObject)
- }
- }
- }
-
- @Test
- fun enumValues() {
- inlineModelTest(
- """
- |enum E {
- | Foo
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "E").cast<DEnum>()) {
- name equals "E"
- entries counts 1
- with((this / "Foo").cast<DEnumEntry>()) {
- name equals "Foo"
- }
- }
- }
- }
-
- @Test
- fun inheritorLinks() {
- inlineModelTest(
- """
- |public class InheritorLinks {
- | public static class Foo {}
- |
- | public static class Bar extends Foo {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "InheritorLinks").cast<DClass>()) {
- val dri = (this / "Bar").assertNotNull("Foo dri").dri
- with((this / "Foo").cast<DClass>()) {
- with(extra[InheritorsInfo].assertNotNull("InheritorsInfo")) {
- with(value.values.flatten().distinct()) {
- this counts 1
- first() equals dri
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `retention should work with static import`() {
- inlineModelTest(
- """
- |import java.lang.annotation.Retention;
- |import java.lang.annotation.RetentionPolicy;
- |import static java.lang.annotation.RetentionPolicy.RUNTIME;
- |
- |@Retention(RUNTIME)
- |public @interface JsonClass {
- |};
- """, configuration = configuration
- ) {
- with((this / "java" / "JsonClass").cast<DAnnotation>()) {
- val annotation = extra[Annotations]?.directAnnotations?.entries
- ?.firstOrNull()?.value //First sourceset
- ?.firstOrNull()
-
- val expectedDri = DRI("java.lang.annotation", "Retention", null, PointingToDeclaration)
- val expectedParams = "value" to EnumValue(
- "RUNTIME",
- DRI(
- "java.lang.annotation",
- "RetentionPolicy.RUNTIME",
- null,
- PointingToDeclaration,
- DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()
- )
- )
-
- assertEquals(expectedDri, annotation?.dri)
- assertEquals(expectedParams.first, annotation?.params?.entries?.first()?.key)
- assertEquals(expectedParams.second, annotation?.params?.entries?.first()?.value)
- }
- }
- }
-
- @Test
- fun variances() {
- inlineModelTest(
- """
- |public class Foo {
- | public void superBound(java.util.List<? super String> param) {}
- | public void extendsBound(java.util.List<? extends String> param) {}
- | public void unbounded(java.util.List<?> param) {}
- |}
- """, configuration = configuration
- ) {
- with((this / "java" / "Foo").cast<DClass>()) {
- val functionNames = functions.map { it.name }
- assertContains(functionNames, "superBound")
- assertContains(functionNames, "extendsBound")
- assertContains(functionNames, "unbounded")
-
- for (function in functions) {
- val param = function.parameters.single()
- val type = param.type as GenericTypeConstructor
- val variance = type.projections.single()
-
- when (function.name) {
- "superBound" -> {
- assertTrue(variance is Contravariance<*>)
- val bound = variance.inner
- assertEquals((bound as GenericTypeConstructor).dri.classNames, "String")
- }
- "extendsBound" -> {
- assertTrue(variance is Covariance<*>)
- val bound = variance.inner
- assertEquals((bound as GenericTypeConstructor).dri.classNames, "String")
- }
- "unbounded" -> {
- assertTrue(variance is Covariance<*>)
- val bound = variance.inner
- assertTrue(bound is JavaObject)
- }
- }
- }
- }
- }
- }
-
-}
diff --git a/plugins/base/src/test/kotlin/model/MultiLanguageInheritanceTest.kt b/plugins/base/src/test/kotlin/model/MultiLanguageInheritanceTest.kt
deleted file mode 100644
index 9b646f24..00000000
--- a/plugins/base/src/test/kotlin/model/MultiLanguageInheritanceTest.kt
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.utilities.firstIsInstanceOrNull
-import translators.documentationOf
-import utils.docs
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class MultiLanguageInheritanceTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- @Test
- fun `from java to kotlin`() {
- testInline(
- """
- |/src/main/kotlin/sample/Parent.java
- |package sample;
- |
- |/**
- | * Sample description from parent
- | */
- |public class Parent {
- | /**
- | * parent function docs
- | * @see java.lang.String for details
- | */
- | public void parentFunction(){
- | }
- |}
- |
- |/src/main/kotlin/sample/Child.kt
- |package sample
- |public class Child : Parent() {
- | override fun parentFunction(){
- |
- | }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.packages.flatMap { it.classlikes }
- .find { it.name == "Child" }?.functions?.find { it.name == "parentFunction" }
- val seeTag = function?.documentation?.values?.first()?.children?.firstIsInstanceOrNull<See>()
-
- assertEquals("", module.documentationOf("Child"))
- assertEquals("parent function docs", module.documentationOf("Child", "parentFunction"))
- assertEquals("for details", (seeTag?.root?.dfs { it is Text } as Text).body)
- assertEquals("java.lang.String", seeTag.name)
- }
- }
- }
-
- @Test
- fun `from kotlin to java`() {
- testInline(
- """
- |/src/main/kotlin/sample/ParentInKotlin.kt
- |package sample
- |
- |/**
- | * Sample description from parent
- | */
- |public open class ParentInKotlin {
- | /**
- | * parent `function docs`
- | *
- | * ```
- | * code block
- | * ```
- | * @see java.lang.String for details
- | */
- | public open fun parentFun(){
- |
- | }
- |}
- |
- |
- |/src/main/kotlin/sample/ChildInJava.java
- |package sample;
- |public class ChildInJava extends ParentInKotlin {
- | @Override
- | public void parentFun() {
- | super.parentFun();
- | }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.packages.flatMap { it.classlikes }
- .find { it.name == "ChildInJava" }?.functions?.find { it.name == "parentFun" }
- val seeTag = function?.documentation?.values?.first()?.children?.firstIsInstanceOrNull<See>()
-
- val expectedDocs = CustomDocTag(
- children = listOf(
- P(
- listOf(
- Text("parent "),
- CodeInline(
- listOf(Text("function docs"))
- )
- )
- ),
- CodeBlock(
- listOf(Text("code block"))
- )
-
- ),
- params = emptyMap(),
- name = "MARKDOWN_FILE"
- )
-
- assertEquals("", module.documentationOf("ChildInJava"))
- assertEquals(expectedDocs, function?.docs()?.firstIsInstanceOrNull<Description>()?.root)
- assertEquals("for details", (seeTag?.root?.dfs { it is Text } as Text).body)
- assertEquals("java.lang.String", seeTag.name)
- }
- }
- }
-
- @Test
- fun `inherit doc on method`() {
- testInline(
- """
- |/src/main/kotlin/sample/ParentInKotlin.kt
- |package sample
- |
- |/**
- | * Sample description from parent
- | */
- |public open class ParentInKotlin {
- | /**
- | * parent `function docs` with a link to [defaultString][java.lang.String]
- | *
- | * ```
- | * code block
- | * ```
- | */
- | public open fun parentFun(){
- |
- | }
- |}
- |
- |
- |/src/main/kotlin/sample/ChildInJava.java
- |package sample;
- |public class ChildInJava extends ParentInKotlin {
- | /**
- | * {@inheritDoc}
- | */
- | @Override
- | public void parentFun() {
- | super.parentFun();
- | }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.packages.flatMap { it.classlikes }
- .find { it.name == "ChildInJava" }?.functions?.find { it.name == "parentFun" }
-
- val expectedDocs = CustomDocTag(
- children = listOf(
- P(
- listOf(
- P(
- listOf(
- Text("parent "),
- CodeInline(
- listOf(Text("function docs"))
- ),
- Text(" with a link to "),
- DocumentationLink(
- DRI("java.lang", "String", null, PointingToDeclaration),
- listOf(Text("defaultString")),
- params = mapOf("href" to "[java.lang.String]")
- )
- )
- ),
- CodeBlock(
- listOf(Text("code block"))
- )
- )
- )
- ),
- params = emptyMap(),
- name = "MARKDOWN_FILE"
- )
-
- assertEquals("", module.documentationOf("ChildInJava"))
- assertEquals(expectedDocs, function?.docs()?.firstIsInstanceOrNull<Description>()?.root)
- }
- }
- }
-
- @Test
- fun `inline inherit doc on method`() {
- testInline(
- """
- |/src/main/kotlin/sample/ParentInKotlin.kt
- |package sample
- |
- |/**
- | * Sample description from parent
- | */
- |public open class ParentInKotlin {
- | /**
- | * parent function docs
- | * @see java.lang.String string
- | */
- | public open fun parentFun(){
- |
- | }
- |}
- |
- |
- |/src/main/kotlin/sample/ChildInJava.java
- |package sample;
- |public class ChildInJava extends ParentInKotlin {
- | /**
- | * Start {@inheritDoc} end
- | */
- | @Override
- | public void parentFun() {
- | super.parentFun();
- | }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.packages.flatMap { it.classlikes }
- .find { it.name == "ChildInJava" }?.functions?.find { it.name == "parentFun" }?.documentation?.values?.first()?.children?.first()
- assertEquals("", module.documentationOf("ChildInJava"))
- assertEquals("Start parent function docs end", function?.root?.withDescendants()?.filter { it is Text }?.toList()?.joinToString("") { (it as Text).body })
- }
- }
- }
-
- @Test
- fun `inherit doc on multiple throws`() {
- testInline(
- """
- |/src/main/kotlin/sample/ParentInKotlin.kt
- |package sample
- |
- |/**
- | * Sample description from parent
- | */
- |public open class ParentInKotlin {
- | /**
- | * parent function docs
- | * @throws java.lang.RuntimeException runtime
- | * @throws java.lang.Exception exception
- | */
- | public open fun parentFun(){
- |
- | }
- |}
- |
- |
- |/src/main/kotlin/sample/ChildInJava.java
- |package sample;
- |public class ChildInJava extends ParentInKotlin {
- | /**
- | * Start {@inheritDoc} end
- | * @throws java.lang.RuntimeException Testing {@inheritDoc}
- | */
- | @Override
- | public void parentFun() {
- | super.parentFun();
- | }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.packages.flatMap { it.classlikes }
- .find { it.name == "ChildInJava" }?.functions?.find { it.name == "parentFun" }
- val docs = function?.documentation?.values?.first()?.children?.first()
- val throwsTag = function?.documentation?.values?.first()?.children?.firstIsInstanceOrNull<Throws>()
-
- assertEquals("", module.documentationOf("ChildInJava"))
- assertEquals("Start parent function docs end", docs?.root?.withDescendants()?.filter { it is Text }?.toList()?.joinToString("") { (it as Text).body })
- assertEquals("Testing runtime", throwsTag?.root?.withDescendants()?.filter { it is Text }?.toList()?.joinToString("") { (it as Text).body })
- assertEquals("RuntimeException", throwsTag?.exceptionAddress?.classNames)
- }
- }
- }
-
- @Test
- fun `inherit doc on params`() {
- testInline(
- """
- |/src/main/kotlin/sample/ParentInKotlin.kt
- |package sample
- |
- |/**
- | * Sample description from parent
- | */
- |public open class ParentInKotlin {
- | /**
- | * parent function docs
- | * @param fst first docs
- | * @param snd second docs
- | */
- | public open fun parentFun(fst: String, snd: Int){
- |
- | }
- |}
- |
- |
- |/src/main/kotlin/sample/ChildInJava.java
- |package sample;
- |
- |import org.jetbrains.annotations.NotNull;
- |
- |public class ChildInJava extends ParentInKotlin {
- | /**
- | * @param fst start {@inheritDoc} end
- | * @param snd start {@inheritDoc} end
- | */
- | @Override
- | public void parentFun(@NotNull String fst, int snd) {
- | super.parentFun();
- | }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.packages.flatMap { it.classlikes }
- .find { it.name == "ChildInJava" }?.functions?.find { it.name == "parentFun" }
- val params = function?.documentation?.values?.first()?.children?.filterIsInstance<Param>()
-
- val fst = params?.first { it.name == "fst" }
- val snd = params?.first { it.name == "snd" }
-
- assertEquals("", module.documentationOf("ChildInJava"))
- assertEquals("", module.documentationOf("ChildInJava", "parentFun"))
- assertEquals("start first docs end", fst?.root?.withDescendants()?.filter { it is Text }?.toList()?.joinToString("") { (it as Text).body })
- assertEquals("start second docs end", snd?.root?.withDescendants()?.filter { it is Text }?.toList()?.joinToString("") { (it as Text).body })
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/ObjectTest.kt b/plugins/base/src/test/kotlin/model/ObjectTest.kt
deleted file mode 100644
index 009b406e..00000000
--- a/plugins/base/src/test/kotlin/model/ObjectTest.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.model.AdditionalModifiers
-import org.jetbrains.dokka.model.DObject
-import org.jetbrains.dokka.model.ExtraModifiers
-import utils.AbstractModelTest
-import kotlin.test.Test
-
-class ObjectTest : AbstractModelTest("/src/main/kotlin/objects/Test.kt", "objects") {
-
- @Test
- fun emptyObject() {
- inlineModelTest(
- """
- |object Obj {}
- """.trimIndent()
- ) {
- with((this / "objects" / "Obj").cast<DObject>()) {
- name equals "Obj"
- children counts 3
- }
- }
- }
-
- @Test
- fun `data object class`() {
- inlineModelTest(
- """
- |data object KotlinDataObject {}
- """.trimIndent()
- ) {
- with((this / "objects" / "KotlinDataObject").cast<DObject>()) {
- name equals "KotlinDataObject"
- extra[AdditionalModifiers]?.content?.values?.single()
- ?.single() equals ExtraModifiers.KotlinOnlyModifiers.Data
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/PackagesTest.kt b/plugins/base/src/test/kotlin/model/PackagesTest.kt
deleted file mode 100644
index b32f214d..00000000
--- a/plugins/base/src/test/kotlin/model/PackagesTest.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.model.DPackage
-import utils.AbstractModelTest
-import kotlin.test.Test
-
-class PackagesTest : AbstractModelTest("/src/main/kotlin/packages/Test.kt", "packages") {
-
- @Test
- fun rootPackage() {
- inlineModelTest(
- """
- |
- """.trimIndent(),
- prependPackage = false,
- configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- displayName = "JVM"
- }
- }
- }
- ) {
- with((this / "[root]").cast<DPackage>()) {
- packageName equals ""
- children counts 0
- }
- }
- }
-
- @Test
- fun simpleNamePackage() {
- inlineModelTest(
- """
- |package simple
- """.trimIndent(),
- prependPackage = false
- ) {
- with((this / "simple").cast<DPackage>()) {
- packageName equals "simple"
- children counts 0
- }
- }
- }
-
- @Test
- fun dottedNamePackage() {
- inlineModelTest(
- """
- |package dot.name
- """.trimIndent(),
- prependPackage = false
- ) {
- with((this / "dot.name").cast<DPackage>()) {
- packageName equals "dot.name"
- children counts 0
- }
- }
-
- }
-
- @Test
- fun multipleFiles() {
- inlineModelTest(
- """
- |package dot.name
- |/src/main/kotlin/packages/Test2.kt
- |package simple
- """.trimIndent(),
- prependPackage = false
- ) {
- children counts 2
- with((this / "dot.name").cast<DPackage>()) {
- packageName equals "dot.name"
- children counts 0
- }
- with((this / "simple").cast<DPackage>()) {
- packageName equals "simple"
- children counts 0
- }
- }
- }
-
- @Test
- fun multipleFilesSamePackage() {
- inlineModelTest(
- """
- |package simple
- |/src/main/kotlin/packages/Test2.kt
- |package simple
- """.trimIndent(),
- prependPackage = false
- ) {
- children counts 1
- with((this / "simple").cast<DPackage>()) {
- packageName equals "simple"
- children counts 0
- }
- }
- }
-
- @Test
- fun classAtPackageLevel() {
- inlineModelTest(
- """
- |package simple.name
- |
- |class Foo {}
- """.trimIndent(),
- prependPackage = false
- ) {
- with((this / "simple.name").cast<DPackage>()) {
- packageName equals "simple.name"
- children counts 1
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/PropertyTest.kt b/plugins/base/src/test/kotlin/model/PropertyTest.kt
deleted file mode 100644
index 92dc56de..00000000
--- a/plugins/base/src/test/kotlin/model/PropertyTest.kt
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model
-
-import org.jetbrains.dokka.model.*
-import utils.AbstractModelTest
-import utils.assertNotNull
-import utils.name
-import kotlin.test.Test
-
-class PropertyTest : AbstractModelTest("/src/main/kotlin/property/Test.kt", "property") {
-
- @Test
- fun valueProperty() {
- inlineModelTest(
- """
- |val property = "test""""
- ) {
- with((this / "property" / "property").cast<DProperty>()) {
- name equals "property"
- children counts 0
- with(getter.assertNotNull("Getter")) {
- type.name equals "String"
- }
- type.name equals "String"
- }
- }
- }
-
- @Test
- fun variableProperty() {
- inlineModelTest(
- """
- |var property = "test"
- """
- ) {
- with((this / "property" / "property").cast<DProperty>()) {
- name equals "property"
- children counts 0
- setter.assertNotNull("Setter")
- with(getter.assertNotNull("Getter")) {
- type.name equals "String"
- }
- type.name equals "String"
- }
- }
- }
-
- @Test
- fun valuePropertyWithGetter() {
- inlineModelTest(
- """
- |val property: String
- | get() = "test"
- """
- ) {
- with((this / "property" / "property").cast<DProperty>()) {
- name equals "property"
- children counts 0
- with(getter.assertNotNull("Getter")) {
- type.name equals "String"
- }
- type.name equals "String"
- }
- }
- }
-
- @Test
- fun variablePropertyWithAccessors() {
- inlineModelTest(
- """
- |var property: String
- | get() = "test"
- | set(value) {}
- """
- ) {
- with((this / "property" / "property").cast<DProperty>()) {
- name equals "property"
- children counts 0
- setter.assertNotNull("Setter")
- with(getter.assertNotNull("Getter")) {
- type.name equals "String"
- }
- visibility.values allEquals KotlinVisibility.Public
- }
- }
- }
-
- @Test
- fun propertyWithReceiver() {
- inlineModelTest(
- """
- |val String.property: Int
- | get() = size() * 2
- """
- ) {
- with((this / "property" / "property").cast<DProperty>()) {
- name equals "property"
- children counts 0
- with(receiver.assertNotNull("property receiver")) {
- name equals null
- type.name equals "String"
- }
- with(getter.assertNotNull("Getter")) {
- type.name equals "Int"
- }
- visibility.values allEquals KotlinVisibility.Public
- }
- }
- }
-
- @Test
- fun propertyOverride() {
- inlineModelTest(
- """
- |open class Foo() {
- | open val property: Int get() = 0
- |}
- |class Bar(): Foo() {
- | override val property: Int get() = 1
- |}
- """
- ) {
- with((this / "property").cast<DPackage>()) {
- with((this / "Foo" / "property").cast<DProperty>()) {
- dri.classNames equals "Foo"
- name equals "property"
- children counts 0
- with(getter.assertNotNull("Getter")) {
- type.name equals "Int"
- }
- }
- with((this / "Bar" / "property").cast<DProperty>()) {
- dri.classNames equals "Bar"
- name equals "property"
- children counts 0
- with(getter.assertNotNull("Getter")) {
- type.name equals "Int"
- }
- }
- }
- }
- }
-
- @Test
- fun propertyInherited() {
- inlineModelTest(
- """
- |open class Foo() {
- | open val property: Int get() = 0
- |}
- |class Bar(): Foo()
- """
- ) {
- with((this / "property").cast<DPackage>()) {
- with((this / "Bar" / "property").cast<DProperty>()) {
- dri.classNames equals "Foo"
- name equals "property"
- children counts 0
- with(getter.assertNotNull("Getter")) {
- type.name equals "Int"
- }
- extra[InheritedMember]?.inheritedFrom?.values?.single()?.run {
- classNames equals "Foo"
- callable equals null
- }
- }
- }
- }
- }
-
- @Test
- fun sinceKotlin() {
- inlineModelTest(
- """
- |/**
- | * Quite useful [String]
- | */
- |@SinceKotlin("1.1")
- |val prop: String = "1.1 rulezz"
- """
- ) {
- with((this / "property" / "prop").cast<DProperty>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "SinceKotlin"
- params.entries counts 1
- (params["version"].assertNotNull("version") as StringValue).value equals "1.1"
- }
- }
- }
- }
- }
-
- @Test
- fun annotatedProperty() {
- inlineModelTest(
- """
- |@Strictfp var property = "test"
- """,
- configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- ) {
- with((this / "property" / "property").cast<DProperty>()) {
- with(extra[Annotations]!!.directAnnotations.entries.single().value.assertNotNull("Annotations")) {
- this counts 1
- with(first()) {
- dri.classNames equals "Strictfp"
- params.entries counts 0
- }
- }
- }
- }
- }
-
- @Test fun genericTopLevelExtensionProperty(){
- inlineModelTest(
- """ | val <T : Number> List<T>.sampleProperty: T
- | get() { TODO() }
- """.trimIndent()
- ){
- with((this / "property" / "sampleProperty").cast<DProperty>()) {
- name equals "sampleProperty"
- with(receiver.assertNotNull("Property receiver")) {
- type.name equals "List"
- }
- with(getter.assertNotNull("Getter")) {
- type.name equals "T"
- }
- setter equals null
- generics counts 1
- generics.forEach {
- it.name equals "T"
- it.bounds.first().name equals "Number"
- }
- visibility.values allEquals KotlinVisibility.Public
- }
- }
- }
-
- @Test fun genericExtensionPropertyInClass(){
- inlineModelTest(
- """ | package test
- | class XD<T> {
- | var List<T>.sampleProperty: T
- | get() { TODO() }
- | set(value) { TODO() }
- | }
- """.trimIndent()
- ){
- with((this / "property" / "XD" / "sampleProperty").cast<DProperty>()) {
- name equals "sampleProperty"
- children counts 0
- with(receiver.assertNotNull("Property receiver")) {
- type.name equals "List"
- }
- with(getter.assertNotNull("Getter")) {
- type.name equals "T"
- }
- with(setter.assertNotNull("Setter")){
- type.name equals "Unit"
- }
- generics counts 0
- visibility.values allEquals KotlinVisibility.Public
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsForParametersTest.kt b/plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsForParametersTest.kt
deleted file mode 100644
index 9800006b..00000000
--- a/plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsForParametersTest.kt
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model.annotations
-
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.annotations
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.utilities.cast
-import utils.AbstractModelTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class JavaAnnotationsForParametersTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") {
-
- @Test
- fun `function with deprecated parameter`() {
- inlineModelTest(
- """
- |public class Test {
- | public void fn(@Deprecated String name) {}
- |}
- """.trimIndent()
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- with((this / "fn").cast<DFunction>()) {
- val dri =
- parameters.first().extra[Annotations]?.directAnnotations?.flatMap { it.value }?.map { it.dri }
- assertEquals(listOf(DRI("java.lang", "Deprecated")), dri)
- }
- }
- }
- }
-
- @Test
- fun `function with parameter that has custom annotation`() {
- inlineModelTest(
- """
- |@Retention(RetentionPolicy.RUNTIME)
- |@Target(ElementType.PARAMETER)
- |public @interface Hello {
- | public String bar() default "";
- |}
- |public class Test {
- | public void foo(@Hello(bar = "baz") String arg){ }
- |}
- """.trimIndent()
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- with((this / "foo").cast<DFunction>()) {
- val annotations =
- parameters.first().extra[Annotations]?.directAnnotations?.flatMap { it.value }
- val driOfHello = DRI("java", "Hello")
- val annotationsValues = annotations?.flatMap { it.params.values }?.map { it.toString() }?.toList()
-
- assertEquals(listOf(driOfHello), annotations?.map { it.dri })
- assertEquals(listOf("baz"), annotationsValues)
- }
- }
- }
- }
-
- @Test
- fun `function with annotated generic parameter`() {
- inlineModelTest(
- """
- |@Retention(RetentionPolicy.RUNTIME)
- |@Target(ElementType.TYPE_PARAMETER)
- |@interface Hello {
- | public String bar() default "";
- |}
- |public class Test {
- | public <@Hello(bar = "baz") T> List<T> foo() {
- | return null;
- | }
- |}
- """.trimIndent()
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- with((this / "foo").cast<DFunction>()) {
- val annotations = generics.first().extra[Annotations]?.directAnnotations?.flatMap { it.value }
- val driOfHello = DRI("java", "Hello")
- val annotationsValues = annotations?.flatMap { it.params.values }?.map { it.toString() }?.toList()
-
- assertEquals(listOf(driOfHello), annotations?.map { it.dri })
- assertEquals(listOf("baz"), annotationsValues)
- }
- }
- }
- }
-
- @Test
- fun `function with generic parameter that has annotated bounds`() {
- inlineModelTest(
- """
- |@Retention(RetentionPolicy.RUNTIME)
- |@Target({ElementType.TYPE_USE})
- |@interface Hello {
- | public String bar() default "";
- |}
- |public class Test {
- | public <T extends @Hello(bar = "baz") String> List<T> foo() {
- | return null;
- | }
- |}
- """.trimIndent()
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- with((this / "foo").cast<DFunction>()) {
- val annotations = ((generics.first().bounds.first() as Nullable).inner as GenericTypeConstructor)
- .extra[Annotations]?.directAnnotations?.flatMap { it.value }
- val driOfHello = DRI("java", "Hello")
- val annotationsValues = annotations?.flatMap { it.params.values }?.map { it.toString() }?.toList()
-
- assertEquals(listOf(driOfHello), annotations?.map { it.dri })
- assertEquals(listOf("baz"), annotationsValues)
- }
- }
- }
- }
-
- @Test
- fun `type parameter annotations should be visible even if type declaration has none`() {
- inlineModelTest(
- """
- |@Retention(RetentionPolicy.RUNTIME)
- |@Target(ElementType.PARAMETER)
- |public @interface Hello {
- | public String bar() default "";
- |}
- |public class Test {
- | public <T> void foo(java.util.List<@Hello T> param) {}
- |}
- """.trimIndent()
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- with((this / "foo").cast<DFunction>()) {
- val paramAnnotations = parameters.first()
- .type.cast<GenericTypeConstructor>()
- .projections.first().cast<TypeParameter>()
- .annotations()
- .values
- .flatten()
-
- assertEquals(1, paramAnnotations.size)
- assertEquals(DRI("java", "Hello"), paramAnnotations[0].dri)
- }
- }
- }
- }
-
- @Test
- fun `type parameter annotations should not be propagated from resolved type`() {
- inlineModelTest(
- """
- |@Retention(RetentionPolicy.RUNTIME)
- |@Target(ElementType.PARAMETER)
- |public @interface Hello {
- | public String bar() default "";
- |}
- |public class Test {
- | public <@Hello T> void foo(java.util.List<T> param) {}
- |}
- """.trimIndent()
- ) {
- with((this / "java" / "Test").cast<DClass>()) {
- with((this / "foo").cast<DFunction>()) {
- val paramAnnotations = parameters.first()
- .type.cast<GenericTypeConstructor>()
- .projections.first().cast<TypeParameter>()
- .annotations()
-
- assertTrue(paramAnnotations.isEmpty())
- }
- }
- }
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsTest.kt b/plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsTest.kt
deleted file mode 100644
index daab7dc9..00000000
--- a/plugins/base/src/test/kotlin/model/annotations/JavaAnnotationsTest.kt
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model.annotations
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.*
-import translators.findClasslike
-import kotlin.test.*
-
-class JavaAnnotationsTest : BaseAbstractTest() {
-
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- @Test // see https://github.com/Kotlin/dokka/issues/2350
- fun `should hande array used as annotation param value`() {
- testInline(
- """
- |/src/main/java/annotation/TestClass.java
- |package annotation;
- |public class TestClass {
- | @SimpleAnnotation(clazz = String[].class)
- | public boolean simpleAnnotation() {
- | return false;
- | }
- |}
- |
- |/src/main/java/annotation/SimpleAnnotation.java
- |package annotation;
- |@Retention(RetentionPolicy.RUNTIME)
- |@Target(ElementType.METHOD)
- |public @interface SimpleAnnotation {
- | Class<?> clazz();
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesTransformationStage = { module ->
- val testClass = module.findClasslike("annotation", "TestClass") as DClass
- assertNotNull(testClass)
-
- val annotatedFunction = testClass.functions.single { it.name == "simpleAnnotation" }
- val annotation =
- annotatedFunction.extra[Annotations]?.directAnnotations?.entries?.single()?.value?.single()
- assertNotNull(annotation) { "Expected to find an annotation on simpleAnnotation function, found none" }
- assertEquals("annotation", annotation.dri.packageName)
- assertEquals("SimpleAnnotation", annotation.dri.classNames)
- assertEquals(1, annotation.params.size)
-
- val param = annotation.params.values.single()
- assertTrue(param is ClassValue)
- // should probably be Array instead
- // String matches parsing of Kotlin sources as of now
- assertEquals("String", param.className)
- assertEquals("java.lang", param.classDRI.packageName)
- assertEquals("String", param.classDRI.classNames)
- }
- }
- }
-
- @Test // see https://github.com/Kotlin/dokka/issues/2551
- fun `should hande annotation used within annotation params with class param value`() {
- testInline(
- """
- |/src/main/java/annotation/TestClass.java
- |package annotation;
- |public class TestClass {
- | @XmlElementRefs({
- | @XmlElementRef(name = "NotOffered", namespace = "http://www.gaeb.de/GAEB_DA_XML/DA86/3.3", type = JAXBElement.class, required = false)
- | })
- | public List<JAXBElement<Object>> content;
- |}
- |
- |/src/main/java/annotation/XmlElementRefs.java
- |package annotation;
- |public @interface XmlElementRefs {
- | XmlElementRef[] value();
- |}
- |
- |/src/main/java/annotation/XmlElementRef.java
- |package annotation;
- |public @interface XmlElementRef {
- | String name();
- |
- | String namespace();
- |
- | boolean required();
- |
- | Class<JAXBElement> type();
- |}
- |
- |/src/main/java/annotation/JAXBElement.java
- |package annotation;
- |public class JAXBElement<T> {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesTransformationStage = { module ->
- val testClass = module.findClasslike("annotation", "TestClass") as DClass
- assertNotNull(testClass)
-
- val contentField = testClass.properties.find { it.name == "content" }
- assertNotNull(contentField)
-
- val annotation = contentField.extra[Annotations]?.directAnnotations?.entries?.single()?.value?.single()
- assertNotNull(annotation) { "Expected to find an annotation on content field, found none" }
- assertEquals("XmlElementRefs", annotation.dri.classNames)
- assertEquals(1, annotation.params.size)
-
- val arrayParam = annotation.params.values.single()
- assertTrue(arrayParam is ArrayValue, "Expected single annotation param to be array")
- assertEquals(1, arrayParam.value.size)
-
- val arrayParamValue = arrayParam.value.single()
- assertTrue(arrayParamValue is AnnotationValue)
-
- val arrayParamAnnotationValue = arrayParamValue.annotation
- assertEquals(4, arrayParamAnnotationValue.params.size)
- assertEquals("XmlElementRef", arrayParamAnnotationValue.dri.classNames)
-
- val annotationParams = arrayParamAnnotationValue.params.values.toList()
-
- val nameParam = annotationParams[0]
- assertTrue(nameParam is StringValue)
- assertEquals("NotOffered", nameParam.value)
-
- val namespaceParam = annotationParams[1]
- assertTrue(namespaceParam is StringValue)
- assertEquals("http://www.gaeb.de/GAEB_DA_XML/DA86/3.3", namespaceParam.value)
-
- val typeParam = annotationParams[2]
- assertTrue(typeParam is ClassValue)
- assertEquals("JAXBElement", typeParam.className)
- assertEquals("annotation", typeParam.classDRI.packageName)
- assertEquals("JAXBElement", typeParam.classDRI.classNames)
-
- val requiredParam = annotationParams[3]
- assertTrue(requiredParam is BooleanValue)
- assertFalse(requiredParam.value)
- }
- }
- }
-
- @Test // see https://github.com/Kotlin/dokka/issues/2509
- fun `should handle generic class in annotation`() {
- testInline(
- """
- |/src/main/java/annotation/Breaking.java
- |package annotation;
- |public class Breaking<Y> {
- |}
- |
- |/src/main/java/annotation/TestAnnotate.java
- |package annotation;
- |public @interface TestAnnotate {
- | Class<?> value();
- |}
- |
- |/src/main/java/annotation/TestClass.java
- |package annotation;
- |@TestAnnotate(Breaking.class)
- |public class TestClass {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesTransformationStage = { module ->
- val testClass = module.findClasslike("annotation", "TestClass") as DClass
- assertNotNull(testClass)
-
- val annotation = testClass.extra[Annotations]?.directAnnotations?.entries?.single()?.value?.single()
- assertNotNull(annotation) { "Expected to find an annotation on TestClass, found none" }
-
- assertEquals("TestAnnotate", annotation.dri.classNames)
- assertEquals(1, annotation.params.size)
-
- val valueParameter = annotation.params.values.single()
- assertTrue(valueParameter is ClassValue)
-
- assertEquals("Breaking", valueParameter.className)
-
- assertEquals("annotation", valueParameter.classDRI.packageName)
- assertEquals("Breaking", valueParameter.classDRI.classNames)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/model/annotations/KotlinAnnotationsForParametersTest.kt b/plugins/base/src/test/kotlin/model/annotations/KotlinAnnotationsForParametersTest.kt
deleted file mode 100644
index e3b17818..00000000
--- a/plugins/base/src/test/kotlin/model/annotations/KotlinAnnotationsForParametersTest.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package model.annotations
-
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.annotations
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.utilities.cast
-import utils.AbstractModelTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class KotlinAnnotationsForParametersTest : AbstractModelTest("/src/main/kotlin/annotations/Test.kt", "annotations") {
- @Test
- fun `generic receiver with annotations`() {
- inlineModelTest(
- """
- |@Target(AnnotationTarget.TYPE_PARAMETER)
- |annotation class Hello(val bar: String)
- |fun <@Hello("abc") T> foo(arg: String): List<T> = TODO()
- """.trimIndent()
- ) {
- with((this / "annotations" / "foo").cast<DFunction>()) {
- val annotations = generics.first().extra[Annotations]?.directAnnotations?.flatMap { it.value }
- val driOfHello = DRI("annotations", "Hello")
- val annotationsValues = annotations?.flatMap { it.params.values }?.map { it.toString() }?.toList()
-
- assertEquals(listOf(driOfHello), annotations?.map { it.dri })
- assertEquals(listOf("abc"), annotationsValues)
- }
- }
- }
-
- @Test
- fun `generic receiver with annotated bounds`() {
- inlineModelTest(
- """
- |@Target(AnnotationTarget.TYPE_PARAMETER)
- |annotation class Hello(val bar: String)
- |fun <T: @Hello("abc") String> foo(arg: String): List<T> = TODO()
- """.trimIndent()
- ) {
- with((this / "annotations" / "foo").cast<DFunction>()) {
- val annotations = (generics.first().bounds.first() as GenericTypeConstructor)
- .extra[Annotations]?.directAnnotations?.flatMap { it.value }
- val driOfHello = DRI("annotations", "Hello")
- val annotationsValues = annotations?.flatMap { it.params.values }?.map { it.toString() }?.toList()
-
- assertEquals(listOf(driOfHello), annotations?.map { it.dri })
- assertEquals(listOf("abc"), annotationsValues)
- }
- }
- }
-
- @Test
- fun `type parameter annotations should be visible even if type declaration has none`() {
- inlineModelTest(
- """
- |@Target(AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.TYPE)
- |annotation class Hello
- |
- |fun <T> foo(param: List<@Hello T>) {}
- """.trimIndent()
- ) {
- with((this / "annotations" / "foo").cast<DFunction>()) {
- val paramAnnotations = parameters.first()
- .type.cast<GenericTypeConstructor>()
- .projections
- .first().cast<Invariance<TypeParameter>>()
- .inner.cast<TypeParameter>()
- .annotations()
- .values
- .flatten()
-
- assertEquals(1, paramAnnotations.size)
- assertEquals(DRI("annotations", "Hello"), paramAnnotations[0].dri)
- }
- }
- }
-
- @Test
- fun `type parameter annotations should not be propagated from resolved type`() {
- inlineModelTest(
- """
- |@Target(AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.TYPE)
- |annotation class Hello
- |
- |fun <@Hello T> foo(param: List<T>) {}
- """.trimIndent()
- ) {
- with((this / "annotations" / "foo").cast<DFunction>()) {
- val paramAnnotations = parameters.first()
- .type.cast<GenericTypeConstructor>()
- .projections.first().cast<Invariance<TypeParameter>>()
- .inner.cast<TypeParameter>()
- .annotations()
-
- assertTrue(paramAnnotations.isEmpty())
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt b/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt
deleted file mode 100644
index 5412113e..00000000
--- a/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package multiplatform
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class BasicMultiplatformTest : BaseAbstractTest() {
-
- @Test
- fun dataTestExample() {
- val testDataDir = getTestDataDir("multiplatform/basicMultiplatformTest").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("$testDataDir/jvmMain/")
- }
- }
- }
-
- testFromData(configuration) {
- pagesTransformationStage = {
- assertEquals(7, it.children.firstOrNull()?.children?.count() ?: 0)
- }
- }
- }
-
- @Test
- fun inlineTestExample() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/multiplatform/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/multiplatform/Test.kt
- |package multiplatform
- |
- |object Test {
- | fun test2(str: String): Unit {println(str)}
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = {
- assertEquals(3, it.parentMap.size)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/packageList/PackageListTest.kt b/plugins/base/src/test/kotlin/packageList/PackageListTest.kt
deleted file mode 100644
index d6033433..00000000
--- a/plugins/base/src/test/kotlin/packageList/PackageListTest.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package packageList
-
-import org.jetbrains.dokka.base.renderers.PackageListService
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class PackageListTest {
- @Test
- fun `one module package list is created correctly`() {
- val nonStandardLocations = mapOf("//longArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Long]/PointingToDeclaration/" to "[JS root]/long-array-with-fun.html")
- val modules = mapOf("" to setOf("foo", "bar", "baz"))
- val format = RecognizedLinkFormat.DokkaHtml
- val output = PackageListService.renderPackageList(nonStandardLocations, modules, format.formatName, format.linkExtension)
- val expected = """
- |${'$'}dokka.format:html-v1
- |${'$'}dokka.linkExtension:html
- |${'$'}dokka.location://longArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Long]/PointingToDeclaration/[JS root]/long-array-with-fun.html
- |bar
- |baz
- |foo
- |""".trimMargin()
- assertEquals(expected, output)
- }
-
- @Test
- fun `multi-module package list is created correctly`() {
- val nonStandardLocations = mapOf("//longArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Long]/PointingToDeclaration/" to "[JS root]/long-array-with-fun.html")
- val modules = mapOf("moduleA" to setOf("foo", "bar"), "moduleB" to setOf("baz"), "moduleC" to setOf("qux"))
- val format = RecognizedLinkFormat.DokkaHtml
- val output = PackageListService.renderPackageList(nonStandardLocations, modules, format.formatName, format.linkExtension)
- val expected = """
- |${'$'}dokka.format:html-v1
- |${'$'}dokka.linkExtension:html
- |${'$'}dokka.location://longArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Long]/PointingToDeclaration/[JS root]/long-array-with-fun.html
- |module:moduleA
- |bar
- |foo
- |module:moduleB
- |baz
- |module:moduleC
- |qux
- |""".trimMargin()
- assertEquals(expected, output)
- }
-
- @Test
- fun `empty package set in module`() {
- val nonStandardLocations = emptyMap<String, String>()
- val modules = mapOf("moduleA" to setOf("foo", "bar"), "moduleB" to emptySet(), "moduleC" to setOf("qux"))
- val format = RecognizedLinkFormat.DokkaHtml
- val output = PackageListService.renderPackageList(nonStandardLocations, modules, format.formatName, format.linkExtension)
- val expected = """
- |${'$'}dokka.format:html-v1
- |${'$'}dokka.linkExtension:html
- |
- |module:moduleA
- |bar
- |foo
- |module:moduleC
- |qux
- |""".trimMargin()
- assertEquals(expected, output)
- }
-}
diff --git a/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt b/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt
deleted file mode 100644
index 983f73ff..00000000
--- a/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package pageMerger
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.*
-import org.junit.jupiter.api.RepeatedTest
-import kotlin.test.Ignore
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class PageNodeMergerTest : BaseAbstractTest() {
-
- private val defaultConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- @Test
- fun sameNameStrategyTest() {
- testInline(
- """
- |/src/main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |fun testT(): Int = 1
- |fun testT(i: Int): Int = i
- |
- |object Test {
- | fun test(): String = ""
- | fun test(str: String): String = str
- |}
- """.trimMargin(),
- defaultConfiguration
- ) {
- pagesTransformationStage = {
- val allChildren = it.childrenRec().filterIsInstance<ContentPage>()
- val testT = allChildren.filter { it.name == "testT" }
- val test = allChildren.filter { it.name == "test" }
-
- assertTrue(testT.size == 1, "There can be only one testT page")
- assertTrue(testT.first().dri.size == 2, "testT page should have 2 DRI, but has ${testT.first().dri.size}")
-
- assertTrue(test.size == 1, "There can be only one test page")
- assertTrue(test.first().dri.size == 2, "test page should have 2 DRI, but has ${test.first().dri.size}")
- }
- }
- }
-
- @Ignore("TODO: reenable when we have infrastructure for turning off extensions")
- @Test
- fun defaultStrategyTest() {
- val strList: MutableList<String> = mutableListOf()
-
- testInline(
- """
- |/src/main/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |fun testT(): Int = 1
- |fun testT(i: Int): Int = i
- |
- |object Test {
- | fun test(): String = ""
- | fun test(str: String): String = str
- |}
- """.trimMargin(),
- defaultConfiguration
- ) {
- pagesTransformationStage = { root ->
- val allChildren = root.childrenRec().filterIsInstance<ContentPage>()
- val testT = allChildren.filter { it.name == "testT" }
- val test = allChildren.filter { it.name == "test" }
-
- assertTrue(testT.size == 1, "There can be only one testT page")
- assertTrue(testT.first().dri.size == 1, "testT page should have single DRI, but has ${testT.first().dri.size}")
-
- assertTrue(test.size == 1, "There can be only one test page")
- assertTrue(test.first().dri.size == 1, "test page should have single DRI, but has ${test.first().dri.size}")
-
- assertTrue(strList.count() == 2, "Expected 2 warnings, got ${strList.count()}")
- }
- }
- }
-
- fun PageNode.childrenRec(): List<PageNode> = listOf(this) + children.flatMap { it.childrenRec() }
-
-
- @Test
- fun `should not be merged`() {
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jsMain/kotlin/pageMerger/Test.kt")
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |annotation class DoNotMerge
- |
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |annotation class DoNotMerge
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- println(it)
- val allChildren = it.childrenRec().filterIsInstance<ClasslikePageNode>()
- val jvmClass = allChildren.filter { it.name == "[jvm]DoNotMerge" }
- val jsClass = allChildren.filter { it.name == "[js]DoNotMerge" }
- val noClass = allChildren.filter { it.name == "DoNotMerge" }
- assertTrue(jvmClass.size == 1, "There can be only one DoNotMerge(jvm) page")
- assertTrue(
- jvmClass.first().documentables.firstOrNull()?.sourceSets?.single()?.analysisPlatform?.key == "jvm",
- "[jvm]DoNotMerge should have only jvm sources"
- )
-
- assertTrue(jsClass.size == 1, "There can be only one DoNotMerge(js) page")
- assertTrue(
- jsClass.first().documentables.firstOrNull()?.sourceSets?.single()?.analysisPlatform?.key == "js",
- "[js]DoNotMerge should have only js sources"
- )
-
- assertTrue(noClass.isEmpty(), "There can't be any DoNotMerge page")
- }
- }
- }
-
- @RepeatedTest(3)
- fun `should deterministically render same name property extensions`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |class ExtensionReceiver
- |
- |/**
- | * Top level val extension
- | */
- |val ExtensionReceiver.foo: String get() = "bar"
- |
- |class Obj {
- | companion object {
- | /**
- | * Companion val extension
- | */
- | val ExtensionReceiver.foo: String get() = "bar"
- | }
- |}
- |
- |/src/main/kotlin/test/nestedpackage/Pckg.kt
- |package test.nestedpackage
- |
- |import test.ExtensionReceiver
- |
- |/**
- | * From nested package int val extension
- | */
- |val ExtensionReceiver.foo: Int get() = 42
- """.trimMargin(),
- defaultConfiguration
- ) {
- renderingStage = { rootPageNode, _ ->
- val extensions = rootPageNode.findDivergencesOfClass("ExtensionReceiver", ContentKind.Extensions)
-
- extensions.assertContainsKDocsInOrder(
- "Top level val extension",
- "Companion val extension",
- "From nested package int val extension"
- )
- }
- }
- }
-
- @RepeatedTest(3)
- fun `should deterministically render parameterless same name function extensions`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |class ExtensionReceiver
- |
- |/**
- | * Top level fun extension
- | */
- |fun ExtensionReceiver.bar(): String = "bar"
- |
- |class Obj {
- |
- | companion object {
- | /**
- | * Companion fun extension
- | */
- | fun ExtensionReceiver.bar(): String = "bar"
- | }
- |}
- |
- |/src/main/kotlin/test/nestedpackage/Pckg.kt
- |package test.nestedpackage
- |
- |import test.ExtensionReceiver
- |
- |/**
- | * From nested package fun extension
- | */
- |fun ExtensionReceiver.bar(): String = "bar"
- """.trimMargin(),
- defaultConfiguration
- ) {
- renderingStage = { rootPageNode, _ ->
- val extensions = rootPageNode.findDivergencesOfClass("ExtensionReceiver", ContentKind.Extensions)
- extensions.assertContainsKDocsInOrder(
- "Top level fun extension",
- "Companion fun extension",
- "From nested package fun extension"
- )
- }
- }
- }
-
- @RepeatedTest(3)
- fun `should deterministically render same name function extensions with parameters`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |class ExtensionReceiver
- |
- |/**
- | * Top level fun extension with one string param
- | */
- |fun ExtensionReceiver.bar(one: String): String = "bar"
- |
- |/**
- | * Top level fun extension with one int param
- | */
- |fun ExtensionReceiver.bar(one: Int): Int = 42
- |
- |class Obj {
- |
- | companion object {
- | /**
- | * Companion fun extension with two params
- | */
- | fun ExtensionReceiver.bar(one: String, two: String): String = "bar"
- | }
- |}
- |
- |/src/main/kotlin/test/nestedpackage/Pckg.kt
- |package test.nestedpackage
- |
- |import test.ExtensionReceiver
- |
- |/**
- | * From nested package fun extension with two params
- | */
- |fun ExtensionReceiver.bar(one: String, two: String): String = "bar"
- |
- |/**
- | * From nested package fun extension with three params
- | */
- |fun ExtensionReceiver.bar(one: String, two: String, three: String): String = "bar"
- |
- |/**
- | * From nested package fun extension with four params
- | */
- |fun ExtensionReceiver.bar(one: String, two: String, three: String, four: String): String = "bar"
- """.trimMargin(),
- defaultConfiguration
- ) {
- renderingStage = { rootPageNode, _ ->
- val extensions = rootPageNode.findDivergencesOfClass("ExtensionReceiver", ContentKind.Extensions)
- extensions.assertContainsKDocsInOrder(
- "Top level fun extension with one int param",
- "Top level fun extension with one string param",
- "Companion fun extension with two params",
- "From nested package fun extension with two params",
- "From nested package fun extension with three params",
- "From nested package fun extension with four params"
- )
- }
- }
- }
-
- @RepeatedTest(3)
- fun `should deterministically render same name function extensions with different receiver and return type`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |/**
- | * Top level fun extension string
- | */
- |fun Int.bar(): String = "bar"
- |
- |/**
- | * Top level fun extension int
- | */
- |fun String.bar(): Int = 42
- """.trimMargin(),
- defaultConfiguration
- ) {
- renderingStage = { rootPageNode, _ ->
- val packageFunctionBlocks = rootPageNode.findPackageFunctionBlocks(packageName = "test")
- assertEquals(1, packageFunctionBlocks.size, "Expected to find only one group for the functions")
-
- val functionsBlock = packageFunctionBlocks[0]
- functionsBlock.assertContainsKDocsInOrder(
- "Top level fun extension string",
- "Top level fun extension int"
- )
- }
- }
- }
-
- @Test
- fun `should not ignore case when grouping by name`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |/**
- | * Top level fun bAr
- | */
- |fun Int.bAr(): String = "bar"
- |
- |/**
- | * Top level fun BaR
- | */
- |fun String.BaR(): Int = 42
- """.trimMargin(),
- defaultConfiguration
- ) {
- renderingStage = { rootPageNode, _ ->
- val packageFunctionBlocks = rootPageNode.findPackageFunctionBlocks(packageName = "test")
- assertEquals(2, packageFunctionBlocks.size, "Expected two separate function groups")
-
- val firstGroup = packageFunctionBlocks[0]
- firstGroup.assertContainsKDocsInOrder(
- "Top level fun BaR",
- )
-
- val secondGroup = packageFunctionBlocks[1]
- secondGroup.assertContainsKDocsInOrder(
- "Top level fun bAr",
- )
- }
- }
- }
-
- @Test
- fun `should sort groups alphabetically ignoring case`() {
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |/** Sequence builder */
- |fun <T> sequence(): Sequence<T>
- |
- |/** Sequence SAM constructor */
- |fun <T> Sequence(): Sequence<T>
- |
- |/** Sequence.any() */
- |fun <T> Sequence<T>.any() {}
- |
- |/** Sequence interface */
- |interface Sequence<T>
- """.trimMargin(),
- defaultConfiguration
- ) {
- renderingStage = { rootPageNode, _ ->
- val packageFunctionBlocks = rootPageNode.findPackageFunctionBlocks(packageName = "test")
- assertEquals(3, packageFunctionBlocks.size, "Expected 3 separate function groups")
-
- packageFunctionBlocks[0].assertContainsKDocsInOrder(
- "Sequence.any()",
- )
-
- packageFunctionBlocks[1].assertContainsKDocsInOrder(
- "Sequence SAM constructor",
- )
-
- packageFunctionBlocks[2].assertContainsKDocsInOrder(
- "Sequence builder",
- )
- }
- }
- }
-
- private fun RootPageNode.findDivergencesOfClass(className: String, kind: ContentKind): ContentDivergentGroup {
- val extensionReceiverPage = this.dfs { it is ClasslikePageNode && it.name == className } as ClasslikePageNode
- return extensionReceiverPage.content
- .dfs { it is ContentDivergentGroup && it.dci.kind == kind } as ContentDivergentGroup
- }
-
- private fun RootPageNode.findPackageFunctionBlocks(packageName: String): List<ContentDivergentGroup> {
- val packagePage = this.dfs { it is PackagePage && it.name == packageName } as PackagePage
- val packageFunctionTable = packagePage.content.dfs {
- it is ContentTable && it.dci.kind == ContentKind.Functions
- } as ContentTable
-
- return packageFunctionTable.children.map { packageGroup ->
- packageGroup.dfs { it is ContentDivergentGroup } as ContentDivergentGroup
- }
- }
-
- private fun ContentDivergentGroup.assertContainsKDocsInOrder(vararg expectedKDocs: String) {
- expectedKDocs.forEachIndexed { index, expectedKDoc ->
- assertEquals(expectedKDoc, this.getElementKDocText(index))
- }
- }
-
- private fun ContentDivergentGroup.getElementKDocText(index: Int): String {
- val element = this.children.getOrNull(index) ?: throw IllegalArgumentException("No element with index $index")
- val commentNode = element.after
- ?.withDescendants()
- ?.singleOrNull { it is ContentText && it.dci.kind == ContentKind.Comment }
- ?: throw IllegalStateException("Expected the element to contain a single paragraph of text / comment")
-
- return (commentNode as ContentText).text
- }
-}
diff --git a/plugins/base/src/test/kotlin/parsers/JavadocParserTest.kt b/plugins/base/src/test/kotlin/parsers/JavadocParserTest.kt
deleted file mode 100644
index b56edc97..00000000
--- a/plugins/base/src/test/kotlin/parsers/JavadocParserTest.kt
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package parsers
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.JavaClassReference
-import org.jetbrains.dokka.model.DEnum
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.utilities.firstIsInstanceOrNull
-import utils.docs
-import utils.text
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-
-class JavadocParserTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- }
- }
- }
-
- private fun performJavadocTest(testOperation: (DModule) -> Unit) {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Date2.java
- |
- |package docs
- |/**
- | * class level docs
- | */
- |public enum AnEnumType {
- | /**
- | * content being refreshed, which can be a result of
- | * invalidation, refresh that may contain content updates, or the initial load.
- | */
- | REFRESH
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = testOperation
- }
- }
-
- @Test
- fun `correctly parsed list`() {
- performJavadocTest { module ->
- val docs =
- (module.packages.single().classlikes.single() as DEnum).entries.single().documentation.values.single().children.single().root.text()
- assertEquals(
- "content being refreshed, which can be a result of invalidation, refresh that may contain content updates, or the initial load.",
- docs.trimEnd()
- )
- }
- }
-
- @Test
- fun `code tag`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * Identifies calls to {@code assertThat}.
- | *
- | * {@code
- | * Set<String> s;
- | * System.out.println("s1 = " + s);
- | * }
- | * <pre>{@code
- | * Set<String> s2;
- | * System.out
- | * .println("s2 = " + s2);
- | * }</pre>
- | *
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- Text(body = "Identifies calls to "),
- CodeInline(children = listOf(Text(body = "assertThat"))),
- Text(body = ". "),
- CodeInline(children = listOf(Text(body = "\nSet<String> s;\nSystem.out.println(\"s1 = \" + s);\n")))
- ),
- root.children[0].children
- )
- kotlin.test.assertEquals(
- CodeBlock(children = listOf(Text(body = "\nSet<String> s2;\nSystem.out\n .println(\"s2 = \" + s2);\n"))),
- root.children[1]
- )
- }
- }
- }
-
- @Test
- fun `literal tag`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * An example of using the literal tag
- | * {@literal @}Entity
- | * public class User {}
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- Text(body = "An example of using the literal tag "),
- Text(body = "@"),
- Text(body = "Entity public class User {}"),
- ),
- root.children.first().children
- )
- }
- }
- }
-
- @Test
- fun `literal tag nested under pre tag`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * An example of using the literal tag
- | * <pre>
- | * {@literal @}Entity
- | * public class User {}
- | * </pre>
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- P(children = listOf(Text(body = "An example of using the literal tag "))),
- Pre(
- children =
- listOf(
- Text(body = "@"),
- Text(body = "Entity\npublic class User {}\n")
- )
- )
- ),
- root.children
- )
- }
- }
- }
-
- @Test
- fun `literal tag containing angle brackets`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * An example of using the literal tag
- | * {@literal a<B>c}
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- P(
- children = listOf(
- Text(body = "An example of using the literal tag "),
- Text(body = "a<B>c")
- )
- ),
- ),
- root.children
- )
- }
- }
- }
-
- @Test
- fun `html img tag`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * <img src="/path/to/img.jpg" alt="Alt text"/>
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- P(
- children = listOf(
- Img(
- params = mapOf(
- "href" to "/path/to/img.jpg",
- "alt" to "Alt text"
- )
- )
- )
- )
- ),
- root.children
- )
- }
- }
- }
-
- @Test
- fun `description list tag`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * <dl>
- | * <dt>
- | * <code>name="<i>name</i>"</code>
- | * </dt>
- | * <dd>
- | * A URI path segment. The subdirectory name for this value is contained in the
- | * <code>path</code> attribute.
- | * </dd>
- | * <dt>
- | * <code>path="<i>path</i>"</code>
- | * </dt>
- | * <dd>
- | * The subdirectory you're sharing. While the <i>name</i> attribute is a URI path
- | * segment, the <i>path</i> value is an actual subdirectory name.
- | * </dd>
- | * </dl>
- | */
- | public class Test {}
- """.trimIndent()
-
- val expected = listOf(
- Dl(
- listOf(
- Dt(
- listOf(
- CodeInline(
- listOf(
- Text("name=\""),
- I(
- listOf(
- Text("name")
- )
- ),
- Text("\"")
- )
- ),
- )
- ),
- Dd(
- listOf(
- Text(" A URI path segment. The subdirectory name for this value is contained in the "),
- CodeInline(
- listOf(
- Text("path")
- )
- ),
- Text(" attribute. ")
- )
- ),
-
- Dt(
- listOf(
- CodeInline(
- listOf(
- Text("path=\""),
- I(
- listOf(
- Text("path")
- )
- ),
- Text("\"")
- )
- )
- )
- ),
- Dd(
- listOf(
- Text(" The subdirectory you're sharing. While the "),
- I(
- listOf(
- Text("name")
- )
- ),
- Text(" attribute is a URI path segment, the "),
- I(
- listOf(
- Text("path")
- )
- ),
- Text(" value is an actual subdirectory name. ")
- )
- )
- )
- )
- )
-
- testInline(source, configuration) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- assertEquals(expected, docs.children.first().root.children)
- }
- }
- }
-
- @Test
- fun `header tags are handled properly`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * An example of using the header tags
- | * <h1>A header</h1>
- | * <h2>A second level header</h2>
- | * <h3>A third level header</h3>
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- P(children = listOf(Text("An example of using the header tags "))),
- H1(
- listOf(
- Text("A header")
- )
- ),
- H2(
- listOf(
- Text("A second level header")
- )
- ),
- H3(
- listOf(
- Text("A third level header")
- )
- )
- ),
- root.children
- )
- }
- }
- }
-
- @Test
- fun `var tag is handled properly`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * An example of using var tag: <var>variable</var>
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- P(
- children = listOf(
- Text("An example of using var tag: "),
- Var(children = listOf(Text("variable"))),
- )
- ),
- ),
- root.children
- )
- }
- }
- }
-
- @Test
- fun `u tag is handled properly`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * An example of using u tag: <u>underlined</u>
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- assertEquals(
- listOf(
- P(
- children = listOf(
- Text("An example of using u tag: "),
- U(children = listOf(Text("underlined"))),
- )
- ),
- ),
- root.children
- )
- }
- }
- }
-
- @Test
- fun `undocumented see also from java`() {
- testInline(
- """
- |/src/main/java/example/Source.java
- |package example;
- |
- |public interface Source {
- | String getProperty(String k, String v);
- |
- | /**
- | * @see #getProperty(String, String)
- | */
- | String getProperty(String k);
- |}
- """.trimIndent(), configuration
- ) {
- documentablesTransformationStage = { module ->
- val functionWithSeeTag = module.packages.flatMap { it.classlikes }.flatMap { it.functions }
- .find { it.name == "getProperty" && it.parameters.count() == 1 }
- val seeTag = functionWithSeeTag?.docs()?.firstIsInstanceOrNull<See>()
- val expectedLinkDestinationDRI = DRI(
- packageName = "example",
- classNames = "Source",
- callable = Callable(
- name = "getProperty",
- params = listOf(JavaClassReference("java.lang.String"), JavaClassReference("java.lang.String"))
- )
- )
-
- assertNotNull(seeTag)
- assertEquals("getProperty(String, String)", seeTag.name)
- assertEquals(expectedLinkDestinationDRI, seeTag.address)
- assertEquals(emptyList<DocTag>(), seeTag.children)
- }
- }
- }
-
- @Test
- fun `documented see also from java`() {
- testInline(
- """
- |/src/main/java/example/Source.java
- |package example;
- |
- |public interface Source {
- | String getProperty(String k, String v);
- |
- | /**
- | * @see #getProperty(String, String) this is a reference to a method that is present on the same class.
- | */
- | String getProperty(String k);
- |}
- """.trimIndent(), configuration
- ) {
- documentablesTransformationStage = { module ->
- val functionWithSeeTag = module.packages.flatMap { it.classlikes }.flatMap { it.functions }
- .find { it.name == "getProperty" && it.parameters.size == 1 }
- val seeTag = functionWithSeeTag?.docs()?.firstIsInstanceOrNull<See>()
- val expectedLinkDestinationDRI = DRI(
- packageName = "example",
- classNames = "Source",
- callable = Callable(
- name = "getProperty",
- params = listOf(JavaClassReference("java.lang.String"), JavaClassReference("java.lang.String"))
- )
- )
-
- assertNotNull(seeTag)
- assertEquals("getProperty(String, String)", seeTag.name)
- assertEquals(expectedLinkDestinationDRI, seeTag.address)
- assertEquals(
- "this is a reference to a method that is present on the same class.",
- seeTag.children.first().text().trim()
- )
- assertEquals(1, seeTag.children.size)
- }
- }
- }
-
- @Test
- fun `tags are case-sensitive`() {
- val source = """
- |/src/main/kotlin/test/Test.java
- |package example
- |
- | /**
- | * Java's tag with wrong case
- | * {@liTeRal @}Entity
- | * public class User {}
- | */
- | public class Test {}
- """.trimIndent()
- testInline(
- source,
- configuration,
- ) {
- documentablesCreationStage = { modules ->
- val docs = modules.first().packages.first().classlikes.single().documentation.values.first()
- val root = docs.children.first().root
-
- kotlin.test.assertEquals(
- listOf(
- Text(body = "Java's tag with wrong case {@liTeRal @}Entity public class User {}"),
- ),
- root.children.first().children
- )
- }
- }
- }
-
- // TODO [beresnev] move to java-analysis
-// @Test
-// fun `test isolated parsing is case sensitive`() {
-// // Ensure that it won't accidentally break
-// val values = JavadocTag.values().map { it.toString().toLowerCase() }
-// val withRandomizedCapitalization = values.map {
-// val result = buildString {
-// for (char in it) {
-// if (Random.nextBoolean()) {
-// append(char)
-// } else {
-// append(char.toLowerCase())
-// }
-// }
-// }
-// if (result == it) result.toUpperCase() else result
-// }
-//
-// for ((index, value) in JavadocTag.values().withIndex()) {
-// assertEquals(value, JavadocTag.lowercaseValueOfOrNull(values[index]))
-// assertNull(JavadocTag.lowercaseValueOfOrNull(withRandomizedCapitalization[index]))
-// }
-// }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/BasicTest.kt b/plugins/base/src/test/kotlin/renderers/html/BasicTest.kt
deleted file mode 100644
index 9653b7bb..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/BasicTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.links.DRI
-import renderers.testPage
-import utils.Span
-import utils.match
-import kotlin.test.Test
-
-class BasicTest : HtmlRenderingOnlyTestBase() {
- @Test
- fun `unresolved DRI link should render as text`() {
- val page = testPage {
- link("linkText", DRI("nonexistentPackage", "nonexistentClass"))
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Span("linkText"))
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt b/plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt
deleted file mode 100644
index 4bb0d41f..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/BreadcrumbsTest.kt
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jsoup.nodes.Element
-import signatures.renderedContent
-import utils.*
-import kotlin.test.Test
-
-class BreadcrumbsTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- @Test
- fun `should add breadcrumbs with current element`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/basic/TestClass.kt
- |package testpackage
- |
- |class TestClass {
- | fun foo() {}
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/testpackage/-test-class/foo.html").selectBreadcrumbs().match(
- link("root"),
- delimiter(),
- link("testpackage"),
- delimiter(),
- link("TestClass"),
- delimiter(),
- current("foo"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `should mark only one element as current even if more elements have the same name`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/basic/TestClass.kt
- |package testpackage
- |
- |class testname {
- | val testname: String = ""
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/testpackage/testname/testname.html").selectBreadcrumbs().match(
- link("root"),
- delimiter(),
- link("testpackage"),
- delimiter(),
- link("testname"),
- delimiter(),
- current("testname"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- private fun Element.selectBreadcrumbs() = this.select("div.breadcrumbs").single()
-
- private fun link(text: String): Tag = A(text)
- private fun delimiter(): Tag = Span().withClasses("delimiter")
- private fun current(text: String): Tag = Span(text).withClasses("current")
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/CoverPageTest.kt b/plugins/base/src/test/kotlin/renderers/html/CoverPageTest.kt
deleted file mode 100644
index 6b3ce2eb..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/CoverPageTest.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import signatures.renderedContent
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class CoverPageTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(commonStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- @Test
- fun `names of nested inheritors`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | sealed class Result{
- | class Success(): Result()
- | class Failed(): Result()
- | }
- """
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.renderedContent("root/example/-result/index.html")
- val tableInheritors = content.select("div.table").single { it.previousElementSibling()?.text() == "Inheritors" && it.childrenSize() == 2 }
- assertEquals(tableInheritors.getElementsContainingOwnText("Failed").singleOrNull()?.tagName(), "a")
- assertEquals(tableInheritors.getElementsContainingOwnText("Success").singleOrNull()?.tagName(), "a")
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/CustomFooterTest.kt b/plugins/base/src/test/kotlin/renderers/html/CustomFooterTest.kt
deleted file mode 100644
index ff562c38..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/CustomFooterTest.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import renderers.testPage
-import utils.A
-import utils.Div
-import utils.Span
-import utils.match
-import kotlin.test.Test
-
-class CustomFooterTest : HtmlRenderingOnlyTestBase() {
- @Test
- fun `should include message from custom footer`() {
- val page = testPage { }
- HtmlRenderer(context).render(page)
- renderedContent.match(
- Span(A()),
- Span(Div("Custom message")),
- Span(Span("Generated by "), A(Span("dokka"), Span()))
- )
- }
-
- override val configuration: DokkaConfigurationImpl
- get() = super.configuration.copy(
- pluginsConfiguration = listOf(
- PluginConfigurationImpl(
- DokkaBase::class.java.canonicalName,
- DokkaConfiguration.SerializationFormat.JSON,
- toJsonString(DokkaBaseConfiguration(footerMessage = """<div style="color: red">Custom message</div>"""))
- )
- )
- )
-
- override val renderedContent: Element
- get() = files.contents.getValue("test-page.html").let { Jsoup.parse(it) }.select(".footer").single()
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt b/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt
deleted file mode 100644
index ccc43f12..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.ContentDivergentGroup
-import renderers.testPage
-import utils.Br
-import utils.match
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class DivergentTest : HtmlRenderingOnlyTestBase() {
-
- @Test
- fun simpleWrappingCase() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- }
- }
- HtmlRenderer(context).render(page)
- renderedContent.select("[data-togglable=DEFAULT/js]").single().match("a")
- }
-
- @Test
- fun noPlatformHintCase() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test"), implicitlySourceSetHinted = false) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- }
- }
- HtmlRenderer(context).render(page)
- renderedContent.match("a")
- }
-
- @Test
- fun divergentBetweenSourceSets() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("b")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("c")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- val content = renderedContent
- content.select("[data-togglable=DEFAULT/js]").single().match("a")
- content.select("[data-togglable=DEFAULT/jvm]").single().match("b")
- content.select("[data-togglable=DEFAULT/native]").single().match("c")
- }
-
- @Test
- fun divergentInOneSourceSet() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("b")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(js)) {
- divergent {
- text("c")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.select("[data-togglable=DEFAULT/js]").single().match("abc")
- }
-
- @Test
- fun divergentInAndBetweenSourceSets() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("b")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("c")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("d")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(native)) {
- divergent {
- text("e")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- val content = renderedContent
- val orderOfTabs = content.select(".platform-bookmarks-row").single().children().map { it.attr("data-toggle") }
-
- assertEquals(listOf("DEFAULT/js", "DEFAULT/jvm", "DEFAULT/native"), orderOfTabs)
-
- content.select("[data-togglable=DEFAULT/native]").single().match("ae")
- content.select("[data-togglable=DEFAULT/js]").single().match("bd")
- content.select("[data-togglable=DEFAULT/jvm]").single().match("c")
- }
-
- @Test
- fun divergentInAndBetweenSourceSetsWithGrouping() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- after {
- text("a+")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("b")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("c")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("d")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(native)) {
- divergent {
- text("e")
- }
- after {
- text("e+")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- val content = renderedContent
- content.select("[data-togglable=DEFAULT/native]").single().match("aa+", Br, "ee+")
- content.select("[data-togglable=DEFAULT/js]").single().match("bdbd+")
- content.select("[data-togglable=DEFAULT/jvm]").single().match("c")
- }
-
- @Test
- fun divergentSameBefore() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("b")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.select("[data-togglable=DEFAULT/native]").single().match("ab-ab")
- }
-
- @Test
- fun divergentSameAfter() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- after {
- text("ab+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- divergent {
- text("b")
- }
- after {
- text("ab+")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.select("[data-togglable=DEFAULT/native]").single().match("abab+")
- }
-
- @Test
- fun divergentGroupedByBeforeAndAfter() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("a")
- }
- after {
- text("ab+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("b")
- }
- after {
- text("ab+")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.select("[data-togglable=DEFAULT/native]").single().match("ab-abab+")
- }
-
- @Test
- fun divergentDifferentBeforeAndAfter() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- before {
- text("a-")
- }
- divergent {
- text("a")
- }
- after {
- text("ab+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- before {
- text("b-")
- }
- divergent {
- text("b")
- }
- after {
- text("ab+")
- }
- }
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.select("[data-togglable=DEFAULT/native]").single().match("a-aab+", Br, "b-bab+")
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/FooterMessageTest.kt b/plugins/base/src/test/kotlin/renderers/html/FooterMessageTest.kt
deleted file mode 100644
index 149f970c..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/FooterMessageTest.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.DokkaBaseConfiguration.Companion.defaultFooterMessage
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import renderers.testPage
-import utils.A
-import utils.Span
-import utils.match
-import kotlin.test.Test
-
-class FooterMessageTest : HtmlRenderingOnlyTestBase() {
- @Test
- fun `should include defaultFooter`() {
- val page = testPage { }
- HtmlRenderer(context).render(page)
- renderedContent.match(
- Span(A()),
- Span(defaultFooterMessage),
- Span(Span("Generated by "), A(Span("dokka"), Span()))
- )
- }
-
- override val renderedContent: Element
- get() = files.contents.getValue("test-page.html").let { Jsoup.parse(it) }.select(".footer").single()
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/FormattingUtilsTest.kt b/plugins/base/src/test/kotlin/renderers/html/FormattingUtilsTest.kt
deleted file mode 100644
index 028ffa77..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/FormattingUtilsTest.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import kotlinx.html.body
-import kotlinx.html.html
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.base.renderers.html.buildBreakableText
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class FormattingUtilsTest {
- @Test
- fun `should build breakable text`(){
- val testedText = "kotlinx.collections.immutable"
- val expectedHtml = """
- <html>
- <body><span>kotlinx.</span><wbr></wbr><span>collections.</span><wbr></wbr><span>immutable</span></body>
- </html>
- """.trimIndent()
-
- val html = createHTML(prettyPrint = true).html {
- body {
- buildBreakableText(testedText)
- }
- }
-
- assertEquals(expectedHtml.trim(), html.trim())
- }
-
- @Test
- fun `should build breakable text without empty spans`(){
- val testedText = "Package org.jetbrains.dokka.it.moduleC"
- val expectedHtml = """
- <html>
- <body><span><span>Package</span></span> <span>org.</span><wbr></wbr><span>jetbrains.</span><wbr></wbr><span>dokka.</span><wbr></wbr><span>it.</span><wbr></wbr><span>moduleC</span></body>
- </html>
- """.trimIndent()
-
- val html = createHTML(prettyPrint = true).html {
- body {
- buildBreakableText(testedText)
- }
- }
-
- assertEquals(expectedHtml.trim(), html.trim())
- }
-
- @Test
- fun `should build breakable text for text with braces`(){
- val testedText = "[Common]kotlinx.collections.immutable"
- val expectedHtml = """
- <html>
- <body><span>[Common]kotlinx.</span><wbr></wbr><span>collections.</span><wbr></wbr><span>immutable</span></body>
- </html>
- """.trimIndent()
-
- val html = createHTML(prettyPrint = true).html {
- body {
- buildBreakableText(testedText)
- }
- }
-
- assertEquals(expectedHtml.trim(), html.trim())
- }
-
- @Test
- fun `should build breakable text for camel case notation`(){
- val testedText = "DokkkkkkkaIsTheBest"
- val expectedHtml = """
- <html>
- <body><span>Dokkkkkkka</span><wbr></wbr><span>Is</span><wbr></wbr><span>The</span><wbr></wbr><span><span>Best</span></span></body>
- </html>
- """.trimIndent()
-
- val html = createHTML(prettyPrint = true).html {
- body {
- buildBreakableText(testedText)
- }
- }
-
- assertEquals(expectedHtml.trim(), html.trim())
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt b/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt
deleted file mode 100644
index cc9b763d..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.pages.TextStyle
-import renderers.testPage
-import utils.Div
-import utils.P
-import utils.match
-import kotlin.test.Test
-
-class GroupWrappingTest : HtmlRenderingOnlyTestBase() {
-
- @Test
- fun notWrapped() {
- val page = testPage {
- group {
- text("a")
- text("b")
- }
- text("c")
- }
-
- HtmlRenderer(context).render(page)
-
- renderedContent.match("abc")
- }
-
- @Test
- fun paragraphWrapped() {
- val page = testPage {
- group(styles = setOf(TextStyle.Paragraph)) {
- text("a")
- text("b")
- }
- text("c")
- }
-
- HtmlRenderer(context).render(page)
-
- renderedContent.match(P("ab"), "c")
- }
-
- @Test
- fun blockWrapped() {
- val page = testPage {
- group(styles = setOf(TextStyle.Block)) {
- text("a")
- text("b")
- }
- text("c")
- }
-
- HtmlRenderer(context).render(page)
-
- renderedContent.match(Div("ab"), "c")
- }
-
- @Test
- fun nested() {
- val page = testPage {
- group(styles = setOf(TextStyle.Block)) {
- text("a")
- group(styles = setOf(TextStyle.Block)) {
- group(styles = setOf(TextStyle.Block)) {
- text("b")
- text("c")
- }
- }
- text("d")
- }
- }
-
- HtmlRenderer(context).render(page)
-
- renderedContent.match(Div("a", Div(Div("bc")), "d"))
- }
-
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/HeaderTest.kt b/plugins/base/src/test/kotlin/renderers/html/HeaderTest.kt
deleted file mode 100644
index c19f965f..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/HeaderTest.kt
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jsoup.Jsoup
-import utils.TestOutputWriter
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-class HeaderTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- name = "jvm"
- sourceRoots = listOf("src/jvm")
- }
- sourceSet {
- name = "js"
- sourceRoots = listOf("src/js")
- }
- }
- }
-
- @Test
- fun `should include homepage link if homepageLink is provided`() {
- testRendering(
- DokkaBaseConfiguration(homepageLink = "https://github.com/Kotlin/dokka/")
- ) { _, _, writer ->
- val renderedContent = navigationElement(writer)
-
- val sourceLinkElement =
- assertNotNull(renderedContent.getElementById("homepage-link"), "Source link element not found")
- val aElement = assertNotNull(sourceLinkElement.selectFirst("a"))
- assertEquals("https://github.com/Kotlin/dokka/", aElement.attr("href"))
- }
- }
-
- @Test
- fun `should not include homepage link by default`() {
- testRendering(null) { _, _, writer ->
- val renderedContent = navigationElement(writer)
- assertNull(renderedContent.getElementById("homepage-link"), "Source link element found")
- }
- }
-
- private fun testRendering(
- baseConfiguration: DokkaBaseConfiguration?,
- block: (RootPageNode, DokkaContext, writer: TestOutputWriter) -> Unit
- ) {
- fun configuration(): DokkaConfigurationImpl {
- baseConfiguration ?: return configuration
- return configuration.copy(
- pluginsConfiguration = listOf(
- PluginConfigurationImpl(
- DokkaBase::class.java.canonicalName,
- DokkaConfiguration.SerializationFormat.JSON,
- toJsonString(baseConfiguration)
- )
- )
- )
- }
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/jvm/Test.kt
- |fun test() {}
- |/src/js/Test.kt
- |fun test() {}
- """,
- configuration(),
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { node, context ->
- block(node, context, writerPlugin.writer)
- }
- }
- }
-
- private fun navigationElement(writer: TestOutputWriter) =
- writer
- .contents
- .getValue("index.html")
- .let(Jsoup::parse)
- .select(".navigation")
- .single()
-
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/HtmlRenderingOnlyTestBase.kt b/plugins/base/src/test/kotlin/renderers/html/HtmlRenderingOnlyTestBase.kt
deleted file mode 100644
index 4e098371..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/HtmlRenderingOnlyTestBase.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.RootCreator
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.external.javadoc.JavadocExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProviderFactory
-import org.jetbrains.dokka.testApi.context.MockContext
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import renderers.RenderingOnlyTestBase
-import testApi.testRunner.defaultSourceSet
-import utils.TestOutputWriter
-import java.io.File
-
-abstract class HtmlRenderingOnlyTestBase : RenderingOnlyTestBase<Element>() {
-
- protected val js = defaultSourceSet.copy(
- "JS",
- defaultSourceSet.sourceSetID.copy(sourceSetName = "js"),
- analysisPlatform = Platform.js,
- sourceRoots = setOf(File("pl1"))
- )
- protected val jvm = defaultSourceSet.copy(
- "JVM",
- defaultSourceSet.sourceSetID.copy(sourceSetName = "jvm"),
-
- analysisPlatform = Platform.jvm,
- sourceRoots = setOf(File("pl1"))
- )
- protected val native = defaultSourceSet.copy(
- "NATIVE",
- defaultSourceSet.sourceSetID.copy(sourceSetName = "native"),
- analysisPlatform = Platform.native,
- sourceRoots = setOf(File("pl1"))
- )
-
- val files = TestOutputWriter()
-
- open val configuration = DokkaConfigurationImpl(
- sourceSets = listOf(js, jvm, native),
- finalizeCoroutines = false
- )
-
- override val context = MockContext(
- DokkaBase().outputWriter to { files },
- DokkaBase().locationProviderFactory to ::DokkaLocationProviderFactory,
- DokkaBase().htmlPreprocessors to { RootCreator },
- DokkaBase().externalLocationProviderFactory to ::JavadocExternalLocationProviderFactory,
- DokkaBase().externalLocationProviderFactory to ::DefaultExternalLocationProviderFactory,
- testConfiguration = configuration
- )
-
- override val renderedContent: Element by lazy {
- files.contents.getValue("test-page.html").let { Jsoup.parse(it) }.select("#content").single()
- }
-
- protected fun linesAfterContentTag() =
- files.contents.getValue("test-page.html").lines()
- .dropWhile { !it.contains("""<div id="content">""") }
- .joinToString(separator = "") { it.trim() }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/ListStylesTest.kt b/plugins/base/src/test/kotlin/renderers/html/ListStylesTest.kt
deleted file mode 100644
index f8afb54c..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/ListStylesTest.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.pages.ListStyle
-import renderers.testPage
-import utils.Dd
-import utils.Dl
-import utils.Dt
-import utils.match
-import kotlin.test.Test
-
-
-class ListStylesTest : HtmlRenderingOnlyTestBase() {
-
- @Test
- fun `description list render`() {
- val page = testPage {
- descriptionList {
- item(styles = setOf(ListStyle.DescriptionTerm)) {
- text("Description term #1")
- }
- item(styles = setOf(ListStyle.DescriptionTerm)) {
- text("Description term #2")
- }
- item(styles = setOf(ListStyle.DescriptionDetails)) {
- text("Description details describing terms #1 and #2")
- }
- }
- }
-
-
- HtmlRenderer(context).render(page)
- renderedContent.match(
- Dl(
- Dt("Description term #1"),
- Dt("Description term #2"),
- Dd("Description details describing terms #1 and #2")
- )
- )
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/NavigationIconTest.kt b/plugins/base/src/test/kotlin/renderers/html/NavigationIconTest.kt
deleted file mode 100644
index d57f84df..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/NavigationIconTest.kt
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import utils.TestOutputWriterPlugin
-import utils.navigationHtml
-import utils.selectNavigationGrid
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class NavigationIconTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- @Test
- fun `should include all navigation icons`() {
- val source = """
- |/src/main/kotlin/com/example/Empty.kt
- |package com.example
- |
- |class Empty {}
- """
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val navIconAssets = writerPlugin.writer.contents
- .filterKeys { it.startsWith("images/nav-icons") }
- .keys.sorted()
-
- assertEquals(16, navIconAssets.size)
- assertEquals("images/nav-icons/abstract-class-kotlin.svg", navIconAssets[0])
- assertEquals("images/nav-icons/abstract-class.svg", navIconAssets[1])
- assertEquals("images/nav-icons/annotation-kotlin.svg", navIconAssets[2])
- assertEquals("images/nav-icons/annotation.svg", navIconAssets[3])
- assertEquals("images/nav-icons/class-kotlin.svg", navIconAssets[4])
- assertEquals("images/nav-icons/class.svg", navIconAssets[5])
- assertEquals("images/nav-icons/enum-kotlin.svg", navIconAssets[6])
- assertEquals("images/nav-icons/enum.svg", navIconAssets[7])
- assertEquals("images/nav-icons/exception-class.svg", navIconAssets[8])
- assertEquals("images/nav-icons/field-value.svg", navIconAssets[9])
- assertEquals("images/nav-icons/field-variable.svg", navIconAssets[10])
- assertEquals("images/nav-icons/function.svg", navIconAssets[11])
- assertEquals("images/nav-icons/interface-kotlin.svg", navIconAssets[12])
- assertEquals("images/nav-icons/interface.svg", navIconAssets[13])
- assertEquals("images/nav-icons/object.svg", navIconAssets[14])
- assertEquals("images/nav-icons/typealias-kotlin.svg", navIconAssets[15])
- }
- }
- }
-
- @Test
- fun `should add icon styles to kotlin class navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("class Clazz {}"),
- expectedIconClass = "class-kt",
- expectedNavLinkText = "Clazz"
- )
- }
-
- @Test
- fun `should add icon styles to java class navigation item`() {
- assertNavigationIcon(
- source = javaSource(
- className = "JavaClazz",
- source = "public class JavaClazz {}"
- ),
- expectedIconClass = "class",
- expectedNavLinkText = "JavaClazz"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin abstract class navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("abstract class AbstractClazz {}"),
- expectedIconClass = "abstract-class-kt",
- expectedNavLinkText = "AbstractClazz"
- )
- }
-
- @Test
- fun `should add icon styles to java abstract class navigation item`() {
- assertNavigationIcon(
- source = javaSource(
- className = "AbstractJavaClazz",
- source = "public abstract class AbstractJavaClazz {}"
- ),
- expectedIconClass = "abstract-class",
- expectedNavLinkText = "AbstractJavaClazz"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin typealias navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("typealias KotlinTypealias = String"),
- expectedIconClass = "typealias-kt",
- expectedNavLinkText = "KotlinTypealias"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin enum navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("enum class KotlinEnum {}"),
- expectedIconClass = "enum-class-kt",
- expectedNavLinkText = "KotlinEnum"
- )
- }
-
- @Test
- fun `should add icon styles to java enum class navigation item`() {
- assertNavigationIcon(
- source = javaSource(
- className = "JavaEnum",
- source = "public enum JavaEnum {}"
- ),
- expectedIconClass = "enum-class",
- expectedNavLinkText = "JavaEnum"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin annotation navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("annotation class KotlinAnnotation"),
- expectedIconClass = "annotation-class-kt",
- expectedNavLinkText = "KotlinAnnotation"
- )
- }
-
- @Test
- fun `should add icon styles to java annotation navigation item`() {
- assertNavigationIcon(
- source = javaSource(
- className = "JavaAnnotation",
- source = "public @interface JavaAnnotation {}"
- ),
- expectedIconClass = "annotation-class",
- expectedNavLinkText = "JavaAnnotation"
- )
- }
-
-
- @Test
- fun `should add icon styles to kotlin interface navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("interface KotlinInterface"),
- expectedIconClass = "interface-kt",
- expectedNavLinkText = "KotlinInterface"
- )
- }
-
- @Test
- fun `should add icon styles to java interface navigation item`() {
- assertNavigationIcon(
- source = javaSource(
- className = "JavaInterface",
- source = "public interface JavaInterface {}"
- ),
- expectedIconClass = "interface",
- expectedNavLinkText = "JavaInterface"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin function navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("fun ktFunction() {}"),
- expectedIconClass = "function",
- expectedNavLinkText = "ktFunction()"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin exception class navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("class KotlinException : Exception() {}"),
- expectedIconClass = "exception-class",
- expectedNavLinkText = "KotlinException"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin object navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("object KotlinObject {}"),
- expectedIconClass = "object",
- expectedNavLinkText = "KotlinObject"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin val navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("val value: String? = null"),
- expectedIconClass = "val",
- expectedNavLinkText = "value"
- )
- }
-
- @Test
- fun `should add icon styles to kotlin var navigation item`() {
- assertNavigationIcon(
- source = kotlinSource("var variable: String? = null"),
- expectedIconClass = "var",
- expectedNavLinkText = "variable"
- )
- }
-
- private fun kotlinSource(source: String): String {
- return """
- |/src/main/kotlin/com/example/Example.kt
- |package com.example
- |
- |$source
- """.trimIndent()
- }
-
- private fun javaSource(className: String, source: String): String {
- return """
- |/src/main/java/com/example/$className.java
- |package com.example;
- |
- |$source
- """.trimIndent()
- }
-
- private fun assertNavigationIcon(source: String, expectedIconClass: String, expectedNavLinkText: String) {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
- val navigationGrid = content.selectNavigationGrid()
-
- val classNames = navigationGrid.child(0).classNames().toList()
- assertEquals("nav-link-child", classNames[0])
- assertEquals("nav-icon", classNames[1])
- assertEquals(expectedIconClass, classNames[2])
-
- val navLinkText = navigationGrid.child(1).text()
- assertEquals(expectedNavLinkText, navLinkText)
- }
- }
- }
-
- @Test
- fun `should not generate nav link grids or icons for packages and modules`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/com/example/Example.kt
- |package com.example
- |
- |class Example {}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
-
- assertEquals(3, content.size)
- assertEquals("root-nav-submenu", content[0].id())
- assertEquals("root-nav-submenu-0", content[1].id())
- assertEquals("root-nav-submenu-0-0", content[2].id())
-
- // there's 3 nav items, but only one icon
- val navLinkGrids = content.select("span.nav-icon")
- assertEquals(1, navLinkGrids.size)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/NavigationTest.kt b/plugins/base/src/test/kotlin/renderers/html/NavigationTest.kt
deleted file mode 100644
index 02074810..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/NavigationTest.kt
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.renderers.html.NavigationNodeIcon
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jsoup.nodes.Element
-import utils.TestOutputWriterPlugin
-import utils.navigationHtml
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-class NavigationTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- @Test
- fun `should sort alphabetically ignoring case`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/com/example/Sequences.kt
- |package com.example
- |
- |fun <T> sequence(): Sequence<T>
- |
- |fun <T> Sequence(): Sequence<T>
- |
- |fun <T> Sequence<T>.any() {}
- |
- |interface Sequence<T>
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
- assertEquals(6, content.size)
-
- // Navigation menu should be the following:
- // - root
- // - com.example
- // - any()
- // - Sequence interface
- // - Sequence()
- // - sequence()
-
- content[0].assertNavigationLink(
- id = "root-nav-submenu",
- text = "root",
- address = "index.html",
- )
-
- content[1].assertNavigationLink(
- id = "root-nav-submenu-0",
- text = "com.example",
- address = "root/com.example/index.html",
- )
-
- content[2].assertNavigationLink(
- id = "root-nav-submenu-0-0",
- text = "any()",
- address = "root/com.example/any.html",
- icon = NavigationNodeIcon.FUNCTION
- )
-
- content[3].assertNavigationLink(
- id = "root-nav-submenu-0-1",
- text = "Sequence",
- address = "root/com.example/-sequence/index.html",
- icon = NavigationNodeIcon.INTERFACE_KT
- )
-
- content[4].assertNavigationLink(
- id = "root-nav-submenu-0-2",
- text = "Sequence()",
- address = "root/com.example/-sequence.html",
- icon = NavigationNodeIcon.FUNCTION
- )
-
- content[5].assertNavigationLink(
- id = "root-nav-submenu-0-3",
- text = "sequence()",
- address = "root/com.example/sequence.html",
- icon = NavigationNodeIcon.FUNCTION
- )
- }
- }
- }
-
- @Test
- fun `should strike deprecated class link`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/com/example/SimpleDeprecatedClass.kt
- |package com.example
- |
- |@Deprecated("reason")
- |class SimpleDeprecatedClass {}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
- assertEquals(3, content.size)
-
- // Navigation menu should be the following:
- // - root
- // - com.example
- // - SimpleDeprecatedClass
-
- content[0].assertNavigationLink(
- id = "root-nav-submenu",
- text = "root",
- address = "index.html",
- )
-
- content[1].assertNavigationLink(
- id = "root-nav-submenu-0",
- text = "com.example",
- address = "root/com.example/index.html",
- )
-
- content[2].assertNavigationLink(
- id = "root-nav-submenu-0-0",
- text = "SimpleDeprecatedClass",
- address = "root/com.example/-simple-deprecated-class/index.html",
- icon = NavigationNodeIcon.CLASS_KT,
- isStrikethrough = true
- )
- }
- }
- }
-
- @Test
- fun `should not strike pages where only one of N documentables is deprecated`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/com/example/File.kt
- |package com.example
- |
- |/**
- | * First
- | */
- |@Deprecated("reason")
- |fun functionWithCommonName()
- |
- |/**
- | * Second
- | */
- |fun functionWithCommonName()
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
- assertEquals(3, content.size)
-
- // Navigation menu should be the following:
- // - root
- // - com.example
- // - functionWithCommonName
-
- content[0].assertNavigationLink(
- id = "root-nav-submenu",
- text = "root",
- address = "index.html",
- )
-
- content[1].assertNavigationLink(
- id = "root-nav-submenu-0",
- text = "com.example",
- address = "root/com.example/index.html",
- )
-
- content[2].assertNavigationLink(
- id = "root-nav-submenu-0-0",
- text = "functionWithCommonName()",
- address = "root/com.example/function-with-common-name.html",
- icon = NavigationNodeIcon.FUNCTION,
- isStrikethrough = false
- )
- }
- }
- }
-
- @Test
- fun `should have expandable classlikes`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/com/example/WithInner.kt
- |package com.example
- |
- |class WithInner {
- | // in-class functions should not be in navigation
- | fun a() {}
- | fun b() {}
- | fun c() {}
- |
- | class InnerClass {}
- | interface InnerInterface {}
- | enum class InnerEnum {}
- | object InnerObject {}
- | annotation class InnerAnnotation {}
- | companion object CompanionObject {}
- |}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
- assertEquals(9, content.size)
-
- // Navigation menu should be the following, sorted by name:
- // - root
- // - com.example
- // - WithInner
- // - CompanionObject
- // - InnerAnnotation
- // - InnerClass
- // - InnerEnum
- // - InnerInterface
- // - InnerObject
-
- content[0].assertNavigationLink(
- id = "root-nav-submenu",
- text = "root",
- address = "index.html",
- )
-
- content[1].assertNavigationLink(
- id = "root-nav-submenu-0",
- text = "com.example",
- address = "root/com.example/index.html",
- )
-
- content[2].assertNavigationLink(
- id = "root-nav-submenu-0-0",
- text = "WithInner",
- address = "root/com.example/-with-inner/index.html",
- icon = NavigationNodeIcon.CLASS_KT
- )
-
- content[3].assertNavigationLink(
- id = "root-nav-submenu-0-0-0",
- text = "CompanionObject",
- address = "root/com.example/-with-inner/-companion-object/index.html",
- icon = NavigationNodeIcon.OBJECT
- )
-
- content[4].assertNavigationLink(
- id = "root-nav-submenu-0-0-1",
- text = "InnerAnnotation",
- address = "root/com.example/-with-inner/-inner-annotation/index.html",
- icon = NavigationNodeIcon.ANNOTATION_CLASS_KT
- )
-
- content[5].assertNavigationLink(
- id = "root-nav-submenu-0-0-2",
- text = "InnerClass",
- address = "root/com.example/-with-inner/-inner-class/index.html",
- icon = NavigationNodeIcon.CLASS_KT
- )
-
- content[6].assertNavigationLink(
- id = "root-nav-submenu-0-0-3",
- text = "InnerEnum",
- address = "root/com.example/-with-inner/-inner-enum/index.html",
- icon = NavigationNodeIcon.ENUM_CLASS_KT
- )
-
- content[7].assertNavigationLink(
- id = "root-nav-submenu-0-0-4",
- text = "InnerInterface",
- address = "root/com.example/-with-inner/-inner-interface/index.html",
- icon = NavigationNodeIcon.INTERFACE_KT
- )
-
- content[8].assertNavigationLink(
- id = "root-nav-submenu-0-0-5",
- text = "InnerObject",
- address = "root/com.example/-with-inner/-inner-object/index.html",
- icon = NavigationNodeIcon.OBJECT
- )
- }
- }
- }
-
- @Test
- fun `should be able to have deeply nested classlikes`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/com/example/DeeplyNested.kt
- |package com.example
- |
- |class DeeplyNested {
- | class FirstLevelClass {
- | interface SecondLevelInterface {
- | object ThirdLevelObject {
- | annotation class FourthLevelAnnotation {}
- | }
- | }
- | }
- |}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.writer.navigationHtml().select("div.sideMenuPart")
- assertEquals(7, content.size)
-
- // Navigation menu should be the following
- // - root
- // - com.example
- // - DeeplyNested
- // - FirstLevelClass
- // - SecondLevelInterface
- // - ThirdLevelObject
- // - FourthLevelAnnotation
-
- content[0].assertNavigationLink(
- id = "root-nav-submenu",
- text = "root",
- address = "index.html",
- )
-
- content[1].assertNavigationLink(
- id = "root-nav-submenu-0",
- text = "com.example",
- address = "root/com.example/index.html",
- )
-
- content[2].assertNavigationLink(
- id = "root-nav-submenu-0-0",
- text = "DeeplyNested",
- address = "root/com.example/-deeply-nested/index.html",
- icon = NavigationNodeIcon.CLASS_KT
- )
-
- content[3].assertNavigationLink(
- id = "root-nav-submenu-0-0-0",
- text = "FirstLevelClass",
- address = "root/com.example/-deeply-nested/-first-level-class/index.html",
- icon = NavigationNodeIcon.CLASS_KT
- )
-
- content[4].assertNavigationLink(
- id = "root-nav-submenu-0-0-0-0",
- text = "SecondLevelInterface",
- address = "root/com.example/-deeply-nested/-first-level-class/-second-level-interface/index.html",
- icon = NavigationNodeIcon.INTERFACE_KT
- )
-
- content[5].assertNavigationLink(
- id = "root-nav-submenu-0-0-0-0-0",
- text = "ThirdLevelObject",
- address = "root/com.example/-deeply-nested/-first-level-class/-second-level-interface/" +
- "-third-level-object/index.html",
- icon = NavigationNodeIcon.OBJECT
- )
-
- content[6].assertNavigationLink(
- id = "root-nav-submenu-0-0-0-0-0-0",
- text = "FourthLevelAnnotation",
- address = "root/com.example/-deeply-nested/-first-level-class/-second-level-interface/" +
- "-third-level-object/-fourth-level-annotation/index.html",
- icon = NavigationNodeIcon.ANNOTATION_CLASS_KT
- )
- }
- }
- }
-
- private fun Element.assertNavigationLink(
- id: String, text: String, address: String, icon: NavigationNodeIcon? = null, isStrikethrough: Boolean = false
- ) {
- assertEquals(id, this.id())
-
- val link = this.selectFirst("a")
- assertNotNull(link)
- assertEquals(text, link.text())
- assertEquals(address, link.attr("href"))
- if (icon != null) {
- val iconStyles =
- this.selectFirst("div.overview span.nav-link-grid")?.child(0)?.classNames()?.toList() ?: emptyList()
- assertEquals(3, iconStyles.size)
- assertEquals("nav-link-child", iconStyles[0])
- assertEquals(icon.style(), "${iconStyles[1]} ${iconStyles[2]}")
- }
- if (isStrikethrough) {
- val textInsideStrikethrough = link.selectFirst("strike")?.text()
- assertEquals(text, textInsideStrikethrough)
- } else {
- assertNull(link.selectFirst("strike"))
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/SearchbarDataInstallerTest.kt b/plugins/base/src/test/kotlin/renderers/html/SearchbarDataInstallerTest.kt
deleted file mode 100644
index a5f5feb5..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/SearchbarDataInstallerTest.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import utils.TestOutputWriterPlugin
-import utils.pagesJson
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class SearchbarDataInstallerTest: BaseAbstractTest() {
-
- @Test // see #2289
- fun `should display description of root declarations without a leading dot`() {
- val configuration = dokkaConfiguration {
- moduleName = "Dokka Module"
-
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/kotlin/Test.kt")
- }
- }
- }
-
- val source = """
- |/src/kotlin/Test.kt
- |
- |class Test
- |
- """.trimIndent()
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val searchRecords = writerPlugin.writer.pagesJson()
-
- assertEquals(
- "Test",
- searchRecords.find { record -> record.name == "class Test" }?.description ?: ""
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt b/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt
deleted file mode 100644
index e3c28984..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.pages.TextStyle
-import renderers.testPage
-import testApi.testRunner.defaultSourceSet
-import utils.Div
-import utils.match
-import java.io.File
-import kotlin.test.Test
-
-class SourceSetDependentHintTest : HtmlRenderingOnlyTestBase() {
-
- private val pl1 = defaultSourceSet.copy(
- "pl1",
- defaultSourceSet.sourceSetID.copy(sourceSetName = "pl1"),
- analysisPlatform = Platform.js,
- sourceRoots = setOf(File("pl1"))
- )
- private val pl2 = defaultSourceSet.copy(
- "pl2",
- defaultSourceSet.sourceSetID.copy(sourceSetName = "pl2"),
- analysisPlatform = Platform.jvm,
- sourceRoots = setOf(File("pl1"))
- )
- private val pl3 = defaultSourceSet.copy(
- "pl3",
- defaultSourceSet.sourceSetID.copy(sourceSetName = "pl3"),
- analysisPlatform = Platform.native,
- sourceRoots = setOf(File("pl1"))
- )
-
- @Test
- fun platformIndependentCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2, pl3), styles = setOf(TextStyle.Block)) {
- text("a")
- text("b")
- text("c")
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div(Div("abc"))))
- }
-
- @Test
- fun completelyDivergentCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2, pl3), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1))
- text("b", sourceSets = setOf(pl2))
- text("c", sourceSets = setOf(pl3))
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div(Div("a")), Div(Div("b")), Div(Div("c"))))
- }
-
- @Test
- fun overlappingCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1))
- text("b", sourceSets = setOf(pl1, pl2))
- text("c", sourceSets = setOf(pl2))
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div(Div("ab")), Div(Div("bc"))))
- }
-
- @Test
- fun caseThatCanBeSimplified() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1, pl2))
- text("b", sourceSets = setOf(pl1))
- text("b", sourceSets = setOf(pl2))
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div(Div("ab"))))
- }
-
- @Test
- fun caseWithGroupBreakingSimplification() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2), styles = setOf(TextStyle.Block)) {
- group(styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1, pl2))
- text("b", sourceSets = setOf(pl1))
- }
- text("b", sourceSets = setOf(pl2))
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div(Div(Div("ab"))), Div(Div(Div("a"), "b"))))
- }
-
- @Test
- fun caseWithGroupNotBreakingSimplification() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2)) {
- group {
- text("a", sourceSets = setOf(pl1, pl2))
- text("b", sourceSets = setOf(pl1))
- }
- text("b", sourceSets = setOf(pl2))
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div("ab")))
- }
-
- @Test
- fun partiallyUnifiedCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2, pl3), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1))
- text("a", sourceSets = setOf(pl2))
- text("b", sourceSets = setOf(pl3))
- }
- }
-
- HtmlRenderer(context).render(page)
- renderedContent.match(Div(Div(Div("a")), Div(Div("b"))))
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/SourceSetFilterTest.kt b/plugins/base/src/test/kotlin/renderers/html/SourceSetFilterTest.kt
deleted file mode 100644
index b461bfcd..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/SourceSetFilterTest.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import signatures.renderedContent
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class SourceSetFilterTest : BaseAbstractTest() {
-
- @Test // see #3011
- fun `should separate multiple data-filterable attribute values with comma`() {
- val configuration = dokkaConfiguration {
- moduleName = "Dokka Module"
-
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/testing/Test.kt")
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jvmMain/kotlin/testing/Test.kt")
- }
- }
- }
-
- val source = """
- |/src/commonMain/kotlin/testing/Test.kt
- |package testing
- |
- |expect open class Test
- |
- |/src/jvmMain/kotlin/testing/Test.kt
- |package testing
- |
- |actual open class Test
- """.trimIndent()
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val packagePage = writerPlugin.writer.renderedContent("-dokka -module/testing/index.html")
-
- val testClassRow = packagePage
- .select("div[data-togglable=TYPE]")
- .select("div[class=table-row]")
- .single()
-
- assertEquals("Dokka Module/common,Dokka Module/jvm", testClassRow.attr("data-filterable-current"))
- assertEquals("Dokka Module/common,Dokka Module/jvm", testClassRow.attr("data-filterable-set"))
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/TabbedContentTest.kt b/plugins/base/src/test/kotlin/renderers/html/TabbedContentTest.kt
deleted file mode 100644
index 090127fd..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/TabbedContentTest.kt
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jsoup.nodes.Element
-import signatures.renderedContent
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class TabbedContentTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(commonStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- private fun Element.getTabbedRow(type: String) = select(".table-row[data-togglable=$type]")
- private fun Element.getTabbedTable(type: String) = select("div[data-togglable=$type] .table")
- private fun Element.getMainContentDataType() = selectFirst(".main-content")?.attr("data-page-type")
-
- @Test
- fun `should have correct tabbed content type`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- |val p = 0
- |fun foo() = 0
- |
- | class A(val d: Int = 0) {
- | class Success(): Result()
- | class Failed(): Result()
- |
- | fun fn() = 0
- | }
- |
- | fun A.fn() = 0
- | fun A.fn2() = 0
- | fun A.fn3() = 0
- | val A.p = 0
- | val A.p2 = 0
- """
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val classContent = writerPlugin.writer.renderedContent("root/example/-a/index.html")
- assertEquals(1, classContent.getTabbedTable("CONSTRUCTOR").size)
- assertEquals(1, classContent.getTabbedTable("PROPERTY").size)
- assertEquals(1, classContent.getTabbedTable("CONSTRUCTOR").size)
- assertEquals(1, classContent.getTabbedTable("FUNCTION").size)
- assertEquals(1, classContent.getTabbedTable("TYPE").size)
- assertEquals(3, classContent.getTabbedRow("EXTENSION_FUNCTION").size)
- assertEquals(2, classContent.getTabbedRow("EXTENSION_PROPERTY").size)
- assertEquals("classlike", classContent.getMainContentDataType())
-
- val packagePage = writerPlugin.writer.renderedContent("root/example/index.html")
- assertEquals(1, packagePage.getTabbedTable("TYPE").size)
- assertEquals(1, packagePage.getTabbedTable("PROPERTY").size)
- assertEquals(1, packagePage.getTabbedTable("FUNCTION").size)
- assertEquals(3, packagePage.getTabbedRow("EXTENSION_FUNCTION").size)
- assertEquals(2, packagePage.getTabbedRow("EXTENSION_PROPERTY").size)
- assertEquals("package", packagePage.getMainContentDataType())
- }
- }
- }
-
- @Test
- fun `should not have Types-tab where there are not types`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- |val p = 0
- |fun foo() = 0
- |
- |/src/main/kotlin/test/PackageTwo.kt
- |package example2
- |
- |class A
- """
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val packagePage = writerPlugin.writer.renderedContent("root/example/index.html")
- assertEquals(0, packagePage.select("*[data-togglable=TYPE]").size)
- assertEquals(1, packagePage.getTabbedTable("PROPERTY").size)
- assertEquals(1, packagePage.getTabbedTable("FUNCTION").size)
-
- val packagePage2 = writerPlugin.writer.renderedContent("root/example2/index.html")
- assertEquals(2, packagePage2.select("*[data-togglable=TYPE]").size)
- assertEquals(0, packagePage2.getTabbedTable("PROPERTY").size)
- assertEquals(0, packagePage2.getTabbedTable("FUNCTION").size)
- }
- }
- }
-
- @Test
- fun `should have correct order of members and extensions`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- |val p = 0
- |fun foo() = 0
- |
- |class A(val d: Int = 0) {
- | fun fn() = 0
- | fun a() = 0
- | fun g() = 0
- |}
- |
- | fun A.fn() = 0
- """
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val classContent = writerPlugin.writer.renderedContent("root/example/-a/index.html")
- val funTable = classContent.select("div[data-togglable=FUNCTION] .table")
- val orders =
- funTable.select(".table-row").map { it.attr("data-togglable") }
- assertEquals(listOf("", "", "EXTENSION_FUNCTION", ""), orders)
- val names =
- funTable.select(".main-subrow .inline-flex a").map { it.text() }
- assertEquals(listOf("a", "fn", "fn", "g"), names)
- }
- }
- }
-
- @Test
- fun `should have expected order of content types within a members tab`() {
- val source = """
- |/src/main/kotlin/test/Result.kt
- |package example
- |
- |class Result(val d: Int = 0) {
- | class Success(): Result()
- |
- | val isFailed = false
- | fun reset() = 0
- | fun String.extension() = 0
- |}
- """
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val classContent = writerPlugin.writer.renderedContent("root/example/-result/index.html")
- val tabSectionNames = classContent.select("div .tabs-section-body > div[data-togglable]")
- .map { it.attr("data-togglable") }
-
- val expectedOrder = listOf("CONSTRUCTOR", "TYPE", "PROPERTY", "FUNCTION")
-
- assertEquals(expectedOrder.size, tabSectionNames.size)
- expectedOrder.forEachIndexed { index, element ->
- assertEquals(element, tabSectionNames[index])
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt b/plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt
deleted file mode 100644
index 0ca4e245..00000000
--- a/plugins/base/src/test/kotlin/renderers/html/TextStylesTest.kt
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.html
-
-import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
-import org.jetbrains.dokka.pages.TextStyle
-import org.jetbrains.dokka.pages.TokenStyle
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import renderers.testPage
-import utils.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class TextStylesTest : HtmlRenderingOnlyTestBase() {
- @Test
- fun `should include bold`(){
- val page = testPage {
- text("bold text", styles = setOf(TextStyle.Bold))
- }
- HtmlRenderer(context).render(page)
- renderedContent.match(B("bold text"))
- }
-
- @Test
- fun `should include italics`(){
- val page = testPage {
- text("italics text", styles = setOf(TextStyle.Italic))
- }
- HtmlRenderer(context).render(page)
- renderedContent.match(I("italics text"))
- }
-
- @Test
- fun `should include strikethrought`(){
- val page = testPage {
- text("strike text", styles = setOf(TextStyle.Strikethrough))
- }
- HtmlRenderer(context).render(page)
- renderedContent.match(STRIKE("strike text"))
- }
-
- @Test
- fun `should include token styles`(){
- val page = testPage {
- text("keyword", styles = setOf(TokenStyle.Keyword))
- }
- HtmlRenderer(context).render(page)
- renderedContent.match(Span("keyword"))
- val lastChild = renderedContent.children().last() ?: throw IllegalStateException("No element found")
- assertEquals(lastChild.attr("class"), "token keyword")
- }
-
- @Test
- fun `should include multiple styles at one`(){
- val page = testPage {
- text(
- "styled text",
- styles = setOf(
- TextStyle.Strikethrough,
- TextStyle.Bold,
- TextStyle.Indented,
- TextStyle.UnderCoverText,
- TextStyle.BreakableAfter
- )
- )
- }
- HtmlRenderer(context).render(page)
- renderedContent.match(STRIKE(B("styled text")))
- //Our dsl swallows nbsp so i manually check for it
- files.contents.getValue("test-page.html").contains("&nbsp;<strike><b>styled text</b></strike>")
- }
-
- @Test
- fun `should include blockquote`() {
- val page = testPage {
- group(styles = setOf(TextStyle.Quotation)) {
- text("blockquote text")
- }
- }
- HtmlRenderer(context).render(page)
- renderedContent.match(BlockQuote("blockquote text"))
- }
-
- @Test
- fun `should include var`() {
- val page = testPage {
- group(styles = setOf(TextStyle.Var)) {
- text("variable")
- }
- }
- HtmlRenderer(context).render(page)
- println(renderedContent)
- renderedContent.match(Var("variable"))
- }
-
- @Test
- fun `should include underlined text`() {
- val page = testPage {
- group(styles = setOf(TextStyle.Underlined)) {
- text("underlined text")
- }
- }
- HtmlRenderer(context).render(page)
- println(renderedContent)
- renderedContent.match(U("underlined text"))
- }
-
- override val renderedContent: Element
- get() = files.contents.getValue("test-page.html").let { Jsoup.parse(it) }.select("#content").single()
-}
diff --git a/plugins/base/src/test/kotlin/resourceLinks/ResourceLinksTest.kt b/plugins/base/src/test/kotlin/resourceLinks/ResourceLinksTest.kt
deleted file mode 100644
index c3302f70..00000000
--- a/plugins/base/src/test/kotlin/resourceLinks/ResourceLinksTest.kt
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package resourceLinks
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.renderers.html.TEMPLATE_REPLACEMENT
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jsoup.Jsoup
-import org.jsoup.nodes.TextNode
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.ValueSource
-import utils.TestOutputWriterPlugin
-import utils.assertContains
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
-
-class ResourceLinksTest : BaseAbstractTest() {
- class TestResourcesAppenderPlugin(val resources: List<String>) : DokkaPlugin() {
- class TestResourcesAppender(val resources: List<String>) : PageTransformer {
- override fun invoke(input: RootPageNode) = input.transformContentPagesTree {
- it.modified(
- embeddedResources = it.embeddedResources + resources
- )
- }
- }
-
- val appender by extending {
- plugin<DokkaBase>().htmlPreprocessors with TestResourcesAppender(resources)
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
- }
-
- @Test
- fun resourceLinksTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/test/Test.kt")
- }
- }
- }
- val absoluteResources = listOf(
- "https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css",
- "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
- )
- val relativeResources = listOf(
- "test/relativePath.js",
- "test/relativePath.css"
- )
-
- val source =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(TestResourcesAppenderPlugin(absoluteResources + relativeResources), writerPlugin)
- ) {
- renderingStage = { _, _ ->
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/example.html"))
- .head()
- .select("link, script")
- .let {
- absoluteResources.forEach { r ->
- assertTrue(it.`is`("[href=$r], [src=$r]"))
- }
- relativeResources.forEach { r ->
- assertTrue(it.`is`("[href=../$r] , [src=../$r]"))
- }
- }
- }
- }
- }
-
- @ParameterizedTest
- @ValueSource(booleans = [true, false])
- fun resourceCustomPreprocessorTest(isMultiModule: Boolean) {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/test/Test.kt")
- }
- }
- delayTemplateSubstitution = isMultiModule
- pluginsConfigurations = mutableListOf(
- PluginConfigurationImpl(
- DokkaBase::class.java.canonicalName,
- DokkaConfiguration.SerializationFormat.JSON,
- toJsonString(
- DokkaBaseConfiguration(
- customStyleSheets = listOf(File("test/customStyle.css")),
- customAssets = listOf(File("test/customImage.svg"))
- )
- )
- )
- )
- }
- val source =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- run {
- if (isMultiModule) {
- assertNull(writerPlugin.writer.contents["images/customImage.svg"])
- assertNull(writerPlugin.writer.contents["styles/customStyle.css"])
- } else {
- assertNotNull(writerPlugin.writer.contents["images/customImage.svg"])
- assertNotNull(writerPlugin.writer.contents["styles/customStyle.css"])
- }
- if (isMultiModule) {
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("example.html"))
- .head()
- .select("link, script")
- .let {
- listOf("styles/customStyle.css").forEach { r ->
- assertTrue(it.`is`("[href=$TEMPLATE_REPLACEMENT$r]"))
- }
- }
- } else {
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/example.html"))
- .head()
- .select("link, script")
- .let {
- listOf("styles/customStyle.css").forEach { r ->
- assertTrue(it.`is`("[href=../$r], [src=../$r]"))
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun resourceMultiModuleLinksTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/test/Test.kt")
- }
- }
- delayTemplateSubstitution = false
- }
- val absoluteResources = listOf(
- "https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css",
- "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
- )
- val relativeResources = listOf(
- "test/relativePath.js",
- "test/relativePath.css"
- )
-
- val source =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(TestResourcesAppenderPlugin(absoluteResources + relativeResources), writerPlugin)
- ) {
- renderingStage = { _, _ ->
- run {
- assertNull(writerPlugin.writer.contents["scripts/relativePath.js"])
- assertNull(writerPlugin.writer.contents["styles/relativePath.js"])
- Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/example.html"))
- .head()
- .select("link, script")
- .let {
- absoluteResources.forEach { r ->
- assertTrue(it.`is`("[href=$r], [src=$r]"))
- }
- relativeResources.forEach { r ->
- assertTrue(it.`is`("[href=../$r] , [src=../$r]"))
- }
- }
- }
- }
- }
- }
-
- @Test // see #3040; plain text added to <head> can be rendered by engines inside <body> as well
- fun `should not add unknown resources as text to the head or body section`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
-
- pluginsConfigurations = mutableListOf(
- PluginConfigurationImpl(
- DokkaBase::class.java.canonicalName,
- DokkaConfiguration.SerializationFormat.JSON,
- toJsonString(
- DokkaBaseConfiguration(
- customAssets = listOf(File("test/unknown-file.ext"))
- )
- )
- )
- )
- }
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |class Test
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val testClassPage = writerPlugin.writer.contents
- .getValue("root/test/-test/-test.html")
- .let { Jsoup.parse(it) }
-
- val headChildNodes = testClassPage.head().childNodes()
- assertTrue("<head> section should not contain non-blank text nodes") {
- headChildNodes.all { it !is TextNode || it.isBlank }
- }
-
- val bodyChildNodes = testClassPage.body().childNodes()
- assertTrue("<body> section should not contain non-blank text nodes. Something leaked from head?") {
- bodyChildNodes.all { it !is TextNode || it.isBlank }
- }
- }
- }
- }
-
- @Test
- fun `should load script as defer if name ending in _deferred`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/main/kotlin/test/Test.kt
- |package test
- |
- |class Test
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val generatedFiles = writerPlugin.writer.contents
-
- assertContains(generatedFiles.keys, "scripts/symbol-parameters-wrapper_deferred.js")
-
- val scripts = generatedFiles.getValue("root/test/-test/-test.html").let { Jsoup.parse(it) }.select("script")
- val deferredScriptSources = scripts.filter { element -> element.hasAttr("defer") }.map { it.attr("src") }
-
- // important to check symbol-parameters-wrapper_deferred specifically since it might break some features
- assertContains(deferredScriptSources, "../../../scripts/symbol-parameters-wrapper_deferred.js")
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/signatures/AbstractRenderingTest.kt b/plugins/base/src/test/kotlin/signatures/AbstractRenderingTest.kt
deleted file mode 100644
index 4c4bbc4c..00000000
--- a/plugins/base/src/test/kotlin/signatures/AbstractRenderingTest.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-import utils.TestOutputWriterPlugin
-import java.nio.file.Path
-import java.nio.file.Paths
-
-abstract class AbstractRenderingTest : BaseAbstractTest() {
- val testDataDir: Path = getTestDataDir("multiplatform/basicMultiplatformTest").toAbsolutePath()
-
- val configuration = dokkaConfiguration {
- moduleName = "example"
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf(Paths.get("$testDataDir/commonMain/kotlin").toString())
- }
- val jvmAndJsSecondCommonMain = sourceSet {
- name = "jvmAndJsSecondCommonMain"
- displayName = "jvmAndJsSecondCommonMain"
- analysisPlatform = "common"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmAndJsSecondCommonMain/kotlin").toString())
- }
- sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jsMain/kotlin").toString())
- }
- sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- dependentSourceSets = setOf(common.value.sourceSetID, jvmAndJsSecondCommonMain.value.sourceSetID)
- sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString())
- }
- }
- }
-
- fun TestOutputWriterPlugin.renderedContent(path: String): Element = writer.contents.getValue(path)
- .let { Jsoup.parse(it) }.select("#content").single()
-
- fun TestOutputWriterPlugin.renderedDivergentContent(path: String): Elements =
- renderedContent(path).select("div.divergent-group")
-
- fun TestOutputWriterPlugin.renderedSourceDependentContent(path: String): Elements =
- renderedContent(path).select("div.sourceset-dependent-content")
-
- val Element.brief: String
- get() = children().select("p").text()
-
- val Element.rawBrief: String
- get() = children().select("p").html()
-}
diff --git a/plugins/base/src/test/kotlin/signatures/DivergentSignatureTest.kt b/plugins/base/src/test/kotlin/signatures/DivergentSignatureTest.kt
deleted file mode 100644
index 509dd6e7..00000000
--- a/plugins/base/src/test/kotlin/signatures/DivergentSignatureTest.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-
-class DivergentSignatureTest : AbstractRenderingTest() {
-
- @Test
- fun `group { common + jvm + js }`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testFromData(
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.renderedSourceDependentContent("example/example/-clock/get-time.html")
-
- assertEquals(3, content.count())
- val sourceSets = listOf("example/common", "example/js", "example/jvm")
- sourceSets.forEach {
- assertEquals("", content.select("[data-togglable=$it]").single().brief)
- }
- }
- }
- }
-
- @Test
- fun `group { common + jvm }, group { js }`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testFromData(
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.renderedSourceDependentContent("example/example/-clock/get-times-in-millis.html")
-
- assertEquals(3, content.count())
- assertEquals("Time in minis", content.select("[data-togglable=example/common]").single().brief)
- assertEquals("Time in minis", content.select("[data-togglable=example/jvm]").single().brief)
- assertEquals("JS implementation of getTimeInMillis", content.select("[data-togglable=example/js]").single().brief)
- }
- }
- }
-
- @Test
- fun `group { js }, group { jvm }, group { js }`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testFromData(
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.renderedSourceDependentContent("example/example/-clock/get-year.html")
- assertEquals(3, content.count())
- assertEquals("JVM custom kdoc", content.select("[data-togglable=example/jvm]").single().brief)
- assertEquals("JS custom kdoc", content.select("[data-togglable=example/js]").single().brief)
- assertEquals("", content.select("[data-togglable=example/common]").single().brief)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt b/plugins/base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt
deleted file mode 100644
index 13d1947f..00000000
--- a/plugins/base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.jdk
-import utils.A
-import utils.Span
-import utils.TestOutputWriterPlugin
-import utils.match
-import kotlin.test.Ignore
-import kotlin.test.Test
-
-class FunctionalTypeConstructorsSignatureTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(commonStdlibPath!!, jvmStdlibPath!!)
- externalDocumentationLinks = listOf(
- stdlibExternalDocumentationLink,
- DokkaConfiguration.ExternalDocumentationLink.Companion.jdk(8)
- )
- }
- }
- }
-
- private val jvmConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(jvmStdlibPath ?: throw IllegalStateException("JVM stdlib is not found"))
- externalDocumentationLinks = listOf(
- stdlibExternalDocumentationLink,
- DokkaConfiguration.ExternalDocumentationLink.Companion.jdk(8)
- )
- }
- }
- }
-
- fun source(signature: String) =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | $signature
- """.trimIndent()
-
- @Test
- fun `kotlin normal function`() {
- val source = source("val nF: Function1<Int, String> = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": (", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar function`() {
- val source = source("val nF: (Int) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": (", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar extension function`() {
- val source = source("val nF: Boolean.(Int) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": ", A("Boolean"), ".(", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar function with param name`() {
- val source = source("val nF: (param: Int) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": (param: ", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar function with param name of generic and functional type`() {
- val source = source("""
- | @Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.TYPE)
- | @MustBeDocumented
- | annotation class Fancy
- |
- | fun <T> f(): (param1: T, param2: @Fancy ()->Unit) -> String "
- """.trimIndent())
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source, configuration, pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").lastSignature().match(
- "fun <", A("T"), "> ",
- A("f"), "(): (param1:", A("T"),
- ", param2: ", Span("@", A("Fancy")), " () -> ", A("Unit"),
- ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- @Ignore // Add coroutines on classpath and get proper import
- @Test
- fun `kotlin normal suspendable function`() {
- val source = source("val nF: SuspendFunction1<Int, String> = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": suspend (", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar suspendable function`() {
- val source = source("val nF: suspend (Int) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": suspend (", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar suspendable extension function`() {
- val source = source("val nF: suspend Boolean.(Int) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": suspend ", A("Boolean"), ".(", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar suspendable function with param name`() {
- val source = source("val nF: suspend (param: Int) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ", A("nF"), ": suspend (param: ", A("Int"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `kotlin syntactic sugar suspendable fancy function with param name`() {
- val source =
- source("val nF: suspend (param1: suspend Boolean.(param2: List<Int>) -> Boolean) -> String = { _ -> \"\" }")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "val ",
- A("nF"),
- ": suspend (param1: suspend",
- A("Boolean"),
- ".(param2: ",
- A("List"),
- "<",
- A("Int"),
- ">) -> ",
- A("Boolean"),
- ") -> ",
- A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `java with java function`() {
- val source = """
- |/src/main/kotlin/test/JavaClass.java
- |package example
- |
- |public class JavaClass {
- | public java.util.function.Function<Integer, String> javaFunction = null;
- |}
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-java-class/index.html").lastSignature().match(
- "open var ", A("javaFunction"), ": (", A("Integer"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `java with kotlin function`() {
- val source = """
- |/src/main/kotlin/test/JavaClass.java
- |package example
- |
- |public class JavaClass {
- | public kotlin.jvm.functions.Function1<Integer, String> kotlinFunction = null;
- |}
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- jvmConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-java-class/index.html").lastSignature().match(
- "open var ", A("kotlinFunction"), ": (", A("Integer"), ") -> ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/signatures/InheritedAccessorsSignatureTest.kt b/plugins/base/src/test/kotlin/signatures/InheritedAccessorsSignatureTest.kt
deleted file mode 100644
index b5e2a9c3..00000000
--- a/plugins/base/src/test/kotlin/signatures/InheritedAccessorsSignatureTest.kt
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import utils.A
-import utils.Span
-import utils.TestOutputWriterPlugin
-import utils.match
-import utils.OnlyDescriptors
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class InheritedAccessorsSignatureTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(
- commonStdlibPath ?: throw IllegalStateException("Common stdlib is not found"),
- jvmStdlibPath ?: throw IllegalStateException("JVM stdlib is not found")
- )
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- @OnlyDescriptors("'var' expected but found: 'open var'")
- @Test
- fun `should collapse accessor functions inherited from java into the property`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public int getA() { return a; }
- | public void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-b/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(
- 3, signatures.size,
- "Expected 3 signatures: class signature, constructor and property"
- )
-
- val property = signatures[2]
- property.match(
- "var ", A("a"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
-
- writerPlugin.writer.renderedContent("root/test/-a/index.html").let { javaClassContent ->
- val signatures = javaClassContent.signature().toList()
- assertEquals(
- 3, signatures.size,
- "Expected 3 signatures: class signature, default constructor and property"
- )
-
- val property = signatures[2]
- property.match(
- "open var ", A("a"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-
- @OnlyDescriptors("'var' expected but found: 'open var'")
- @Test
- fun `should render as val if inherited java property has no setter`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public int getA() { return a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-b/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(3, signatures.size, "Expected 3 signatures: class signature, constructor and property")
-
- val property = signatures[2]
- property.match(
- "val ", A("a"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
-
- writerPlugin.writer.renderedContent("root/test/-a/index.html").let { javaClassContent ->
- val signatures = javaClassContent.signature().toList()
- assertEquals(
- 3,
- signatures.size,
- "Expected 3 signatures: class signature, default constructor and property"
- )
-
- val property = signatures[2]
- property.match(
- "open val ", A("a"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-
- @Test
- fun `should keep inherited java setter as a regular function due to inaccessible property`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-b/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(3, signatures.size, "Expected 3 signatures: class signature, constructor and setter")
-
- val setterFunction = signatures[2]
- setterFunction.match(
- "open fun ", A("setA"), "(", Parameters(
- Parameter("a: ", A("Int"))
- ), ")",
- ignoreSpanWithTokenStyle = true
- )
- }
-
- writerPlugin.writer.renderedContent("root/test/-a/index.html").let { javaClassContent ->
- val signatures = javaClassContent.signature().toList()
- assertEquals(
- 3,
- signatures.size,
- "Expected 3 signatures: class signature, default constructor and setter"
- )
-
- val setterFunction = signatures[2]
- setterFunction.match(
- "open fun ", A("setA"), "(", Parameters(
- Parameter("a: ", A("Int"))
- ), ")",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-
- @OnlyDescriptors("'var' expected but found: 'open var'")
- @Test
- fun `should keep inherited java accessor lookalikes if underlying function is public`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | public int a = 1;
- | public int getA() { return a; }
- | public void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signatures = writerPlugin.writer.renderedContent("root/test/-b/index.html").signature().toList()
- assertEquals(
- 5, signatures.size,
- "Expected 5 signatures: class signature, constructor, property and two accessor lookalikes"
- )
-
- val getterLookalikeFunction = signatures[3]
- getterLookalikeFunction.match(
- "open fun ", A("getA"), "():", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
-
- val setterLookalikeFunction = signatures[4]
- setterLookalikeFunction.match(
- "open fun ", A("setA"), "(", Parameters(
- Parameter("a: ", A("Int"))
- ), ")",
- ignoreSpanWithTokenStyle = true
- )
-
- val property = signatures[2]
- property.match(
- "var ", A("a"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `should keep kotlin property with no accessors when java inherits kotlin a var`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/JavaClass.java
- |package test;
- |public class JavaClass extends KotlinClass {}
- |
- |/src/test/KotlinClass.kt
- |package test
- |open class KotlinClass {
- | var variable: String = "s"
- |}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-java-class/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(
- 3,
- signatures.size,
- "Expected to find 3 signatures: class, default constructor and property"
- )
-
- val property = signatures[2]
- property.match(
- "open var ", A("variable"), ": ", Span("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-
- @Test
- fun `kotlin property with compute get and set`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/JavaClass.java
- |package test;
- |public class JavaClass extends KotlinClass {}
- |
- |/src/test/KotlinClass.kt
- |package test
- |open class KotlinClass {
- | var variable: String
- | get() = "asd"
- | set(value) {}
- |}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-kotlin-class/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(3, signatures.size, "Expected to find 3 signatures: class, constructor and property")
-
- val property = signatures[2]
- property.match(
- "var ", A("variable"), ": ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
-
- // it's actually unclear how it should react in this situation. It should most likely not
- // break the abstraction and display it as a simple variable just like can be seen from Kotlin,
- // test added to control changes
- writerPlugin.writer.renderedContent("root/test/-java-class/index.html").let { javaClassContent ->
- val signatures = javaClassContent.signature().toList()
- assertEquals(
- 4,
- signatures.size,
- "Expected to find 4 signatures: class, default constructor and two accessors"
- )
-
- val getter = signatures[2]
- getter.match(
- "fun ", A("getVariable"), "(): ", Span("String"),
- ignoreSpanWithTokenStyle = true
- )
-
- val setter = signatures[3]
- setter.match(
- "fun ", A("setVariable"), "(", Parameters(
- Parameter("value: ", Span("String"))
- ), ")",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-
- @OnlyDescriptors("'var' expected but found: 'open var'")
- @Test
- fun `inherited property should inherit getter's visibility`() {
- val configWithProtectedVisibility = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(
- commonStdlibPath ?: throw IllegalStateException("Common stdlib is not found"),
- jvmStdlibPath ?: throw IllegalStateException("JVM stdlib is not found")
- )
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/JavaClass.java
- |package test;
- |public class JavaClass {
- | private int protectedGetterAndProtectedSetter = 0;
- |
- | protected int getProtectedGetterAndProtectedSetter() {
- | return protectedGetterAndProtectedSetter;
- | }
- |
- | protected void setProtectedGetterAndProtectedSetter(int protectedGetterAndProtectedSetter) {
- | this.protectedGetterAndProtectedSetter = protectedGetterAndProtectedSetter;
- | }
- |}
- |
- |/src/test/KotlinClass.kt
- |package test
- |open class KotlinClass : JavaClass() { }
- """.trimIndent(),
- configWithProtectedVisibility,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-kotlin-class/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(3, signatures.size, "Expected 3 signatures: class signature, constructor and property")
-
- val property = signatures[2]
- property.match(
- "protected var ", A("protectedGetterAndProtectedSetter"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
-
- writerPlugin.writer.renderedContent("root/test/-java-class/index.html").let { javaClassContent ->
- val signatures = javaClassContent.signature().toList()
- assertEquals(
- 3,
- signatures.size,
- "Expected 3 signatures: class signature, default constructor and property"
- )
-
- val property = signatures[2]
- property.match(
- "protected open var ", A("protectedGetterAndProtectedSetter"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-
- @OnlyDescriptors("'var' expected but found: 'open var'")
- @Test
- fun `should resolve protected java property as protected`() {
- val configWithProtectedVisibility = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(
- commonStdlibPath ?: throw IllegalStateException("Common stdlib is not found"),
- jvmStdlibPath ?: throw IllegalStateException("JVM stdlib is not found")
- )
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/JavaClass.java
- |package test;
- |public class JavaClass {
- | protected int protectedProperty = 0;
- |}
- |
- |/src/test/KotlinClass.kt
- |package test
- |open class KotlinClass : JavaClass() { }
- """.trimIndent(),
- configWithProtectedVisibility,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-kotlin-class/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(3, signatures.size, "Expected 2 signatures: class signature, constructor and property")
-
- val property = signatures[2]
- property.match(
- "protected var ", A("protectedProperty"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/signatures/ObviousTypeSkippingTest.kt b/plugins/base/src/test/kotlin/signatures/ObviousTypeSkippingTest.kt
deleted file mode 100644
index 71a0851b..00000000
--- a/plugins/base/src/test/kotlin/signatures/ObviousTypeSkippingTest.kt
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import matchers.content.assertNode
-import matchers.content.hasExactText
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.firstMemberOfType
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.testApi.logger.TestLogger
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.MethodSource
-import kotlin.reflect.KClass
-
-class ObviousTypeSkippingTest : BaseAbstractTest(
- logger = TestLogger(DokkaConsoleLogger(LoggingLevel.WARN))
-) {
-
- private fun source(signature: String) =
- """
- |/src/test.kt
- |package example
- |
- | $signature
- """.trimIndent()
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
-
- companion object TestDataSources {
- @JvmStatic
- fun `run tests for obvious types omitting`() = listOf(
- forFunction("fun underTest(): Int = 5", "fun underTest(): Int"),
- forFunction("fun underTest() = 5", "fun underTest(): Int"),
- forFunction("fun underTest() {}", "fun underTest()"),
- forFunction("fun underTest() = println(6)", "fun underTest()"),
- forFunction("fun underTest(): Unit = println(6)", "fun underTest()"),
- forFunction("fun underTest(): Unit? = if (true) println(6) else null", "fun underTest(): Unit?"),
- forFunction("fun underTest() = if (true) println(6) else null", "fun underTest(): Unit?"),
- forFunction("fun underTest(): Any = if (true) 7 else true", "fun underTest(): Any"),
- forFunction("fun underTest() = if (true) 7 else true", "fun underTest(): Any"),
- forFunction("fun underTest(): Any? = if (true) 7 else (null as String?)", "fun underTest(): Any?"),
- forFunction("fun underTest() = if (true) 7 else (null as String?)", "fun underTest(): Any?"),
- forFunction("fun underTest(arg: Int) {}", "fun underTest(arg: Int)"),
- forFunction("fun underTest(arg: Unit) {}", "fun underTest(arg: Unit)"),
- forFunction("fun <T: Iterable<Any>> underTest(arg: T) {}", "fun <T : Iterable<Any>> underTest(arg: T)"),
- forFunction("fun <T: Iterable<Any?>> underTest(arg: T) {}", "fun <T : Iterable<Any?>> underTest(arg: T)"),
- forFunction("fun <T> underTest(arg: T) {}", "fun <T> underTest(arg: T)"),
- forFunction("fun <T: Any> underTest(arg: T) {}", "fun <T : Any> underTest(arg: T)"),
- forFunction("fun <T: Any?> underTest(arg: T) {}", "fun <T> underTest(arg: T)"),
- forProperty("val underTest: Int = 5", "val underTest: Int = 5"),
- forProperty("val underTest = 5", "val underTest: Int = 5"),
- forProperty("val underTest: Unit = println(5)", "val underTest: Unit"),
- forProperty("val underTest = println(5)", "val underTest: Unit"),
- forProperty("val underTest: Unit? = if (true) println(5) else null", "val underTest: Unit?"),
- forProperty("val underTest = if (true) println(5) else null", "val underTest: Unit?"),
- forProperty("val underTest: Any = if (true) println(5) else 5", "val underTest: Any"),
- forProperty("val underTest = if (true) println(5) else 5", "val underTest: Any"),
- forExtension("fun <T: Iterable<Any>> T.underTest() {}", "fun <T : Iterable<Any>> T.underTest()"),
- forExtension("fun <T: Iterable<Any?>> T.underTest() {}", "fun <T : Iterable<Any?>> T.underTest()"),
- forExtension("fun <T: Iterable<Any?>?> T.underTest() {}", "fun <T : Iterable<Any?>?> T.underTest()"),
- forExtension("fun <T: Any> T.underTest() {}", "fun <T : Any> T.underTest()"),
- forExtension("fun <T: Any?> T.underTest() {}", "fun <T> T.underTest()"),
- forExtension("fun <T> T.underTest() {}", "fun <T> T.underTest()"),
- forClass("class Testable<T: Any>", "class Testable<T : Any>"),
- forClass("class Testable<T: Any?>", "class Testable<T>"),
- forClass("class Testable<T: Any?>(t: T)", "class Testable<T>(t: T)"),
- forClass("class Testable<T>", "class Testable<T>"),
- forClass("class Testable(butWhy: Unit)", "class Testable(butWhy: Unit)"),
- forMethod("class Testable { fun underTest(): Int = 5 }", "fun underTest(): Int"),
- forMethod("class Testable { fun underTest() = 5 }", "fun underTest(): Int"),
- forMethod("class Testable { fun underTest() {} }", "fun underTest()"),
- forMethod("class Testable { fun underTest() = println(6) }", "fun underTest()"),
- forMethod("class Testable { fun underTest(): Unit = println(6) }", "fun underTest()"),
- forMethod(
- "class Testable { fun underTest(): Unit? = if (true) println(6) else null }",
- "fun underTest(): Unit?"
- ),
- forClassProperty("class Testable { val underTest: Unit = println(5) }", "val underTest: Unit"),
- forClassProperty("class Testable { val underTest = println(5) }", "val underTest: Unit"),
- forClassProperty(
- "class Testable { val underTest: Unit? = if (true) println(5) else null }",
- "val underTest: Unit?"
- ),
- forClassProperty(
- "class Testable { val underTest = if (true) println(5) else null }",
- "val underTest: Unit?"
- ),
- forClassProperty(
- "class Testable { val underTest: Any = if (true) println(5) else 5 }",
- "val underTest: Any"
- ),
- forClassProperty("class Testable { val underTest = if (true) println(5) else 5 }", "val underTest: Any"),
- )
- }
-
- @ParameterizedTest(name = "{0}")
- @MethodSource
- fun `run tests for obvious types omitting`(testData: TestData) {
- val (codeFragment, expectedSignature, placesToTest) = testData
- testInline(
- query = source(codeFragment),
- configuration = configuration
- ) {
- pagesTransformationStage = { root ->
- placesToTest.forEach { place ->
- try {
- when (place) {
- is OnOwnPage ->
- root.firstMemberOfType<ContentPage> { it.name == place.name }.content
- .firstMemberOfType<ContentGroup> { it.dci.kind == ContentKind.Symbol }
- .assertNode { hasExactText(expectedSignature) }
- is OnParentPage ->
- root.firstMemberOfType<ContentPage> {
- place.pageType.isInstance(it) && (place.parentName.isNullOrBlank() || place.parentName == it.name)
- }
- .content
- .firstMemberOfType<ContentGroup> {
- it.dci.kind == place.section && (place.selfName.isNullOrBlank() ||
- it.dci.dri.toString().contains(place.selfName))
- }
- .firstMemberOfType<ContentGroup> { it.dci.kind == ContentKind.Symbol }
- .assertNode { hasExactText(expectedSignature) }
- }
- } catch (e: Throwable) {
- logger.warn("$testData") // Because gradle has serious problem rendering custom test names
- throw e
- }
- }
- }
- }
- }
-
-}
-
-sealed class Place
-data class OnOwnPage(val name: String) : Place()
-data class OnParentPage(
- val pageType: KClass<out ContentPage>,
- val section: Kind,
- val parentName: String? = null,
- val selfName: String? = null
-) : Place()
-
-data class TestData(
- val codeFragment: String,
- val expectedSignature: String,
- val placesToTest: Iterable<Place>
-) {
- constructor(codeFragment: String, expectedSignature: String, vararg placesToTest: Place)
- : this(codeFragment, expectedSignature, placesToTest.asIterable())
-
- override fun toString() = "[code = \"$codeFragment\"]"
-}
-
-private fun forFunction(codeFragment: String, expectedSignature: String, functionName: String = "underTest") =
- TestData(
- codeFragment,
- expectedSignature,
- OnParentPage(PackagePageNode::class, ContentKind.Functions),
- OnOwnPage(functionName)
- )
-
-private fun forExtension(codeFragment: String, expectedSignature: String, functionName: String = "underTest") =
- TestData(
- codeFragment,
- expectedSignature,
- OnParentPage(PackagePageNode::class, ContentKind.Extensions),
- OnOwnPage(functionName)
- )
-private fun forMethod(
- codeFragment: String,
- expectedSignature: String,
- functionName: String = "underTest",
- className: String = "Testable"
-) =
- TestData(
- codeFragment,
- expectedSignature,
- OnParentPage(ClasslikePageNode::class, ContentKind.Functions, className, functionName),
- OnOwnPage(functionName)
- )
-
-private fun forProperty(codeFragment: String, expectedSignature: String) =
- TestData(codeFragment, expectedSignature, OnParentPage(PackagePageNode::class, ContentKind.Properties))
-
-private fun forClassProperty(codeFragment: String, expectedSignature: String, className: String = "Testable") =
- TestData(codeFragment, expectedSignature, OnParentPage(ClasslikePageNode::class, ContentKind.Properties, className))
-
-private fun forClass(codeFragment: String, expectedSignature: String, className: String = "Testable") =
- TestData(
- codeFragment,
- expectedSignature,
- OnParentPage(PackagePageNode::class, ContentKind.Classlikes),
- OnOwnPage(className)
- )
diff --git a/plugins/base/src/test/kotlin/signatures/RawHtmlRenderingTest.kt b/plugins/base/src/test/kotlin/signatures/RawHtmlRenderingTest.kt
deleted file mode 100644
index c79d70fd..00000000
--- a/plugins/base/src/test/kotlin/signatures/RawHtmlRenderingTest.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jsoup.Jsoup
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class RawHtmlRenderingTest: AbstractRenderingTest() {
- @Test
- fun `work with raw html with inline comment`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testFromData(
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.renderedSourceDependentContent("example/example/-html-test/test.html")
- assertEquals(1, content.count())
- assertEquals(content.select("[data-togglable=example/jvm]").single().rawBrief,"This is an example <!-- not visible --> of html")
-
- val indexContent = writerPlugin.writer.contents.getValue("example/example/-html-test/index.html")
- .let { Jsoup.parse(it) }
- assertTrue(indexContent.select("div.brief").any { it.html().contains("This is an example <!-- not visible --> of html")})
- }
- }
- }
-
- @Test
- fun `work with raw html`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testFromData(
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- //Module page
- val content = writerPlugin.renderedContent("example/example/index.html").select("div.brief")
- assertTrue(content.size > 0)
- assertTrue(content.any { it.html().contains("<!-- this shouldn't be visible -->")})
- }
- }
- }
-
- @Test
- fun `work with raw, visible html`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testFromData(
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val content = writerPlugin.renderedSourceDependentContent("example/example/-html-test/test-p.html")
- assertEquals(1, content.count())
- assertEquals(content.select("[data-togglable=example/jvm]").single().rawBrief, "This is an <b> documentation </b>")
-
- val indexContent = writerPlugin.writer.contents.getValue("example/example/-html-test/index.html")
- .let { Jsoup.parse(it) }
- assertTrue(indexContent.select("div.brief").any { it.html().contains("This is an <b> documentation </b>")})
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/signatures/SignatureTest.kt b/plugins/base/src/test/kotlin/signatures/SignatureTest.kt
deleted file mode 100644
index 80a043fe..00000000
--- a/plugins/base/src/test/kotlin/signatures/SignatureTest.kt
+++ /dev/null
@@ -1,1035 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.DefinitelyNonNullable
-import org.jetbrains.dokka.model.dfs
-import utils.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class SignatureTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(
- commonStdlibPath ?: throw IllegalStateException("Common stdlib is not found"),
- jvmStdlibPath ?: throw IllegalStateException("JVM stdlib is not found")
- )
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- private val mppConfiguration = dokkaConfiguration {
- moduleName = "test"
- sourceSets {
- sourceSet {
- name = "common"
- sourceRoots = listOf("src/main/kotlin/common/Test.kt")
- classpath = listOf(commonStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- sourceSet {
- name = "jvm"
- dependentSourceSets = setOf(DokkaSourceSetID("test", "common"))
- sourceRoots = listOf("src/main/kotlin/jvm/Test.kt")
- classpath = listOf(
- commonStdlibPath ?: throw IllegalStateException("Common stdlib is not found"),)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- fun source(signature: String) =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | $signature
- """.trimIndent()
-
- @Test
- fun `fun`() {
- val source = source("fun simpleFun(): String = \"Celebrimbor\"")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun ", A("simpleFun"), "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `open fun`() {
- val source = source("open fun simpleFun(): String = \"Celebrimbor\"")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "open fun ", A("simpleFun"), "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `open suspend fun`() {
- val source = source("open suspend fun simpleFun(): String = \"Celebrimbor\"")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "open suspend fun ", A("simpleFun"), "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with params`() {
- val source = source("fun simpleFun(a: Int, b: Boolean, c: Any): String = \"Celebrimbor\"")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun ", A("simpleFun"), "(", Parameters(
- Parameter("a: ", A("Int"), ","),
- Parameter("b: ", A("Boolean"), ","),
- Parameter("c: ", A("Any")),
- ), "): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with function param`() {
- val source = source("fun simpleFun(a: (Int) -> String): String = \"Celebrimbor\"")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun ", A("simpleFun"), "(", Parameters(
- Parameter("a: (", A("Int"), ") -> ", A("String")),
- ),"): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with generic param`() {
- val source = source("fun <T> simpleFun(): T = \"Celebrimbor\" as T")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun <", A("T"), "> ", A("simpleFun"), "(): ",
- A("T"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with generic bounded param`() {
- val source = source("fun <T : String> simpleFun(): T = \"Celebrimbor\" as T")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun <", A("T"), " : ", A("String"), "> ", A("simpleFun"),
- "(): ", A("T"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with definitely non-nullable types`() {
- val source = source("fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- documentablesTransformationStage = {
- val fn = (it.dfs { it.name == "elvisLike" } as? DFunction).assertNotNull("Function elvisLike")
-
- assertTrue(fn.type is DefinitelyNonNullable)
- assertTrue(fn.parameters[1].type is DefinitelyNonNullable)
- }
- renderingStage = { _, _ ->
- val signature = writerPlugin.writer.renderedContent("root/example/elvis-like.html")
- assertEquals(2, signature.select("a[href=\"https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html\"]").size)
- signature.firstSignature().match(
- "fun <", A("T"), "> ", A("elvisLike"),
- "(",
- Span(
- Span("x: ", A("T"), ", "),
- Span("y: ", A("T"), " & ", A("Any"))
- ),
- "): ", A("T"), " & ", A("Any"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with keywords, params and generic bound`() {
- val source = source("inline suspend fun <T : String> simpleFun(a: Int, b: String): T = \"Celebrimbor\" as T")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "inline suspend fun <", A("T"), " : ", A("String"), "> ", A("simpleFun"), "(", Parameters(
- Parameter("a: ", A("Int"), ","),
- Parameter("b: ", A("String")),
- ), "): ", A("T"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with vararg`() {
- val source = source("fun simpleFun(vararg params: Int): Unit")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun ", A("simpleFun"), "(", Parameters(
- Parameter("vararg params: ", A("Int")),
- ), ")",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `class with no supertype`() {
- val source = source("class SimpleClass")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-simple-class/index.html").firstSignature().match(
- "class ", A("SimpleClass"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `class with generic supertype`() {
- val source = source("class InheritingClassFromGenericType<T : Number, R : CharSequence> : Comparable<T>, Collection<R>")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-inheriting-class-from-generic-type/index.html").firstSignature().match(
- "class ", A("InheritingClassFromGenericType"), " <", A("T"), " : ", A("Number"), ", ", A("R"), " : ", A("CharSequence"),
- "> : ", A("Comparable"), "<", A("T"), "> , ", A("Collection"), "<", A("R"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `functional interface`() {
- val source = source("fun interface KRunnable")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-k-runnable/index.html").firstSignature().match(
- "fun interface ", A("KRunnable"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with annotation`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | @MustBeDocumented()
- | @Target(AnnotationTarget.FUNCTION)
- | annotation class Marking
- |
- | @Marking()
- | fun simpleFun(): String = "Celebrimbor"
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- Div(
- Div("@", A("Marking"))
- ),
- "fun ", A("simpleFun"),
- "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `property with annotation`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | @MustBeDocumented()
- | @Target(AnnotationTarget.FUNCTION)
- | annotation class Marking
- |
- | @get:Marking()
- | @set:Marking()
- | var str: String
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/str.html").firstSignature().match(
- Div(
- Div("@get:", A("Marking")),
- Div("@set:", A("Marking"))
- ),
- "var ", A("str"),
- ": ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with two annotations`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | @MustBeDocumented()
- | @Target(AnnotationTarget.FUNCTION)
- | annotation class Marking(val msg: String)
- |
- | @MustBeDocumented()
- | @Target(AnnotationTarget.FUNCTION)
- | annotation class Marking2(val int: Int)
- |
- | @Marking("Nenya")
- | @Marking2(1)
- | fun simpleFun(): String = "Celebrimbor"
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html")
- .firstSignature()
- .match(
- Div(
- Div("@", A("Marking"), "(", Span("msg = ", Span("\"Nenya\"")), Wbr, ")"),
- Div("@", A("Marking2"), "(", Span("int = ", Span("1")), Wbr, ")")
- ),
- "fun ", A("simpleFun"),
- "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `fun with annotation with array`() {
- val source = """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | @MustBeDocumented()
- | @Target(AnnotationTarget.FUNCTION)
- | annotation class Marking(val msg: Array<String>)
- |
- | @Marking(["Nenya", "Vilya", "Narya"])
- | @Marking2(1)
- | fun simpleFun(): String = "Celebrimbor"
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- Div(
- Div(
- "@", A("Marking"), "(", Span(
- "msg = [",
- Span(Span("\"Nenya\""), ", "), Wbr,
- Span(Span("\"Vilya\""), ", "), Wbr,
- Span(Span("\"Narya\"")), Wbr, "]"
- ), Wbr, ")"
- )
- ),
- "fun ", A("simpleFun"),
- "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `actual fun`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |expect fun simpleFun(): String
- |
- |/src/main/kotlin/jvm/Test.kt
- |package example
- |
- |actual fun simpleFun(): String = "Celebrimbor"
- |
- """.trimMargin(),
- mppConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signatures = writerPlugin.writer.renderedContent("test/example/simple-fun.html").signature().toList()
-
- signatures[0].match(
- "expect fun ", A("simpleFun"),
- "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- signatures[1].match(
- "actual fun ", A("simpleFun"),
- "(): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `actual property with a default value`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |expect val prop: Int
- |
- |/src/main/kotlin/jvm/Test.kt
- |package example
- |
- |actual val prop: Int = 2
- |
- """.trimMargin(),
- mppConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signatures = writerPlugin.writer.renderedContent("test/example/prop.html").signature().toList()
-
- signatures[0].match(
- "expect val ", A("prop"),
- ": ", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- signatures[1].match(
- "actual val ", A("prop"),
- ": ", A("Int"),
- " = 2",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- @Test
- fun `actual typealias should have generic parameters and fully qualified name of the expansion type`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |expect class Array<T>
- |
- |/src/main/kotlin/jvm/Test.kt
- |package example
- |
- |actual typealias Array<T> = kotlin.Array<T>
- """.trimMargin(),
- mppConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signatures = writerPlugin.writer.renderedContent("test/example/-array/index.html").signature().toList()
-
- signatures[0].match(
- "expect class ", A("Array"), "<", A("T"), ">",
- ignoreSpanWithTokenStyle = true
- )
- signatures[1].match(
- "actual typealias ", A("Array"), "<", A("T"), "> = ", A("kotlin.Array"), "<", A("T"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `type with an actual typealias`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |expect class Foo
- |
- |/src/main/kotlin/jvm/Test.kt
- |package example
- |
- |class Bar
- |actual typealias Foo = Bar
- |
- """.trimMargin(),
- mppConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signatures = writerPlugin.writer.renderedContent("test/example/-foo/index.html").signature().toList()
-
- signatures[0].match(
- "expect class ", A("Foo"),
- ignoreSpanWithTokenStyle = true
- )
- signatures[1].match(
- "actual typealias ", A("Foo"), " = ", A("Bar"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `plain typealias of plain class`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |typealias PlainTypealias = Int
- |
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "typealias ", A("PlainTypealias"), " = ", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `plain typealias of plain class with annotation`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |@MustBeDocumented
- |@Target(AnnotationTarget.TYPEALIAS)
- |annotation class SomeAnnotation
- |
- |@SomeAnnotation
- |typealias PlainTypealias = Int
- |
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- Div(
- Div(
- "@", A("SomeAnnotation")
- )
- ),
- "typealias ", A("PlainTypealias"), " = ", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `plain typealias of generic class`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |typealias PlainTypealias = Comparable<Int>
- |
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "typealias ", A("PlainTypealias"), " = ", A("Comparable"),
- "<", A("Int"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `typealias with generics params`() {
-
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |typealias GenericTypealias<T> = Comparable<T>
- |
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "typealias ", A("GenericTypealias"), "<", A("T"), "> = ", A("Comparable"),
- "<", A("T"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `typealias with generic params swapped`() {
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |typealias XD<B, A> = Map<A, B>
- |
- |class ABC {
- | fun someFun(xd: XD<Int, String>) = 1
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-a-b-c/some-fun.html").firstSignature()
- .match(
- "fun ", A("someFun"), "(", Parameters(
- Parameter("xd: ", A("XD"), "<", A("Int"), ", ", A("String"), ">"),
- ), "):", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @OnlyDescriptors("Order of constructors is different in K2")
- @Test
- fun `generic constructor params`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |class GenericClass<T>(val x: Int) {
- | constructor(x: T) : this(1)
- |
- | constructor(x: Int, y: String) : this(1)
- |
- | constructor(x: Int, y: List<T>) : this(1)
- |
- | constructor(x: Boolean, y: Int, z: String) : this(1)
- |
- | constructor(x: List<Comparable<Lazy<T>>>?) : this(1)
- |}
- |
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-generic-class/-generic-class.html").signature().zip(
- listOf(
- arrayOf(
- "constructor(",
- Parameters(
- Parameter("x: ", A("T"))
- ),
- ")",
- ),
- arrayOf(
- "constructor(",
- Parameters(
- Parameter("x: ", A("Int"), ", "),
- Parameter("y: ", A("String"))
- ),
- ")",
- ),
- arrayOf(
- "constructor(",
- Parameters(
- Parameter("x: ", A("Int"), ", "),
- Parameter("y: ", A("List"), "<", A("T"), ">")
- ),
- ")",
- ),
- arrayOf(
- "constructor(",
- Parameters(
- Parameter("x: ", A("Boolean"), ", "),
- Parameter("y: ", A("Int"), ", "),
- Parameter("z:", A("String"))
- ),
- ")",
- ),
- arrayOf(
- "constructor(",
- Parameters(
- Parameter("x: ", A("List"), "<", A("Comparable"), "<", A("Lazy"), "<", A("T"), ">>>?")
- ),
- ")",
- ),
- arrayOf(
- "constructor(",
- Parameters(
- Parameter("x: ", A("Int"))
- ),
- ")",
- ),
- )
- ).forEach {
- it.first.match(*it.second, ignoreSpanWithTokenStyle = true)
- }
- }
- }
- }
-
- @Test
- fun `constructor has its own custom signature keyword in Constructor tab`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |class PrimaryConstructorClass(x: String) { }
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val constructorTabFirstElement =
- writerPlugin.writer.renderedContent("root/example/-primary-constructor-class/index.html")
- .tab("CONSTRUCTOR")
- .first() ?: throw NoSuchElementException("No Constructors tab found or it is empty")
-
- constructorTabFirstElement.firstSignature().match(
- "constructor(", Parameters(Parameter("x: ", A("String"))), ")",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `primary constructor with properties check for all tokens`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |class PrimaryConstructorClass<T>(val x: Int, var s: String) { }
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-primary-constructor-class/index.html").firstSignature().match(
- // In `<T>` expression, an empty `<span class="token keyword"></span>` is present for some reason
- Span("class "), A("PrimaryConstructorClass"), Span("<"), Span(), A("T"), Span(">"), Span("("), Parameters(
- Parameter(Span("val "), "x", Span(": "), A("Int"), Span(",")),
- Parameter(Span("var "), "s", Span(": "), A("String"))
- ), Span(")"),
- )
- }
- }
- }
-
- @Test
- fun `fun with default values`() {
- val source = source("fun simpleFun(int: Int = 1, string: String = \"string\"): String = \"\"")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/simple-fun.html").firstSignature().match(
- "fun", A("simpleFun"), "(", Parameters(
- Parameter("int: ", A("Int"), " = 1,"),
- Parameter("string: ", A("String"), " = \"string\"")
- ), "): ", A("String"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `const val with default values`() {
- val source = source("const val simpleVal = 1")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match(
- "const val ", A("simpleVal"), ": ", A("Int"), " = 1",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `should not expose enum constructor entry arguments`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/EnumClass.kt
- |package example
- |
- |enum class EnumClass(param: String = "Default") {
- | EMPTY,
- | WITH_ARG("arg")
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val enumEntrySignatures = writerPlugin.writer.renderedContent("root/example/-enum-class/index.html")
- .select("div[data-togglable=ENTRY] .table")
- .single()
- .signature()
- .select("div.block")
-
- enumEntrySignatures[0].match(
- A("EMPTY"),
- ignoreSpanWithTokenStyle = true
- )
-
- enumEntrySignatures[1].match(
- A("WITH_ARG"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @OnlyDescriptors("'var' expected but found: 'open var'")
- @Test
- fun `java property without accessors should be var`() {
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- """
- |/src/test/JavaClass.java
- |package test;
- |public class JavaClass {
- | public int property = 0;
- |}
- |
- |/src/test/KotlinClass.kt
- |package test
- |open class KotlinClass : JavaClass() { }
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/test/-kotlin-class/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(3, signatures.size, "Expected 2 signatures: class signature, constructor and property")
-
- val property = signatures[2]
- property.match(
- "var ", A("property"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
-
- writerPlugin.writer.renderedContent("root/test/-java-class/index.html").let { kotlinClassContent ->
- val signatures = kotlinClassContent.signature().toList()
- assertEquals(
- 3,
- signatures.size,
- "Expected 3 signatures: class signature, default constructor and property"
- )
-
- val property = signatures[2]
- property.match(
- "open var ", A("property"), ":", A("Int"),
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/signatures/VarianceSignatureTest.kt b/plugins/base/src/test/kotlin/signatures/VarianceSignatureTest.kt
deleted file mode 100644
index 0e8a8845..00000000
--- a/plugins/base/src/test/kotlin/signatures/VarianceSignatureTest.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package signatures
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import utils.A
-import utils.TestOutputWriterPlugin
-import utils.match
-import kotlin.test.Test
-
-class VarianceSignatureTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath = listOf(commonStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- }
- }
-
- fun source(signature: String) =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- |
- | $signature
- """.trimIndent()
-
- @Test
- fun `simple contravariance`() {
- val source = source("class Generic<in T>")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-generic/index.html").firstSignature().match(
- "class ", A("Generic"), "<in ", A("T"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `simple covariance`() {
- val source = source("class Generic<out T>")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-generic/index.html").firstSignature().match(
- "class ", A("Generic"), "<out ", A("T"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `simple invariance`() {
- val source = source("class Generic<T>")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-generic/index.html").firstSignature().match(
- "class ", A("Generic"), "<", A("T"), ">",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `covariance and bound`() {
- val source = source("class Generic<out T : List<CharSequence>>")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/example/-generic/index.html").firstSignature().match(
- "class ", A("Generic"), "<out ", A("T"), ":", A("List"), "<", A("CharSequence"), ">>",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt b/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt
deleted file mode 100644
index 8f984485..00000000
--- a/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package superFields
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.InheritedMember
-import org.jetbrains.dokka.model.IsVar
-import org.jetbrains.dokka.model.KotlinVisibility
-import utils.OnlyDescriptors
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-class DescriptorSuperPropertiesTest : BaseAbstractTest() {
-
- private val commonTestConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "jvm"
- }
- }
- }
-
- @Test
- fun `kotlin inheriting java should append only getter`() {
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public int getA() { return a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- this.documentablesTransformationStage = { module ->
- val kotlinProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
-
- val property = kotlinProperties.single { it.name == "a" }
- val propertyInheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), propertyInheritedFrom)
-
- assertNull(property.setter)
- assertNotNull(property.getter)
-
- val getterInheritedFrom = property.getter?.extra?.get(InheritedMember)?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), getterInheritedFrom)
-
- assertNull(property.extra[IsVar])
- }
- }
- }
-
-
- @Test
- fun `kotlin inheriting java should ignore setter lookalike for non accessible field`() {
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- |
- | public void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "B" }
-
- val property = testedClass.properties.firstOrNull { it.name == "a" }
- assertNull(property, "Inherited property `a` should not be visible as it's not accessible")
-
- val setterLookalike = testedClass.functions.firstOrNull { it.name == "setA" }
- assertNotNull(setterLookalike) {
- "Expected setA to be a regular function because field `a` is neither var nor val from Kotlin's " +
- "interop perspective, it's not accessible."
- }
- }
- }
- }
-
-
- @Test
- fun `kotlin inheriting java should append getter and setter`() {
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public int getA() { return a; }
- | public void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val kotlinProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- val property = kotlinProperties.single { it.name == "a" }
- property.extra[InheritedMember]?.inheritedFrom?.values?.single()?.run {
- assertEquals(
- DRI(packageName = "test", classNames = "A"),
- this
- )
- }
-
- val getter = property.getter
- assertNotNull(getter)
- assertEquals("getA", getter.name)
- val getterInheritedFrom = getter.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), getterInheritedFrom)
-
- val setter = property.setter
- assertNotNull(setter)
- assertEquals("setA", setter.name)
- val setterInheritedFrom = setter.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), setterInheritedFrom)
-
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- @OnlyDescriptors("Incorrect test, see https://github.com/Kotlin/dokka/issues/3128")
- fun `should have special getter and setter names for boolean property inherited from java`() {
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private boolean bool = true;
- | public boolean isBool() { return bool; }
- | public void setBool(boolean bool) { this.bool = bool; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val kotlinProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- val boolProperty = kotlinProperties.single { it.name == "bool" }
-
- val getter = boolProperty.getter
- assertNotNull(getter)
- assertEquals("isBool", getter.name)
-
- val setter = boolProperty.setter
- assertNotNull(setter)
- assertEquals("setBool", setter.name)
-
- assertNotNull(boolProperty.extra[IsVar])
- }
- }
- }
-
- @OnlyDescriptors("Incorrect test, see https://github.com/Kotlin/dokka/issues/3128")
- @Test
- fun `kotlin inheriting java should not append anything since field is public api`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "jvm"
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- }
-
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | protected int a = 1;
- | public int getA() { return a; }
- | public void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "B" }
- val property = testedClass.properties.single { it.name == "a" }
-
- assertNull(property.getter)
- assertNull(property.setter)
- assertEquals(2, testedClass.functions.size)
-
- assertEquals("getA", testedClass.functions[0].name)
- assertEquals("setA", testedClass.functions[1].name)
-
- val inheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `should inherit property visibility from getter`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "jvm"
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- }
-
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | protected int getA() { return a; }
- | protected void setA(int a) { this.a = a; }
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "B" }
- assertEquals(0, testedClass.functions.size)
-
- val property = testedClass.properties.single { it.name == "a" }
-
- assertNotNull(property.getter)
- assertNotNull(property.setter)
-
- val propertyVisibility = property.visibility.values.single()
- assertEquals(KotlinVisibility.Protected, propertyVisibility)
-
- val getterVisibility = property.getter?.visibility?.values?.single()
- assertEquals(KotlinVisibility.Protected, getterVisibility)
-
- val setterVisibility = property.setter?.visibility?.values?.single()
- assertEquals(KotlinVisibility.Protected, setterVisibility)
-
- val inheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test // checking for mapping between kotlin and java visibility
- fun `should resolve inherited java protected field as protected`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "jvm"
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- }
-
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | protected int protectedProperty = 0;
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "B" }
- assertEquals(0, testedClass.functions.size)
-
- val property = testedClass.properties.single { it.name == "protectedProperty" }
-
- assertNull(property.getter)
- assertNull(property.setter)
-
- val propertyVisibility = property.visibility.values.single()
- assertEquals(KotlinVisibility.Protected, propertyVisibility)
-
- val inheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `should mark final property inherited from java as val`() {
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | public final int a = 1;
- |}
- |
- |/src/test/B.kt
- |package test
- |class B : A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val kotlinProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- val property = kotlinProperties.single { it.name == "a" }
-
- assertNull(property.extra[IsVar])
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/superFields/PsiSuperFieldsTest.kt b/plugins/base/src/test/kotlin/superFields/PsiSuperFieldsTest.kt
deleted file mode 100644
index 38f263a6..00000000
--- a/plugins/base/src/test/kotlin/superFields/PsiSuperFieldsTest.kt
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package superFields
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.InheritedMember
-import org.jetbrains.dokka.model.IsVar
-import org.jetbrains.dokka.model.isJvmField
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-class PsiSuperFieldsTest : BaseAbstractTest() {
-
- private val commonTestConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "jvm"
- }
- }
- }
-
- @Test
- fun `java inheriting java`() {
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | public int a = 1;
- |}
- |
- |/src/test/B.java
- |package test;
- |public class B extends A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val inheritorProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- val property = inheritorProperties.single { it.name == "a" }
-
- val inheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
- }
- }
- }
-
- @Test
- fun `java inheriting kotlin common case`() {
- testInline(
- """
- |/src/test/A.kt
- |package test
- |open class A {
- | var a: Int = 1
- | val b: Int = 2
- |}
- |
- |/src/test/B.java
- |package test;
- |public class B extends A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val inheritorProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- inheritorProperties.single { it.name == "a" }.let { mutableProperty ->
- assertNotNull(mutableProperty.getter)
- assertNotNull(mutableProperty.setter)
-
- val inheritedFrom = mutableProperty.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNotNull(mutableProperty.extra[IsVar])
- }
-
- inheritorProperties.single { it.name == "b" }.let { immutableProperty ->
- assertNotNull(immutableProperty.getter)
- assertNull(immutableProperty.setter)
-
- val inheritedFrom = immutableProperty.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNull(immutableProperty.extra[IsVar])
- }
- }
- }
- }
-
- @Test
- fun `java inheriting kotlin with boolean property`() {
- testInline(
- """
- |/src/test/A.kt
- |package test
- |open class A {
- | var isActive: Boolean = true
- |}
- |
- |/src/test/B.java
- |package test;
- |public class B extends A {}
- """.trimIndent(),
- commonTestConfiguration
- ) {
- documentablesMergingStage = { module ->
- val inheritorProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- val property = inheritorProperties.single { it.name == "isActive" }
-
- assertNotNull(property.getter)
- assertEquals("isActive", property.getter?.name)
-
- assertNotNull(property.setter)
- assertEquals("setActive", property.setter?.name)
-
- val inheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `java inheriting kotlin with @JvmField should not inherit accessors`() {
- testInline(
- """
- |/src/test/A.kt
- |package test
- |open class A {
- | @kotlin.jvm.JvmField
- | var a: Int = 1
- |}
- |
- |/src/test/B.java
- |package test;
- |public class B extends A {}
- """.trimIndent(),
- dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = "jvm"
- name = "jvm"
- classpath += jvmStdlibPath!! // needed for JvmField
- }
- }
- }
- ) {
- documentablesMergingStage = { module ->
- val inheritorProperties = module.packages.single().classlikes.single { it.name == "B" }.properties
- val property = inheritorProperties.single { it.name == "a" }
-
- assertNull(property.getter)
- assertNull(property.setter)
-
- val jvmFieldAnnotation = property.extra[Annotations]?.directAnnotations?.values?.single()?.find {
- it.isJvmField()
- }
- assertNotNull(jvmFieldAnnotation)
-
- val inheritedFrom = property.extra[InheritedMember]?.inheritedFrom?.values?.single()
- assertEquals(DRI(packageName = "test", classNames = "A"), inheritedFrom)
-
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt b/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt
deleted file mode 100644
index 7ee67228..00000000
--- a/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformerBuilders
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jetbrains.dokka.transformers.pages.pageMapper
-import org.jetbrains.dokka.transformers.pages.pageScanner
-import org.jetbrains.dokka.transformers.pages.pageStructureTransformer
-import utils.assertNotNull
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class PageTransformerBuilderTest : BaseAbstractTest() {
-
- class ProxyPlugin(transformer: PageTransformer) : DokkaPlugin() {
- val pageTransformer by extending { CoreExtensions.pageTransformer with transformer }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
- }
-
- @Test
- fun scannerTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt")
- }
- }
- }
- val list = mutableListOf<String>()
-
- var orig: PageNode? = null
-
- testInline(
- """
- |/src/main/kotlin/transformerBuilder/Test.kt
- |package transformerBuilder
- |
- |object Test {
- | fun test2(str: String): Unit {println(str)}
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(ProxyPlugin(pageScanner {
- list += name
- }))
- ) {
- pagesGenerationStage = {
- orig = it
- }
- pagesTransformationStage = { root ->
- list.assertCount(4, "Page list: ")
- orig?.let { root.assertTransform(it) }
- }
- }
- }
-
- @Test
- fun mapperTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt")
- }
- }
- }
-
- var orig: PageNode? = null
-
- testInline(
- """
- |/src/main/kotlin/transformerBuilder/Test.kt
- |package transformerBuilder
- |
- |object Test {
- | fun test2(str: String): Unit {println(str)}
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(ProxyPlugin(pageMapper {
- modified(name = name + "2")
- }))
- ) {
- pagesGenerationStage = {
- orig = it
- }
- pagesTransformationStage = {
- it.let { root ->
- root.name.assertEqual("root2", "Root name: ")
- orig?.let {
- root.assertTransform(it) { node -> node.modified(name = node.name + "2") }
- }
- }
- }
- }
- }
-
- @Test
- fun structureTransformerTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/transformerBuilder/Test.kt
- |package transformerBuilder
- |
- |object Test {
- | fun test2(str: String): Unit {println(str)}
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(ProxyPlugin(pageStructureTransformer {
- val ch = children.first()
- modified(
- children = listOf(
- ch,
- RendererSpecificResourcePage("test", emptyList(), RenderingStrategy.DoNothing)
- )
- )
- }))
- ) {
- pagesTransformationStage = { root ->
- root.children.assertCount(2, "Root children: ")
- root.children.first().name.assertEqual("transformerBuilder")
- root.children[1].name.assertEqual("test")
- }
- }
- }
-
- @Test
- fun `kotlin constructors tab should exist even though there is primary constructor only`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |class Test(val xd: Int)
- """.trimMargin(),
- configuration
- ) {
- pagesGenerationStage = { root ->
- val content = root.children
- .flatMap { it.children<ContentPage>() }
- .map { it.content }.single().children
- .filterIsInstance<ContentGroup>()
- .single { it.dci.kind == ContentKind.Main }.children
-
- val contentWithConstructorsHeader = content.find { tabContent -> tabContent.dfs { it is ContentText && (it as? ContentText)?.text == "Constructors"} != null }
-
- contentWithConstructorsHeader.assertNotNull("contentWithConstructorsHeader")
-
- contentWithConstructorsHeader?.dfs { it.dci.kind == ContentKind.Constructors && it is ContentGroup }
- .assertNotNull("constructor group")
- }
- }
- }
-
- private fun <T> Collection<T>.assertCount(n: Int, prefix: String = "") =
- assertEquals(n, count(), "${prefix}Expected $n, got ${count()}")
-
- private fun <T> T.assertEqual(expected: T, prefix: String = "") =
- assertEquals(expected, this, "${prefix}Expected $expected, got $this")
-
- private fun PageNode.assertTransform(expected: PageNode, block: (PageNode) -> PageNode = { it }): Unit = this.let {
- it.name.assertEqual(block(expected).name)
- it.children.zip(expected.children).forEach { (g, e) ->
- g.name.assertEqual(block(e).name)
- g.assertTransform(e, block)
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/AbstractContextModuleAndPackageDocumentationReaderTest.kt b/plugins/base/src/test/kotlin/transformers/AbstractContextModuleAndPackageDocumentationReaderTest.kt
deleted file mode 100644
index 8ce9360f..00000000
--- a/plugins/base/src/test/kotlin/transformers/AbstractContextModuleAndPackageDocumentationReaderTest.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.model.SourceSetDependent
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.model.withDescendants
-import org.junit.jupiter.api.io.TempDir
-import java.nio.file.Path
-
-abstract class AbstractContextModuleAndPackageDocumentationReaderTest {
- @TempDir
- protected lateinit var temporaryDirectory: Path
-
-
- companion object {
- val SourceSetDependent<DocumentationNode>.texts: List<String>
- get() = values.flatMap { it.withDescendants() }
- .flatMap { it.children }
- .flatMap { it.children }
- .mapNotNull { it as? Text }
- .map { it.body }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/CommentsToContentConverterTest.kt b/plugins/base/src/test/kotlin/transformers/CommentsToContentConverterTest.kt
deleted file mode 100644
index 1387c0e0..00000000
--- a/plugins/base/src/test/kotlin/transformers/CommentsToContentConverterTest.kt
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import matchers.content.*
-import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.pages.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class CommentsToContentConverterTest {
- private val converter = DocTagToContentConverter()
-
- private fun executeTest(
- docTag: DocTag,
- match: ContentMatcherBuilder<ContentComposite>.() -> Unit,
- ) {
- val dci = DCI(
- setOf(
- DRI("kotlin", "Any")
- ),
- ContentKind.Comment
- )
- converter.buildContent(
- Li(
- listOf(
- docTag
- )
- ),
- dci,
- emptySet()
- ).single().assertNode(match)
- }
-
- @Test
- fun `simple text`() {
- val docTag = P(listOf(Text("This is simple test of string Next line")))
- executeTest(docTag) {
- group { +"This is simple test of string Next line" }
- }
- }
-
- @Test
- fun `simple text with new line`() {
- val docTag = P(
- listOf(
- Text("This is simple test of string"),
- Br,
- Text("Next line")
- )
- )
- executeTest(docTag) {
- group {
- +"This is simple test of string"
- node<ContentBreakLine>()
- +"Next line"
- }
- }
- }
-
- @Test
- fun `paragraphs`() {
- val docTag = P(
- listOf(
- P(listOf(Text("Paragraph number one"))),
- P(listOf(Text("Paragraph"), Br, Text("number two")))
- )
- )
- executeTest(docTag) {
- group {
- group { +"Paragraph number one" }
- group {
- +"Paragraph"
- node<ContentBreakLine>()
- +"number two"
- }
- }
- }
- }
-
- @Test
- fun `unordered list with empty lines`() {
- val docTag = Ul(
- listOf(
- Li(listOf(P(listOf(Text("list item 1 continue 1"))))),
- Li(listOf(P(listOf(Text("list item 2"), Br, Text("continue 2")))))
- )
- )
- executeTest(docTag) {
- node<ContentList> {
- group {
- +"list item 1 continue 1"
- }
- group {
- +"list item 2"
- node<ContentBreakLine>()
- +"continue 2"
- }
- }
- }
- }
-
- @Test
- fun `nested list`() {
- val docTag = P(
- listOf(
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ul(
- listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- )
- ),
- Li(listOf(P(listOf(Text("Middle third")))))
- )
- ),
- Li(listOf(P(listOf(Text("Outer third")))))
- )
- ),
- P(listOf(Text("New paragraph")))
- )
- )
- executeTest(docTag) {
- group {
- node<ContentList> {
- group { +"Outer first Outer next line" }
- group { +"Outer second" }
- node<ContentList> {
- group { +"Middle first Middle next line" }
- group { +"Middle second" }
- node<ContentList> {
- group { +"Inner first Inner next line" }
- }
- group { +"Middle third" }
- }
- group { +"Outer third" }
- }
- group { +"New paragraph" }
- }
- }
- }
-
- @Test
- fun `header and paragraphs`() {
- val docTag = P(
- listOf(
- H1(listOf(Text("Header 1"))),
- P(listOf(Text("Following text"))),
- P(listOf(Text("New paragraph")))
- )
- )
- executeTest(docTag) {
- group {
- header(1) { +"Header 1" }
- group { +"Following text" }
- group { +"New paragraph" }
- }
- }
- }
-
- @Test
- fun `header levels`() {
- val docTag = P(
- listOf(
- H1(listOf(Text("Header 1"))),
- P(listOf(Text("Text 1"))),
- H2(listOf(Text("Header 2"))),
- P(listOf(Text("Text 2"))),
- H3(listOf(Text("Header 3"))),
- P(listOf(Text("Text 3"))),
- H4(listOf(Text("Header 4"))),
- P(listOf(Text("Text 4"))),
- H5(listOf(Text("Header 5"))),
- P(listOf(Text("Text 5"))),
- H6(listOf(Text("Header 6"))),
- P(listOf(Text("Text 6")))
- )
- )
- executeTest(docTag) {
- group {
- header(1) { +"Header 1" }
- group { +"Text 1" }
- header(2) { +"Header 2" }
- group { +"Text 2" }
- header(3) { +"Header 3" }
- group { +"Text 3" }
- header(4) { +"Header 4" }
- group { +"Text 4" }
- header(5) { +"Header 5" }
- group { +"Text 5" }
- header(6) { +"Header 6" }
- group { +"Text 6" }
- }
- }
- }
-
- @Test
- fun `block quotes`() {
- val docTag = P(
- listOf(
- BlockQuote(
- listOf(
- P(
- listOf(
- Text("Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.")
- )
- )
- )
- ),
- P(listOf(Text("Quote break."))),
- BlockQuote(
- listOf(
- P(listOf(Text("Quote")))
- )
- )
- )
- )
- executeTest(docTag) {
- group {
- group {
- group {
- +"Blockquotes are very handy in email to emulate reply text. This line is part of the same quote."
- }
- }
- group { +"Quote break." }
- group {
- group {
- +"Quote"
- }
- }
- }
- }
- }
-
- @Test
- fun `nested block quotes`() {
- val docTag = P(
- listOf(
- BlockQuote(
- listOf(
- P(listOf(Text("text 1 text 2"))),
- BlockQuote(
- listOf(
- P(listOf(Text("text 3 text 4")))
- )
- ),
- P(listOf(Text("text 5")))
- )
- ),
- P(listOf(Text("Quote break."))),
- BlockQuote(
- listOf(
- P(listOf(Text("Quote")))
- )
- )
- )
- )
- executeTest(docTag) {
- group {
- group {
- group { +"text 1 text 2" }
- group {
- group { +"text 3 text 4" }
- }
- group { +"text 5" }
- }
- group { +"Quote break." }
- group {
- group { +"Quote" }
- }
- }
- }
- }
-
- @Test
- fun `multiline code`() {
- val docTag = P(
- listOf(
- CodeBlock(
- listOf(
- Text("val x: Int = 0"), Br,
- Text("val y: String = \"Text\""), Br, Br,
- Text(" val z: Boolean = true"), Br,
- Text("for(i in 0..10) {"), Br,
- Text(" println(i)"), Br,
- Text("}")
- ),
- mapOf("lang" to "kotlin")
- ),
- P(listOf(Text("Sample text")))
- )
- )
- executeTest(docTag) {
- group {
- node<ContentCodeBlock> {
- +"val x: Int = 0"
- node<ContentBreakLine>()
- +"val y: String = \"Text\""
- node<ContentBreakLine>()
- node<ContentBreakLine>()
- +" val z: Boolean = true"
- node<ContentBreakLine>()
- +"for(i in 0..10) {"
- node<ContentBreakLine>()
- +" println(i)"
- node<ContentBreakLine>()
- +"}"
- }
- group { +"Sample text" }
- }
- }
- }
-
- @Test
- fun `inline link`() {
- val docTag = P(
- listOf(
- A(
- listOf(Text("I'm an inline-style link")),
- mapOf("href" to "https://www.google.com")
- )
- )
- )
- executeTest(docTag) {
- group {
- link {
- +"I'm an inline-style link"
- check {
- assertEquals(
- (this as? ContentResolvedLink)?.address ?: error("Link should be resolved"),
- "https://www.google.com"
- )
- }
- }
- }
- }
- }
-
-
- @Test
- fun `ordered list`() {
- val docTag =
- Ol(
- listOf(
- Li(
- listOf(
- P(listOf(Text("test1"))),
- P(listOf(Text("test2"))),
- )
- ),
- Li(
- listOf(
- P(listOf(Text("test3"))),
- P(listOf(Text("test4"))),
- )
- )
- )
- )
- executeTest(docTag) {
- node<ContentList> {
- group {
- +"test1"
- +"test2"
- }
- group {
- +"test3"
- +"test4"
- }
- }
- }
- }
-
- @Test
- fun `nested ordered list`() {
- val docTag = P(
- listOf(
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ol(
- listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- ),
- mapOf("start" to "1")
- ),
- Li(listOf(P(listOf(Text("Middle third")))))
- ),
- mapOf("start" to "1")
- ),
- Li(listOf(P(listOf(Text("Outer third")))))
- ),
- mapOf("start" to "1")
- ),
- P(listOf(Text("New paragraph")))
- )
- )
- executeTest(docTag) {
- group {
- node<ContentList> {
- group { +"Outer first Outer next line" }
- group { +"Outer second" }
- node<ContentList> {
- group { +"Middle first Middle next line" }
- group { +"Middle second" }
- node<ContentList> {
- +"Inner first Inner next line"
- }
- group { +"Middle third" }
- }
- group { +"Outer third" }
- }
- group {
- +"New paragraph"
- }
- }
- }
- }
-
- @Test
- fun `description list`() {
- val docTag =
- Dl(
- listOf(
- Dt(
- listOf(
- Text("description list can have...")
- )
- ),
- Dt(
- listOf(
- Text("... two consecutive description terms")
- )
- ),
- Dd(
- listOf(
- Text("and usually has some sort of a description, like this one")
- )
- )
- )
- )
-
- executeTest(docTag) {
- composite<ContentList> {
- check {
- assertTrue(style.contains(ListStyle.DescriptionList), "Expected DL style")
- }
- group {
- check {
- assertTrue(style.contains(ListStyle.DescriptionTerm), "Expected DT style")
- }
- +"description list can have..."
- }
- group {
- check {
- assertTrue(style.contains(ListStyle.DescriptionTerm), "Expected DT style")
- }
- +"... two consecutive description terms"
- }
- group {
- check {
- assertTrue(style.contains(ListStyle.DescriptionDetails), "Expected DD style")
- }
- +"and usually has some sort of a description, like this one"
- }
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest1.kt b/plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest1.kt
deleted file mode 100644
index dfb3eff1..00000000
--- a/plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest1.kt
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.testApi.logger.TestLogger
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-import testApi.testRunner.TestDokkaConfigurationBuilder
-import testApi.testRunner.dModule
-import testApi.testRunner.dPackage
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFailsWith
-
-class ContextModuleAndPackageDocumentationReaderTest1 : AbstractContextModuleAndPackageDocumentationReaderTest() {
-
-
- private val includeSourceSetA by lazy { temporaryDirectory.resolve("includeA.md").toFile() }
- private val includeSourceSetB by lazy { temporaryDirectory.resolve("includeB.md").toFile() }
-
- @BeforeTest
- fun materializeIncludes() {
- includeSourceSetA.writeText(
- """
- # Module moduleA
- This is moduleA
-
- # Package sample.a
- This is package sample.a\r\n
-
- # Package noise.b
- This will just add some noise
- """.trimIndent().replace("\n", "\r\n")
- )
-
- includeSourceSetB.writeText(
- """
- # Module moduleB
- This is moduleB
-
- # Package sample.b
- This is package sample.b
-
- # Package noise.b
- This will just add some more noise
- """.trimIndent()
- )
- }
-
- private val configurationBuilder = TestDokkaConfigurationBuilder().apply {
- moduleName = "moduleA"
- }
-
- private val sourceSetA by configurationBuilder.sourceSet {
- name = "sourceSetA"
- includes = listOf(includeSourceSetA.canonicalPath)
- }
-
-
- private val sourceSetB by configurationBuilder.sourceSet {
- name = "sourceSetB"
- includes = listOf(includeSourceSetB.canonicalPath)
- }
-
-
- private val sourceSetB2 by configurationBuilder.sourceSet {
- name = "sourceSetB2"
- includes = emptyList()
- }
-
-
- private val context by lazy {
- DokkaContext.create(
- configuration = configurationBuilder.build(),
- logger = TestLogger(DokkaConsoleLogger(LoggingLevel.DEBUG)),
- pluginOverrides = emptyList()
- )
- }
-
- private val reader by lazy { context.plugin<InternalKotlinAnalysisPlugin>().querySingle { moduleAndPackageDocumentationReader } }
-
- @Test
- fun `assert moduleA with sourceSetA`() {
- val documentation = reader.read(dModule(name = "moduleA", sourceSets = setOf(sourceSetA)))
- assertEquals(
- 1, documentation.keys.size,
- "Expected moduleA only containing documentation in a single source set"
- )
- assertEquals(
- "sourceSetA", documentation.keys.single().sourceSetID.sourceSetName,
- "Expected moduleA documentation coming from sourceSetA"
- )
-
- assertEquals(
- "This is moduleA", documentation.texts.single(),
- "Expected moduleA documentation being present"
- )
- }
-
- @Test
- fun `assert moduleA with no source sets`() {
- val documentation = reader.read(dModule("moduleA"))
- assertEquals(
- emptyMap(), documentation,
- "Expected no documentation received for module not declaring a matching sourceSet"
- )
- }
-
- @Test
- fun `assert moduleA with unknown source set`() {
- assertFailsWith<IllegalStateException>(
- "Expected no documentation received for module with unknown sourceSet"
- ) {
- reader.read(
- dModule("moduleA", sourceSets = setOf(configurationBuilder.unattachedSourceSet { name = "unknown" }))
- )
- }
- }
-
- @Test
- fun `assert moduleA with all sourceSets`() {
- val documentation = reader.read(dModule("moduleA", sourceSets = setOf(sourceSetA, sourceSetB, sourceSetB2)))
- assertEquals(1, documentation.entries.size, "Expected only one entry from sourceSetA")
- assertEquals(sourceSetA, documentation.keys.single(), "Expected only one entry from sourceSetA")
- assertEquals("This is moduleA", documentation.texts.single())
- }
-
- @Test
- fun `assert moduleB with sourceSetB and sourceSetB2`() {
- val documentation = reader.read(dModule("moduleB", sourceSets = setOf(sourceSetB, sourceSetB2)))
- assertEquals(1, documentation.keys.size, "Expected only one entry from sourceSetB")
- assertEquals(sourceSetB, documentation.keys.single(), "Expected only one entry from sourceSetB")
- assertEquals("This is moduleB", documentation.texts.single())
- }
-
- @Test
- fun `assert sample_A in sourceSetA`() {
- val documentation = reader.read(dPackage(DRI("sample.a"), sourceSets = setOf(sourceSetA)))
- assertEquals(1, documentation.keys.size, "Expected only one entry from sourceSetA")
- assertEquals(sourceSetA, documentation.keys.single(), "Expected only one entry from sourceSetA")
- assertEquals("This is package sample.a\\r\\n", documentation.texts.single())
- }
-
- @Test
- fun `assert sample_a_sub in sourceSetA`() {
- val documentation = reader.read(dPackage(DRI("sample.a.sub"), sourceSets = setOf(sourceSetA)))
- assertEquals(
- emptyMap<DokkaSourceSet, DocumentationNode>(), documentation,
- "Expected no documentation found for different package"
- )
- }
-
- @Test
- fun `assert sample_a in sourceSetB`() {
- val documentation = reader.read(dPackage(DRI("sample.a"), sourceSets = setOf(sourceSetB)))
- assertEquals(
- emptyMap<DokkaSourceSet, DocumentationNode>(), documentation,
- "Expected no documentation found for different sourceSet"
- )
- }
-
- @Test
- fun `assert sample_b in sourceSetB`() {
- val documentation = reader.read(dPackage(DRI("sample.b"), sourceSets = setOf(sourceSetB)))
- assertEquals(1, documentation.keys.size, "Expected only one entry from sourceSetB")
- assertEquals(sourceSetB, documentation.keys.single(), "Expected only one entry from sourceSetB")
- assertEquals("This is package sample.b", documentation.texts.single())
- }
-
- @Test
- fun `assert sample_b in sourceSetB and sourceSetB2`() {
- val documentation = reader.read(dPackage(DRI("sample.b"), sourceSets = setOf(sourceSetB, sourceSetB2)))
- assertEquals(1, documentation.keys.size, "Expected only one entry from sourceSetB")
- assertEquals(sourceSetB, documentation.keys.single(), "Expected only one entry from sourceSetB")
- assertEquals("This is package sample.b", documentation.texts.single())
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest3.kt b/plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest3.kt
deleted file mode 100644
index ebd5b7eb..00000000
--- a/plugins/base/src/test/kotlin/transformers/ContextModuleAndPackageDocumentationReaderTest3.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-import testApi.testRunner.TestDokkaConfigurationBuilder
-import testApi.testRunner.dPackage
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ContextModuleAndPackageDocumentationReaderTest3 : AbstractContextModuleAndPackageDocumentationReaderTest() {
-
- private val include by lazy { temporaryDirectory.resolve("include.md").toFile() }
-
- @BeforeTest
- fun materializeInclude() {
- include.writeText(
- """
- # Package
- This is the root package
-
- # Package [root]
- This is also the root package
- """.trimIndent()
- )
- }
-
- private val configurationBuilder = TestDokkaConfigurationBuilder()
-
- private val sourceSet by configurationBuilder.sourceSet {
- includes = listOf(include.canonicalPath)
- }
-
- private val context by lazy {
- DokkaContext.create(
- configuration = configurationBuilder.build(),
- logger = DokkaConsoleLogger(LoggingLevel.DEBUG),
- pluginOverrides = emptyList()
- )
- }
-
- private val reader by lazy { context.plugin<InternalKotlinAnalysisPlugin>().querySingle { moduleAndPackageDocumentationReader } }
-
-
- @Test
- fun `root package is matched by empty string and the root keyword`() {
- val documentation = reader.read(dPackage(DRI(""), sourceSets = setOf(sourceSet)))
- assertEquals(
- listOf("This is the root package", "This is also the root package"), documentation.texts
- )
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/DivisionSwitchTest.kt b/plugins/base/src/test/kotlin/transformers/DivisionSwitchTest.kt
deleted file mode 100644
index fec5fc47..00000000
--- a/plugins/base/src/test/kotlin/transformers/DivisionSwitchTest.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.ClasslikePageNode
-import org.jetbrains.dokka.pages.ContentHeader
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.pages.ContentText
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-
-class DivisionSwitchTest : BaseAbstractTest() {
-
- private val query = """
- |/src/source0.kt
- package package0
- /**
- * Documentation for ClassA
- */
- class ClassA {
- val A: String = "A"
- fun a() {}
- fun b() {}
- }
-
- /src/source1.kt
- package package0
- /**
- * Documentation for ClassB
- */
- class ClassB : ClassA() {
- val B: String = "B"
- fun d() {}
- fun e() {}
- }
- """.trimMargin()
-
- private fun configuration(switchOn: Boolean) = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- suppressObviousFunctions = false
- pluginsConfigurations.add(
- PluginConfigurationImpl(
- DokkaBase::class.qualifiedName!!,
- DokkaConfiguration.SerializationFormat.JSON,
- """{ "separateInheritedMembers": $switchOn }""",
- )
- )
- }
-
- private fun testClassB(switchOn: Boolean, operation: (ClasslikePageNode) -> Unit) {
- testInline(
- query,
- configuration(switchOn),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classB = root.dfs { it.name == "ClassB" } as? ClasslikePageNode
- assertNotNull(classB, "Tested class not found!")
- operation(classB)
- }
- }
- }
-
- private fun ClasslikePageNode.findSectionWithName(name: String) : ContentNode? {
- var sectionHeader: ContentHeader? = null
- return content.dfs { node ->
- node.children.filterIsInstance<ContentHeader>().any { header ->
- header.children.firstOrNull { it is ContentText && it.text == name }?.also { sectionHeader = header } != null
- }
- }?.children?.dropWhile { child -> child != sectionHeader }?.drop(1)?.firstOrNull()
- }
-
- @Test
- fun `should not split inherited and regular methods`() {
- testClassB(false) { classB ->
- val functions = classB.findSectionWithName("Functions")
- assertNotNull(functions, "Functions not found!")
- assertEquals(7, functions.children.size, "Incorrect number of functions found")
- }
- }
-
- @Test
- fun `should not split inherited and regular properties`() {
- testClassB(false) { classB ->
- val properties = classB.findSectionWithName("Properties")
- assertNotNull(properties, "Properties not found!")
- assertEquals(2, properties.children.size, "Incorrect number of properties found")
- }
- }
-
- @Test
- fun `should split inherited and regular methods`() {
- testClassB(true) { classB ->
- val functions = classB.findSectionWithName("Functions")
- val inheritedFunctions = classB.findSectionWithName("Inherited functions")
- assertNotNull(functions, "Functions not found!")
- assertEquals(2, functions.children.size, "Incorrect number of functions found")
- assertNotNull(inheritedFunctions, "Inherited functions not found!")
- assertEquals(5, inheritedFunctions.children.size, "Incorrect number of inherited functions found")
- }
- }
-
- @Test
- fun `should split inherited and regular properties`() {
- testClassB(true) { classB ->
- val properties = classB.findSectionWithName("Properties")
- assertNotNull(properties, "Properties not found!")
- assertEquals(1, properties.children.size, "Incorrect number of properties found")
- val inheritedProperties = classB.findSectionWithName("Inherited properties")
- assertNotNull(inheritedProperties, "Inherited properties not found!")
- assertEquals(1, inheritedProperties.children.size, "Incorrect number of inherited properties found")
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/InheritedEntriesDocumentableFilterTransfromerTest.kt b/plugins/base/src/test/kotlin/transformers/InheritedEntriesDocumentableFilterTransfromerTest.kt
deleted file mode 100644
index c07dd5b8..00000000
--- a/plugins/base/src/test/kotlin/transformers/InheritedEntriesDocumentableFilterTransfromerTest.kt
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DEnum
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class InheritedEntriesDocumentableFilterTransformerTest : BaseAbstractTest() {
- val suppressingInheritedConfiguration = dokkaConfiguration {
- suppressInheritedMembers = true
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- }
-
- val nonSuppressingInheritedConfiguration = dokkaConfiguration {
- suppressObviousFunctions = false
- suppressInheritedMembers = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- }
-
-
- @Test
- fun `should suppress toString, equals and hashcode but keep custom ones`() {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- data class Suppressed(val x: String) {
- override fun toString(): String {
- return "custom"
- }
- }
- """.trimIndent(),
- suppressingInheritedConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(listOf("toString", "copy", "component1").sorted(), functions.map { it.name }.sorted())
- }
- }
- }
-
- @Test
- fun `should suppress toString, equals and hashcode`() {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- data class Suppressed(val x: String)
- """.trimIndent(),
- suppressingInheritedConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(listOf("copy", "component1").sorted(), functions.map { it.name }.sorted())
- }
- }
- }
-
- @Test
- fun `should also suppress properites`(){
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- open class Parent {
- val parentValue = "String"
- }
-
- class Child : Parent {
-
- }
- """.trimIndent(),
- suppressingInheritedConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val properties = modules.flatMap { it.packages }.flatMap { it.classlikes }.first { it.name == "Child" }.properties
- assertEquals(0, properties.size)
- }
- }
- }
-
- @Test
- fun `should not suppress properites if config says so`(){
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- open class Parent {
- val parentValue = "String"
- }
-
- class Child : Parent {
-
- }
- """.trimIndent(),
- nonSuppressingInheritedConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val properties = modules.flatMap { it.packages }.flatMap { it.classlikes }.first { it.name == "Child" }.properties
- assertEquals(listOf("parentValue"), properties.map { it.name })
- }
- }
- }
-
- @Test
- fun `should work with enum entries`(){
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- enum class Suppressed {
- ENTRY_SUPPRESSED
- }
- """.trimIndent(),
- suppressingInheritedConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val entry = (modules.flatMap { it.packages }.flatMap { it.classlikes }.first { it.name == "Suppressed" } as DEnum).entries.first()
- assertEquals(emptyList(), entry.properties)
- assertEquals(emptyList(), entry.functions)
- assertEquals(emptyList(), entry.classlikes)
- }
- }
- }
-
- @Test
- fun `should work with enum entries when not suppressing`(){
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- enum class Suppressed {
- ENTRY_SUPPRESSED;
- class A
- }
- """.trimIndent(),
- nonSuppressingInheritedConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val entry = (modules.flatMap { it.packages }.flatMap { it.classlikes }.first { it.name == "Suppressed" } as DEnum).entries.first()
- assertEquals(listOf("name", "ordinal"), entry.properties.map { it.name })
- assertTrue(entry.functions.map { it.name }.containsAll(listOf("compareTo", "equals", "hashCode", "toString")))
- assertEquals(emptyList(), entry.classlikes)
- }
- }
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/transformers/InvalidContentModuleAndPackageDocumentationReaderTest.kt b/plugins/base/src/test/kotlin/transformers/InvalidContentModuleAndPackageDocumentationReaderTest.kt
deleted file mode 100644
index ca7536d4..00000000
--- a/plugins/base/src/test/kotlin/transformers/InvalidContentModuleAndPackageDocumentationReaderTest.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-import testApi.testRunner.TestDokkaConfigurationBuilder
-import testApi.testRunner.dModule
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-
-class InvalidContentModuleAndPackageDocumentationReaderTest : AbstractContextModuleAndPackageDocumentationReaderTest() {
-
- private val includeA by lazy { temporaryDirectory.resolve("includeA.md").toFile() }
- private val includeB by lazy { temporaryDirectory.resolve("includeB.md").toFile() }
-
- @BeforeTest
- fun materializeInclude() {
- includeA.writeText(
- """
- Invalid random stuff
-
- # Module moduleA
- Simple stuff
- """.trimIndent()
- )
- includeB.writeText(
- """
- # Module moduleB
- ###
- """.trimIndent()
- )
- }
-
- private val configurationBuilderA = TestDokkaConfigurationBuilder().apply {
- moduleName = "moduleA"
- }
- private val configurationBuilderB = TestDokkaConfigurationBuilder().apply {
- moduleName = "moduleB"
- }
-
- private val sourceSetA by configurationBuilderA.sourceSet {
- includes = listOf(includeA.canonicalPath)
- }
-
- private val sourceSetB by configurationBuilderB.sourceSet {
- includes = listOf(includeB.canonicalPath)
- }
-
- private val contextA by lazy {
- DokkaContext.create(
- configuration = configurationBuilderA.build(),
- logger = DokkaConsoleLogger(LoggingLevel.DEBUG),
- pluginOverrides = emptyList()
- )
- }
- private val contextB by lazy {
- DokkaContext.create(
- configuration = configurationBuilderB.build(),
- logger = DokkaConsoleLogger(LoggingLevel.DEBUG),
- pluginOverrides = emptyList()
- )
- }
-
- private val readerA by lazy { contextA.plugin<InternalKotlinAnalysisPlugin>().querySingle { moduleAndPackageDocumentationReader } }
- private val readerB by lazy { contextB.plugin<InternalKotlinAnalysisPlugin>().querySingle { moduleAndPackageDocumentationReader } }
-
-
- @Test
- fun `parsing should fail with a message when documentation is in not proper format`() {
- val exception =
- runCatching { readerA.read(dModule(name = "moduleA", sourceSets = setOf(sourceSetA))) }.exceptionOrNull()
- assertEquals(
- "Unexpected classifier: \"Invalid\", expected either \"Module\" or \"Package\". \n" +
- "For more information consult the specification: https://kotlinlang.org/docs/dokka-module-and-package-docs.html",
- exception?.message
- )
- }
-
- @Test
- fun `parsing should fail with a message where it encountered error and why`() {
- val exception =
- runCatching { readerB.read(dModule(name = "moduleB", sourceSets = setOf(sourceSetB))) }.exceptionOrNull()?.message!!
-
- //I don't want to assert whole message since it contains a path to a temporary folder
- assertTrue(exception.contains("Wrong AST Tree. Header does not contain expected content in "))
- assertTrue(exception.contains("includeB.md"))
- assertTrue(exception.contains("element starts from offset 0 and ends 3: ###"))
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/transformers/MergeImplicitExpectActualDeclarationsTest.kt b/plugins/base/src/test/kotlin/transformers/MergeImplicitExpectActualDeclarationsTest.kt
deleted file mode 100644
index 18e42e47..00000000
--- a/plugins/base/src/test/kotlin/transformers/MergeImplicitExpectActualDeclarationsTest.kt
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.PluginConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.childrenOfType
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.model.firstChildOfType
-import org.jetbrains.dokka.pages.*
-import utils.assertNotNull
-import utils.findSectionWithName
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-
-class MergeImplicitExpectActualDeclarationsTest : BaseAbstractTest() {
-
- @Suppress("UNUSED_VARIABLE")
- private fun configuration(switchOn: Boolean) = dokkaConfiguration {
- sourceSets {
- val common = sourceSet {
- name = "common"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin/pageMerger/Test.kt")
- }
- val js = sourceSet {
- name = "js"
- displayName = "js"
- analysisPlatform = "js"
- dependentSourceSets = setOf(common.value.sourceSetID)
- sourceRoots = listOf("src/jsMain/kotlin/pageMerger/Test.kt")
- }
- val jvm = sourceSet {
- name = "jvm"
- displayName = "jvm"
- analysisPlatform = "jvm"
- sourceRoots = listOf("src/jvmMain/kotlin/pageMerger/Test.kt")
- }
- }
- pluginsConfigurations.add(
- PluginConfigurationImpl(
- DokkaBase::class.qualifiedName!!,
- DokkaConfiguration.SerializationFormat.JSON,
- """{ "mergeImplicitExpectActualDeclarations": $switchOn }""",
- )
- )
- }
-
- private fun ContentNode.findTabWithType(type: TabbedContentType): ContentNode? = dfs { node ->
- node.children.filterIsInstance<ContentGroup>().any { gr ->
- gr.extra[TabbedContentTypeExtra]?.value == type
- }
- }
-
- @Test
- fun `should merge fun`() {
- testInline(
- """
-
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | fun method1(): String
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | fun method1(): Int
- |}
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "classA" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val functions = classPage.findSectionWithName("Functions").assertNotNull("Functions")
- val method1 = functions.children.singleOrNull().assertNotNull("method1")
-
- assertEquals(
- 2,
- method1.firstChildOfType<ContentDivergentGroup>().childrenOfType<ContentDivergentInstance>().size,
- "Incorrect number of divergent instances found"
- )
-
- val methodPage = root.dfs { it.name == "method1" } as? MemberPageNode
- assertNotNull(methodPage, "Tested method not found!")
-
- val divergentGroup = methodPage.content.dfs { it is ContentDivergentGroup } as? ContentDivergentGroup
-
- assertEquals(
- 2,
- divergentGroup?.childrenOfType<ContentDivergentInstance>()?.size,
- "Incorrect number of divergent instances found in method page"
- )
- }
- }
- }
-
- @Test
- fun `should merge class and typealias`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class A {
- | fun method1(): String
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |typealias A = String
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "A" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val platformHintedContent = classPage.content.dfs { it is PlatformHintedContent }.assertNotNull("platformHintedContent")
- assertEquals(2, platformHintedContent.sourceSets.size)
-
- platformHintedContent.dfs { it is ContentText && it.text == "class " }.assertNotNull("class keyword")
- platformHintedContent.dfs { it is ContentText && it.text == "typealias " }.assertNotNull("typealias keyword")
- }
- }
- }
- @Test
- fun `should merge method and prop`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | fun method1(): String
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | val prop1: Int
- |}
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "classA" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val props = classPage.findSectionWithName("Properties").assertNotNull("Properties")
- props.children.singleOrNull().assertNotNull("prop1")
-
- val functions = classPage.findSectionWithName("Functions").assertNotNull("Functions")
- functions.children.singleOrNull().assertNotNull("method1")
- }
- }
- }
-
- @Test
- fun `should merge prop`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | val prop1: String
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | val prop1: Int
- |}
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "classA" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val props = classPage.findSectionWithName("Properties").assertNotNull("Properties")
- val prop1 = props.children.singleOrNull().assertNotNull("prop1")
-
- assertEquals(
- 2,
- prop1.firstChildOfType<ContentDivergentGroup>().children.size,
- "Incorrect number of divergent instances found"
- )
-
- val propPage = root.dfs { it.name == "prop1" } as? MemberPageNode
- assertNotNull(propPage, "Tested method not found!")
-
- val divergentGroup = propPage.content.dfs { it is ContentDivergentGroup } as? ContentDivergentGroup
-
- assertEquals(
- 2,
- divergentGroup?.childrenOfType<ContentDivergentInstance>()?.size,
- "Incorrect number of divergent instances found in method page"
- )
- }
- }
- }
-
- @Test
- fun `should merge enum and class`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | val prop1: String
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |enum class classA {
- | ENTRY
- |}
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "classA" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val entries = classPage.content.findTabWithType(BasicTabbedContentType.ENTRY).assertNotNull("Entries")
- entries.children.singleOrNull().assertNotNull("ENTRY")
-
- val props = classPage.findSectionWithName("Properties").assertNotNull("Properties")
- assertEquals(
- 3,
- props.children.size,
- "Incorrect number of properties found in method page"
- )
- }
- }
- }
-
- fun PageNode.childrenRec(): List<PageNode> = listOf(this) + children.flatMap { it.childrenRec() }
-
- @Test
- fun `should merge enum entries`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |enum class classA {
- | SMTH;
- | fun method1(): Int
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |enum class classA {
- | SMTH;
- | fun method1(): Int
- |}
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "SMTH" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val functions = classPage.findSectionWithName("Functions").assertNotNull("Functions")
- val method1 = functions.children.single { it.sourceSets.size == 2 && it.dci.dri.singleOrNull()?.callable?.name == "method1" }
- .assertNotNull("method1")
-
- assertEquals(
- 2,
- method1.firstChildOfType<ContentDivergentGroup>().childrenOfType<ContentDivergentInstance>().size,
- "Incorrect number of divergent instances found"
- )
- }
- }
- }
-
- /**
- * There is a case when a property and fun from different source sets
- * have the same name so pages have the same urls respectively.
- */
- @Test
- fun `should no merge prop and method with the same name`() {
- testInline(
- """
- |/src/jvmMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | fun merged():String
- |}
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |class classA {
- | val merged:String
- |}
- |
- """.trimMargin(),
- configuration(true),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val allChildren = root.childrenRec().filterIsInstance<MemberPageNode>()
-
- assertEquals(
- 1,
- allChildren.filter { it.name == "merged" }.size,
- "Incorrect number of fun pages"
- )
- }
- }
- }
-
- @Test
- fun `should always merge constructor`() {
- testInline(
- """
- |/src/commonMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |expect class classA(a: Int)
- |
- |/src/jsMain/kotlin/pageMerger/Test.kt
- |package pageMerger
- |
- |actual class classA(a: Int)
- """.trimMargin(),
- configuration(false),
- cleanupOutput = true
- ) {
- pagesTransformationStage = { root ->
- val classPage = root.dfs { it.name == "classA" } as? ClasslikePageNode
- assertNotNull(classPage, "Tested class not found!")
-
- val constructors = classPage.findSectionWithName("Constructors").assertNotNull("Constructors")
-
- assertEquals(
- 1,
- constructors.children.size,
- "Incorrect number of constructors"
- )
-
- val platformHinted = constructors.dfs { it is PlatformHintedContent } as? PlatformHintedContent
-
- assertEquals(
- 2,
- platformHinted?.sourceSets?.size,
- "Incorrect number of source sets"
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerFunctionalTest.kt b/plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerFunctionalTest.kt
deleted file mode 100644
index 54f0120a..00000000
--- a/plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerFunctionalTest.kt
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.junit.jupiter.api.io.TempDir
-import transformers.AbstractContextModuleAndPackageDocumentationReaderTest.Companion.texts
-import utils.OnlyDescriptorsMPP
-import java.nio.file.Path
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ModuleAndPackageDocumentationTransformerFunctionalTest : BaseAbstractTest() {
-
- @OnlyDescriptorsMPP("#3238")
- @Test
- fun `multiplatform project`(@TempDir tempDir: Path) {
- val include = tempDir.resolve("include.md").toFile()
- include.writeText(
- """
- # Module moduleA
- This is moduleA
-
- # Package
- This is the root package
-
- # Package [root]
- This is also the root package
-
- # Package common
- This is the common package
-
- # Package jvm
- This is the jvm package
-
- # Package js
- This is the js package
- """.trimIndent()
- )
- val configuration = dokkaConfiguration {
- moduleName = "moduleA"
- sourceSets {
- sourceSet {
- name = "commonMain"
- displayName = "common"
- analysisPlatform = "common"
- sourceRoots = listOf("src/commonMain/kotlin")
- includes = listOf(include.canonicalPath)
- }
- sourceSet {
- name = "jsMain"
- displayName = "js"
- analysisPlatform = "js"
- sourceRoots = listOf("src/jsMain/kotlin")
- dependentSourceSets = setOf(DokkaSourceSetID("moduleA", "commonMain"))
- includes = listOf(include.canonicalPath)
- }
- sourceSet {
- name = "jvmMain"
- displayName = "jvm"
- analysisPlatform = "jvm"
- sourceRoots = listOf("src/jvmMain/kotlin")
- dependentSourceSets = setOf(DokkaSourceSetID("moduleA", "commonMain"))
- includes = listOf(include.canonicalPath)
- }
- }
- }
-
- testInline(
- """
- /src/commonMain/kotlin/common/CommonApi.kt
- package common
- val commonApi = "common"
-
- /src/jsMain/kotlin/js/JsApi.kt
- package js
- val jsApi = "js"
-
- /src/jvmMain/kotlin/jvm/JvmApi.kt
- package jvm
- val jvmApi = "jvm"
-
- /src/commonMain/kotlin/CommonRoot.kt
- val commonRoot = "commonRoot"
-
- /src/jsMain/kotlin/JsRoot.kt
- val jsRoot = "jsRoot"
-
- /src/jvmMain/kotlin/JvmRoot.kt
- val jvmRoot = "jvmRoot"
- """.trimIndent(),
- configuration
- ) {
- this.documentablesMergingStage = { module ->
- val packageNames = module.packages.map { it.dri.packageName ?: "NULL" }
- assertEquals(
- listOf("", "common", "js", "jvm").sorted(), packageNames.sorted(),
- "Expected all packages to be present"
- )
-
- /* Assert module documentation */
- assertEquals(3, module.documentation.keys.size, "Expected all three source sets")
- assertEquals("This is moduleA", module.documentation.texts.distinct().joinToString())
-
- /* Assert root package */
- val rootPackage = module.packages.single { it.dri.packageName == "" }
- assertEquals(3, rootPackage.documentation.keys.size, "Expected all three source sets")
- assertEquals(
- listOf("This is the root package", "This is also the root package"),
- rootPackage.documentation.texts.distinct()
- )
-
- /* Assert common package */
- val commonPackage = module.packages.single { it.dri.packageName == "common" }
- assertEquals(3, commonPackage.documentation.keys.size, "Expected all three source sets")
- assertEquals("This is the common package", commonPackage.documentation.texts.distinct().joinToString())
-
- /* Assert js package */
- val jsPackage = module.packages.single { it.dri.packageName == "js" }
- assertEquals(
- "This is the js package",
- jsPackage.documentation.texts.joinToString()
- )
-
- /* Assert the jvm package */
- val jvmPackage = module.packages.single { it.dri.packageName == "jvm" }
- assertEquals(
- "This is the jvm package",
- jvmPackage.documentation.texts.joinToString()
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerUnitTest.kt b/plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerUnitTest.kt
deleted file mode 100644
index a54b6c68..00000000
--- a/plugins/base/src/test/kotlin/transformers/ModuleAndPackageDocumentationTransformerUnitTest.kt
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.analysis.kotlin.internal.ModuleAndPackageDocumentationReader
-import org.jetbrains.dokka.analysis.markdown.jb.MARKDOWN_ELEMENT_FILE_NAME
-import org.jetbrains.dokka.base.transformers.documentables.ModuleAndPackageDocumentationTransformer
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.model.DPackage
-import org.jetbrains.dokka.model.SourceSetDependent
-import org.jetbrains.dokka.model.doc.CustomDocTag
-import org.jetbrains.dokka.model.doc.Description
-import org.jetbrains.dokka.model.doc.DocumentationNode
-import org.jetbrains.dokka.model.doc.Text
-import testApi.testRunner.dPackage
-import testApi.testRunner.sourceSet
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-
-class ModuleAndPackageDocumentationTransformerUnitTest {
-
- @Test
- fun `empty list of modules`() {
- val transformer = ModuleAndPackageDocumentationTransformer(
- object : ModuleAndPackageDocumentationReader {
- override fun read(module: DModule): SourceSetDependent<DocumentationNode> = throw NotImplementedError()
- override fun read(pkg: DPackage): SourceSetDependent<DocumentationNode> = throw NotImplementedError()
- override fun read(module: DokkaConfiguration.DokkaModuleDescription): DocumentationNode = throw NotImplementedError()
- }
- )
-
- assertEquals(
- emptyList<DModule>(), transformer(emptyList()),
- )
- }
-
- @Test
- fun `single module documentation`() {
- val transformer = ModuleAndPackageDocumentationTransformer(
- object : ModuleAndPackageDocumentationReader {
- override fun read(pkg: DPackage): SourceSetDependent<DocumentationNode> = throw NotImplementedError()
- override fun read(module: DModule): SourceSetDependent<DocumentationNode> {
- return module.sourceSets.associateWith { sourceSet ->
- documentationNode("doc" + sourceSet.displayName)
- }
- }
- override fun read(module: DokkaConfiguration.DokkaModuleDescription): DocumentationNode = throw NotImplementedError()
- }
- )
-
- val result = transformer(
- listOf(
- DModule(
- "ModuleName",
- documentation = emptyMap(),
- packages = emptyList(),
- sourceSets = setOf(
- sourceSet("A"),
- sourceSet("B")
- )
- )
- )
- )
-
- assertEquals(
- DModule(
- "ModuleName",
- documentation = mapOf(
- sourceSet("A") to documentationNode("docA"),
- sourceSet("B") to documentationNode("docB")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B")),
- packages = emptyList()
- ),
- result.single()
- )
-
- }
-
- @Test
- fun `merges with already existing module documentation`() {
- val transformer = ModuleAndPackageDocumentationTransformer(
- object : ModuleAndPackageDocumentationReader {
- override fun read(pkg: DPackage): SourceSetDependent<DocumentationNode> = throw NotImplementedError()
- override fun read(module: DModule): SourceSetDependent<DocumentationNode> {
- /* Only add documentation for first source set */
- return module.sourceSets.take(1).associateWith { sourceSet ->
- documentationNode("doc" + sourceSet.displayName)
- }
- }
- override fun read(module: DokkaConfiguration.DokkaModuleDescription): DocumentationNode = throw NotImplementedError()
- }
- )
-
- val result = transformer(
- listOf(
- DModule(
- "MyModule",
- documentation = mapOf(
- sourceSet("A") to documentationNode("pre-existing:A"),
- sourceSet("B") to documentationNode("pre-existing:B")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B")),
- packages = emptyList()
- )
- )
- )
-
- assertEquals(
- DModule(
- "MyModule",
- documentation = mapOf(
- /* Expect previous documentation and newly attached one */
- sourceSet("A") to documentationNode("pre-existing:A", "docA"),
- /* Only first source set will get documentation attached */
- sourceSet("B") to documentationNode("pre-existing:B")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B")),
- packages = emptyList()
- ),
- result.single()
- )
- }
-
- @Test
- fun `package documentation`() {
- val transformer = ModuleAndPackageDocumentationTransformer(
- object : ModuleAndPackageDocumentationReader {
- override fun read(module: DModule): SourceSetDependent<DocumentationNode> = emptyMap()
- override fun read(pkg: DPackage): SourceSetDependent<DocumentationNode> {
- /* Only attach documentation to packages with 'attach' */
- if ("attach" !in pkg.dri.packageName.orEmpty()) return emptyMap()
- /* Only attach documentation to two source sets */
- return pkg.sourceSets.take(2).associateWith { sourceSet ->
- documentationNode("doc:${sourceSet.displayName}:${pkg.dri.packageName}")
- }
- }
- override fun read(module: DokkaConfiguration.DokkaModuleDescription): DocumentationNode = throw NotImplementedError()
- }
- )
-
- val result = transformer(
- listOf(
- DModule(
- "MyModule",
- documentation = emptyMap(),
- sourceSets = emptySet(),
- packages = listOf(
- dPackage(
- dri = DRI("com.sample"),
- documentation = mapOf(
- sourceSet("A") to documentationNode("pre-existing:A:com.sample")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B"), sourceSet("C")),
- ),
- dPackage(
- dri = DRI("com.attach"),
- documentation = mapOf(
- sourceSet("A") to documentationNode("pre-existing:A:com.attach")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B"), sourceSet("C"))
- ),
- dPackage(
- dri = DRI("com.attach.sub"),
- documentation = mapOf(
- sourceSet("A") to documentationNode("pre-existing:A:com.attach.sub"),
- sourceSet("B") to documentationNode("pre-existing:B:com.attach.sub"),
- sourceSet("C") to documentationNode("pre-existing:C:com.attach.sub")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B"), sourceSet("C")),
- )
- )
- )
- )
- )
-
- result.single().packages.forEach { pkg ->
- assertEquals(
- setOf(sourceSet("A"), sourceSet("B"), sourceSet("C")), pkg.sourceSets,
- "Expected source sets A, B, C for package ${pkg.dri.packageName}"
- )
- }
-
- val comSample = result.single().packages.single { it.dri.packageName == "com.sample" }
- assertEquals(
- mapOf(sourceSet("A") to documentationNode("pre-existing:A:com.sample")),
- comSample.documentation,
- "Expected no documentation added to package 'com.sample' because of wrong package"
- )
-
- val comAttach = result.single().packages.single { it.dri.packageName == "com.attach" }
- assertEquals(
- mapOf(
- sourceSet("A") to documentationNode("pre-existing:A:com.attach", "doc:A:com.attach"),
- sourceSet("B") to documentationNode("doc:B:com.attach")
- ),
- comAttach.documentation,
- "Expected documentation added to source sets A and B"
- )
-
- assertEquals(
- DModule(
- "MyModule",
- documentation = emptyMap(),
- sourceSets = emptySet(),
- packages = listOf(
- dPackage(
- dri = DRI("com.sample"),
- documentation = mapOf(
- /* No documentation added, since in wrong package */
- sourceSet("A") to documentationNode("pre-existing:A:com.sample")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B"), sourceSet("C")),
-
- ),
- dPackage(
- dri = DRI("com.attach"),
- documentation = mapOf(
- /* Documentation added */
- sourceSet("A") to documentationNode("pre-existing:A:com.attach", "doc:A:com.attach"),
- sourceSet("B") to documentationNode("doc:B:com.attach")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B"), sourceSet("C")),
- ),
- dPackage(
- dri = DRI("com.attach.sub"),
- documentation = mapOf(
- /* Documentation added */
- sourceSet("A") to documentationNode(
- "pre-existing:A:com.attach.sub",
- "doc:A:com.attach.sub"
- ),
- /* Documentation added */
- sourceSet("B") to documentationNode(
- "pre-existing:B:com.attach.sub",
- "doc:B:com.attach.sub"
- ),
- /* No documentation added, since in wrong source set */
- sourceSet("C") to documentationNode("pre-existing:C:com.attach.sub")
- ),
- sourceSets = setOf(sourceSet("A"), sourceSet("B"), sourceSet("C")),
- )
- )
- ), result.single()
- )
- }
-
-
- private fun documentationNode(vararg texts: String): DocumentationNode {
- return DocumentationNode(
- texts.toList()
- .map { Description(CustomDocTag(listOf(Text(it)), name = MARKDOWN_ELEMENT_FILE_NAME)) })
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt b/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt
deleted file mode 100644
index d035948f..00000000
--- a/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.MethodSource
-import testApi.testRunner.dokkaConfiguration
-import kotlin.test.assertEquals
-
-class ObviousAndInheritedFunctionsDocumentableFilterTest : BaseAbstractTest() {
- companion object {
- @JvmStatic
- fun suppressingObviousConfiguration() = listOf(dokkaConfiguration {
- suppressInheritedMembers = false
- suppressObviousFunctions = true
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- })
-
- @JvmStatic
- fun nonSuppressingObviousConfiguration() = listOf(dokkaConfiguration {
- suppressObviousFunctions = false
- suppressInheritedMembers = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- })
-
- @JvmStatic
- fun suppressingInheritedConfiguration() = listOf(dokkaConfiguration {
- suppressInheritedMembers = true
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- })
-
- @JvmStatic
- fun nonSuppressingInheritedConfiguration() = listOf(dokkaConfiguration {
- suppressObviousFunctions = false
- suppressInheritedMembers = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- })
- }
-
-
- @ParameterizedTest
- @MethodSource(value = ["suppressingObviousConfiguration"])
- fun `should suppress toString, equals and hashcode`(suppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- data class Suppressed(val x: String)
- """.trimIndent(),
- suppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(0, functions.size)
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["suppressingObviousConfiguration", "suppressingInheritedConfiguration"])
- fun `should suppress toString, equals and hashcode for interface`(suppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- interface Suppressed
- """.trimIndent(),
- suppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(0, functions.size)
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["suppressingObviousConfiguration", "suppressingInheritedConfiguration"])
- fun `should suppress toString, equals and hashcode in Java`(suppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.java
- package suppressed;
- public class Suppressed {
- }
- """.trimIndent(),
- suppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(0, functions.size)
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["suppressingObviousConfiguration"])
- fun `should suppress toString, equals and hashcode but keep custom ones`(suppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- data class Suppressed(val x: String) {
- override fun toString(): String {
- return "custom"
- }
- }
- """.trimIndent(),
- suppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(listOf("toString"), functions.map { it.name })
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["suppressingObviousConfiguration", "suppressingInheritedConfiguration"])
- fun `should suppress toString, equals and hashcode but keep custom ones in Java`(suppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.java
- package suppressed;
- public class Suppressed {
- @Override
- public String toString() {
- return "";
- }
- }
- """.trimIndent(),
- suppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(listOf("toString"), functions.map { it.name })
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["nonSuppressingObviousConfiguration", "nonSuppressingInheritedConfiguration"])
- fun `should not suppress toString, equals and hashcode if custom config is provided`(nonSuppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- data class Suppressed(val x: String)
- """.trimIndent(),
- nonSuppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(
- listOf("copy", "equals", "toString", "component1", "hashCode").sorted(),
- functions.map { it.name }.sorted()
- )
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["nonSuppressingObviousConfiguration", "nonSuppressingInheritedConfiguration"])
- fun `not should suppress toString, equals and hashcode for interface if custom config is provided`(nonSuppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- interface Suppressed
- """.trimIndent(),
- nonSuppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(listOf("equals", "hashCode", "toString").sorted(), functions.map { it.name }.sorted())
- }
- }
- }
-
- @ParameterizedTest
- @MethodSource(value = ["nonSuppressingObviousConfiguration", "nonSuppressingInheritedConfiguration"])
- fun `should not suppress toString, equals and hashcode if custom config is provided in Java`(nonSuppressingConfiguration: DokkaConfigurationImpl) {
- testInline(
- """
- /src/suppressed/Suppressed.java
- package suppressed;
- public class Suppressed {
- }
- """.trimIndent(),
- nonSuppressingConfiguration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val functions = modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- //I would normally just assert names but this would make it JDK dependent, so this is better
- assertEquals(
- 5,
- setOf(
- "equals",
- "hashCode",
- "toString",
- "notify",
- "notifyAll"
- ).intersect(functions.map { it.name }).size
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/ReportUndocumentedTransformerTest.kt b/plugins/base/src/test/kotlin/transformers/ReportUndocumentedTransformerTest.kt
deleted file mode 100644
index c824e690..00000000
--- a/plugins/base/src/test/kotlin/transformers/ReportUndocumentedTransformerTest.kt
+++ /dev/null
@@ -1,927 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaDefaults
-import org.jetbrains.dokka.PackageOptionsImpl
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Ignore
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-
-class ReportUndocumentedTransformerTest : BaseAbstractTest() {
- @Test
- fun `undocumented class gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |class X
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport(Regex("init"))
- assertSingleUndocumentedReport(Regex("""sample/X/"""))
- }
- }
- }
-
- @Test
- fun `undocumented non-public class does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |internal class X
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `undocumented function gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |class X {
- | fun x()
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- assertSingleUndocumentedReport(Regex("X/x"))
- }
- }
- }
-
- @Test
- fun `undocumented property gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |class X {
- | val x: Int = 0
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- assertSingleUndocumentedReport(Regex("X/x"))
- }
- }
- }
-
- @Test
- fun `undocumented primary constructor does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |class X(private val x: Int) {
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `data class component functions do not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |data class X(val x: Int) {
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport(Regex("component"))
- assertNumberOfUndocumentedReports(1)
- }
- }
- }
-
- @Ignore
- @Test
- fun `undocumented secondary constructor gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |class X {
- | constructor(unit: Unit) : this()
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- assertSingleUndocumentedReport(Regex("X.*init.*Unit"))
- }
- }
- }
-
- @Test
- fun `undocumented inherited function does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |open class A {
- | fun a() = Unit
- |}
- |
- |/** Documented */
- |class B : A()
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport(Regex("B"))
- assertSingleUndocumentedReport(Regex("A.*a"))
- }
- }
- }
-
- @Test
- fun `undocumented inherited property does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |/** Documented */
- |open class A {
- | val a = Unit
- |}
- |
- |/** Documented */
- |class B : A()
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport(Regex("B"))
- assertSingleUndocumentedReport(Regex("A.*a"))
- }
- }
- }
-
- @Test
- fun `overridden function does not get reported when super is documented`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |import kotlin.Exception
- |
- |/** Documented */
- |open class A {
- | /** Documented */
- | fun a() = Unit
- |}
- |
- |/** Documented */
- |class B : A() {
- | override fun a() = throw Exception()
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `overridden property does not get reported when super is documented`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |import kotlin.Exception
- |
- |/** Documented */
- |open class A {
- | /** Documented */
- | open val a = 0
- |}
- |
- |/** Documented */
- |class B : A() {
- | override val a = 1
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `report disabled by source set`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = false
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |class X
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `report enabled by package configuration`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- perPackageOptions += packageOptions(
- matchingRegex = "sample.*",
- reportUndocumented = true,
- )
- reportUndocumented = false
- sourceRoots = listOf("src/main/kotlin/Test.kt")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/Test.kt
- |package sample
- |
- |class X
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- }
- }
- }
-
- @Test
- fun `report enabled by more specific package configuration`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- perPackageOptions += packageOptions(
- matchingRegex = "sample.*",
- reportUndocumented = false,
- )
- perPackageOptions += packageOptions(
- matchingRegex = "sample.enabled.*",
- reportUndocumented = true,
- )
- reportUndocumented = false
- sourceRoots = listOf("src/main/kotlin/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/sample/disabled/Disabled.kt
- |package sample.disabled
- |class Disabled
- |
- |/src/main/kotlin/sample/enabled/Enabled.kt
- |package sample.enabled
- |class Enabled
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("Enabled"))
- assertNumberOfUndocumentedReports(1)
- }
- }
- }
-
- @Test
- fun `report disabled by more specific package configuration`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- perPackageOptions += packageOptions(
- matchingRegex = "sample.*",
- reportUndocumented = true,
- )
- perPackageOptions += packageOptions(
- matchingRegex = "sample.disabled.*",
- reportUndocumented = false,
- )
- reportUndocumented = true
- sourceRoots = listOf("src/main/kotlin/")
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/sample/disabled/Disabled.kt
- |package sample.disabled
- |class Disabled
- |
- |/src/main/kotlin/sample/enabled/Enabled.kt
- |package sample.enabled
- |class Enabled
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("Enabled"))
- assertNumberOfUndocumentedReports(1)
- }
- }
- }
-
- @Test
- fun `multiplatform undocumented class gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- val commonMain by sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.common.toString()
- name = "commonMain"
- displayName = "commonMain"
- sourceRoots = listOf("src/commonMain/kotlin")
- }
-
- sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.jvm.toString()
- name = "jvmMain"
- displayName = "jvmMain"
- sourceRoots = listOf("src/jvmMain/kotlin")
- dependentSourceSets = setOf(commonMain.sourceSetID)
- }
- }
- }
-
- testInline(
- """
- |/src/commonMain/kotlin/sample/Common.kt
- |package sample
- |expect class X
- |
- |/src/jvmMain/kotlin/sample/JvmMain.kt
- |package sample
- |actual class X
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNumberOfUndocumentedReports(2, Regex("X"))
- assertSingleUndocumentedReport(Regex("X.*jvmMain"))
- assertSingleUndocumentedReport(Regex("X.*commonMain"))
- }
- }
- }
-
- @Test
- fun `multiplatform undocumented class does not get reported if expect is documented`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- val commonMain by sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.common.toString()
- name = "commonMain"
- displayName = "commonMain"
- sourceRoots = listOf("src/commonMain/kotlin")
- }
-
- sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.jvm.toString()
- name = "jvmMain"
- displayName = "jvmMain"
- sourceRoots = listOf("src/jvmMain/kotlin")
- dependentSourceSets = setOf(commonMain.sourceSetID)
- }
- }
- }
-
- testInline(
- """
- |/src/commonMain/kotlin/sample/Common.kt
- |package sample
- |/** Documented */
- |expect class X
- |
- |/src/jvmMain/kotlin/sample/JvmMain.kt
- |package sample
- |actual class X
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNumberOfUndocumentedReports(0)
- }
- }
- }
-
- @Test
- fun `multiplatform undocumented function gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- val commonMain by sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.common.toString()
- name = "commonMain"
- displayName = "commonMain"
- sourceRoots = listOf("src/commonMain/kotlin")
- }
-
- sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.jvm.toString()
- name = "jvmMain"
- displayName = "jvmMain"
- sourceRoots = listOf("src/jvmMain/kotlin")
- dependentSourceSets = setOf(commonMain.sourceSetID)
- }
-
- sourceSet {
- reportUndocumented = true
- analysisPlatform = Platform.native.toString()
- name = "macosMain"
- displayName = "macosMain"
- sourceRoots = listOf("src/macosMain/kotlin")
- dependentSourceSets = setOf(commonMain.sourceSetID)
- }
- }
- }
-
- testInline(
- """
- |/src/commonMain/kotlin/sample/Common.kt
- |package sample
- |expect fun x()
- |
- |/src/macosMain/kotlin/sample/MacosMain.kt
- |package sample
- |/** Documented */
- |actual fun x() = Unit
- |
- |/src/jvmMain/kotlin/sample/JvmMain.kt
- |package sample
- |actual fun x() = Unit
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNumberOfUndocumentedReports(2)
- assertSingleUndocumentedReport(Regex("x.*commonMain"))
- assertSingleUndocumentedReport(Regex("x.*jvmMain"))
- }
- }
- }
-
- @Test
- fun `java undocumented class gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Test.java
- |package sample
- |public class Test { }
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport(Regex("init"))
- assertSingleUndocumentedReport(Regex("""Test"""))
- assertNumberOfUndocumentedReports(1)
- }
- }
- }
-
- @Test
- fun `java undocumented non-public class does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Test.java
- |package sample
- |class Test { }
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `java undocumented constructor does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Test.java
- |package sample
- |/** Documented */
- |public class Test {
- | public Test() {
- | }
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `java undocumented method gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/X.java
- |package sample
- |/** Documented */
- |public class X {
- | public void x { }
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- assertSingleUndocumentedReport(Regex("X.*x"))
- assertNumberOfUndocumentedReports(1)
- }
- }
- }
-
- @Test
- fun `java undocumented property gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/X.java
- |package sample
- |/** Documented */
- |public class X {
- | public int x = 0;
- |}
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- assertSingleUndocumentedReport(Regex("X.*x"))
- assertNumberOfUndocumentedReports(1)
- }
- }
- }
-
- @Test
- fun `java undocumented inherited method gets reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Super.java
- |package sample
- |/** Documented */
- |public class Super {
- | public void x() {}
- |}
- |
- |/src/main/java/sample/X.java
- |package sample
- |/** Documented */
- |public class X extends Super {
- | public void x() {}
- |}
- |
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertSingleUndocumentedReport(Regex("X"))
- assertSingleUndocumentedReport(Regex("X.*x"))
- assertSingleUndocumentedReport(Regex("Super.*x"))
- assertNumberOfUndocumentedReports(2)
- }
- }
- }
-
- @Test
- fun `java documented inherited method does not get reported`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Super.java
- |package sample
- |/** Documented */
- |public class Super {
- | /** Documented */
- | public void x() {}
- |}
- |
- |/src/main/java/sample/X.java
- |package sample
- |/** Documented */
- |public class X extends Super {
- |
- |}
- |
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- @Test
- fun `java overridden function does not get reported when super is documented`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- reportUndocumented = true
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Super.java
- |package sample
- |/** Documented */
- |public class Super {
- | /** Documented */
- | public void x() {}
- |}
- |
- |/src/main/java/sample/X.java
- |package sample
- |/** Documented */
- |public class X extends Super {
- | @Override
- | public void x() {}
- |}
- |
- """.trimMargin(),
- configuration
- ) {
- pagesTransformationStage = {
- assertNoUndocumentedReport()
- }
- }
- }
-
- private fun assertNumberOfUndocumentedReports(expectedReports: Int, regex: Regex = Regex(".")) {
- val reports = logger.warnMessages
- .filter { it.startsWith("Undocumented:") }
- val matchingReports = reports
- .filter { it.contains(regex) }
-
- assertEquals(
- expectedReports, matchingReports.size,
- "Expected $expectedReports report of documented code ($regex).\n" +
- "Found matching reports: $matchingReports\n" +
- "Found reports: $reports"
- )
- }
-
- private fun assertSingleUndocumentedReport(regex: Regex) {
- assertNumberOfUndocumentedReports(1, regex)
- }
-
- private fun assertNoUndocumentedReport(regex: Regex) {
- assertNumberOfUndocumentedReports(0, regex)
- }
-
- private fun assertNoUndocumentedReport() {
- assertNoUndocumentedReport(Regex("."))
- }
-
- private fun packageOptions(
- matchingRegex: String,
- reportUndocumented: Boolean?,
- includeNonPublic: Boolean = true,
- skipDeprecated: Boolean = false,
- suppress: Boolean = false,
- documentedVisibilities: Set<DokkaConfiguration.Visibility> = DokkaDefaults.documentedVisibilities
- ) = PackageOptionsImpl(
- matchingRegex = matchingRegex,
- reportUndocumented = reportUndocumented,
- includeNonPublic = includeNonPublic,
- documentedVisibilities = documentedVisibilities,
- skipDeprecated = skipDeprecated,
- suppress = suppress
- )
-}
diff --git a/plugins/base/src/test/kotlin/transformers/SourceLinkTransformerTest.kt b/plugins/base/src/test/kotlin/transformers/SourceLinkTransformerTest.kt
deleted file mode 100644
index 87424120..00000000
--- a/plugins/base/src/test/kotlin/transformers/SourceLinkTransformerTest.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.SourceLinkDefinitionImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jsoup.nodes.Element
-import signatures.renderedContent
-import utils.TestOutputWriterPlugin
-import java.net.URL
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class SourceLinkTransformerTest : BaseAbstractTest() {
-
- private fun Element.getSourceLink() = select(".symbol .floating-right")
- .select("a[href]")
- .attr("href")
-
- @Test
- fun `source link should lead to name`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- sourceLinks = listOf(
- SourceLinkDefinitionImpl(
- localDirectory = "src/main/kotlin",
- remoteUrl = URL("https://github.com/user/repo/tree/master/src/main/kotlin"),
- remoteLineSuffix = "#L"
- )
- )
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/basic/Deprecated.kt
- |package testpackage
- |
- |/**
- |* Marks the annotated declaration as deprecated. ...
- |*/
- |@Target(CLASS, FUNCTION, PROPERTY, ANNOTATION_CLASS, CONSTRUCTOR, PROPERTY_SETTER, PROPERTY_GETTER, TYPEALIAS)
- |@MustBeDocumented
- |public annotation class Deprecated(
- | val message: String,
- | val replaceWith: ReplaceWith = ReplaceWith(""),
- | val level: DeprecationLevel = DeprecationLevel.WARNING
- |)
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val page = writerPlugin.writer.renderedContent("root/testpackage/-deprecated/index.html")
- val sourceLink = page.getSourceLink()
-
- assertEquals(
- "https://github.com/user/repo/tree/master/src/main/kotlin/basic/Deprecated.kt#L8",
- sourceLink
- )
- }
- }
- }
-
- @Test
- fun `source link should be for actual typealias`() {
- val mppConfiguration = dokkaConfiguration {
- moduleName = "test"
- sourceSets {
- sourceSet {
- name = "common"
- sourceRoots = listOf("src/main/kotlin/common/Test.kt")
- classpath = listOf(commonStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- }
- sourceSet {
- name = "jvm"
- dependentSourceSets = setOf(DokkaSourceSetID("test", "common"))
- sourceRoots = listOf("src/main/kotlin/jvm/Test.kt")
- classpath = listOf(commonStdlibPath!!)
- externalDocumentationLinks = listOf(stdlibExternalDocumentationLink)
- sourceLinks = listOf(
- SourceLinkDefinitionImpl(
- localDirectory = "src/main/kotlin",
- remoteUrl = URL("https://github.com/user/repo/tree/master/src/main/kotlin"),
- remoteLineSuffix = "#L"
- )
- )
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/common/Test.kt
- |package example
- |
- |expect class Foo
- |
- |/src/main/kotlin/jvm/Test.kt
- |package example
- |
- |class Bar
- |actual typealias Foo = Bar
- |
- """.trimMargin(),
- mppConfiguration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val page = writerPlugin.writer.renderedContent("test/example/-foo/index.html")
- val sourceLink = page.getSourceLink()
-
- assertEquals(
- "https://github.com/user/repo/tree/master/src/main/kotlin/jvm/Test.kt#L4",
- sourceLink
- )
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/SuppressTagFilterTest.kt b/plugins/base/src/test/kotlin/transformers/SuppressTagFilterTest.kt
deleted file mode 100644
index 5392a028..00000000
--- a/plugins/base/src/test/kotlin/transformers/SuppressTagFilterTest.kt
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DEnum
-import org.jetbrains.dokka.model.WithCompanion
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-class SuppressTagFilterTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- }
- }
- }
-
- @Test
- fun `should filter classes with suppress tag`() {
- testInline(
- """
- |/src/suppressed/NotSuppressed.kt
- |/**
- | * sample docs
- |*/
- |class NotSuppressed
- |/src/suppressed/Suppressed.kt
- |/**
- | * sample docs
- | * @suppress
- |*/
- |class Suppressed
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- assertEquals(
- "NotSuppressed",
- modules.flatMap { it.packages }.flatMap { it.classlikes }.singleOrNull()?.name
- )
- }
- }
- }
-
- @Test
- fun `should filter functions with suppress tag`() {
- testInline(
- """
- |/src/suppressed/Suppressed.kt
- |class Suppressed {
- | /**
- | * sample docs
- | * @suppress
- | */
- | fun suppressedFun(){ }
- |}
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- assertNull(modules.flatMap { it.packages }.flatMap { it.classlikes }.flatMap { it.functions }
- .firstOrNull { it.name == "suppressedFun" })
- }
- }
- }
-
- @Test
- fun `should filter top level functions`() {
- testInline(
- """
- |/src/suppressed/Suppressed.kt
- |/**
- | * sample docs
- | * @suppress
- | */
- |fun suppressedFun(){ }
- |
- |/**
- | * Sample
- | */
- |fun notSuppressedFun() { }
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- assertNull(modules.flatMap { it.packages }.flatMap { it.functions }
- .firstOrNull { it.name == "suppressedFun" })
- }
- }
- }
-
- @Test
- fun `should filter setter`() {
- testInline(
- """
- |/src/suppressed/Suppressed.kt
- |var property: Int
- |/** @suppress */
- |private set
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val prop = modules.flatMap { it.packages }.flatMap { it.properties }
- .find { it.name == "property" }
- assertNotNull(prop)
- assertNotNull(prop.getter)
- assertNull(prop.setter)
- }
- }
- }
-
- @Test
- fun `should filter top level type aliases`() {
- testInline(
- """
- |/src/suppressed/suppressed.kt
- |/**
- | * sample docs
- | * @suppress
- | */
- |typealias suppressedTypeAlias = String
- |
- |/**
- | * Sample
- | */
- |typealias notSuppressedTypeAlias = String
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- assertNull(modules.flatMap { it.packages }.flatMap { it.typealiases }
- .firstOrNull { it.name == "suppressedTypeAlias" })
- assertNotNull(modules.flatMap { it.packages }.flatMap { it.typealiases }
- .firstOrNull { it.name == "notSuppressedTypeAlias" })
- }
- }
- }
-
- @Test
- fun `should filter companion object`() {
- testInline(
- """
- |/src/suppressed/Suppressed.kt
- |class Suppressed {
- |/**
- | * @suppress
- | */
- |companion object {
- | val x = 1
- |}
- |}
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- assertNull((modules.flatMap { it.packages }.flatMap { it.classlikes }
- .firstOrNull { it.name == "Suppressed" } as? WithCompanion)?.companion)
- }
- }
- }
-
- @Test
- fun `should suppress inner classlike`() {
- testInline(
- """
- |/src/suppressed/Testing.kt
- |class Testing {
- | /**
- | * Sample
- | * @suppress
- | */
- | inner class Suppressed {
- | val x = 1
- | }
- |}
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val testingClass = modules.flatMap { it.packages }.flatMap { it.classlikes }.single()
- assertNull(testingClass.classlikes.firstOrNull())
- }
- }
- }
-
- @Test
- fun `should suppress enum entry`() {
- testInline(
- """
- |/src/suppressed/Testing.kt
- |enum class Testing {
- | /**
- | * Sample
- | * @suppress
- | */
- | SUPPRESSED,
- |
- | /**
- | * Not suppressed
- | */
- | NOT_SUPPRESSED
- |}
- """.trimIndent(), configuration
- ) {
- preMergeDocumentablesTransformationStage = { modules ->
- val testingClass = modules.flatMap { it.packages }.flatMap { it.classlikes }.single() as DEnum
- assertEquals(listOf("NOT_SUPPRESSED"), testingClass.entries.map { it.name })
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/transformers/SuppressedByConfigurationDocumentableFilterTransformerTest.kt b/plugins/base/src/test/kotlin/transformers/SuppressedByConfigurationDocumentableFilterTransformerTest.kt
deleted file mode 100644
index f946a885..00000000
--- a/plugins/base/src/test/kotlin/transformers/SuppressedByConfigurationDocumentableFilterTransformerTest.kt
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.DokkaDefaults
-import org.jetbrains.dokka.PackageOptionsImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class SuppressedByConfigurationDocumentableFilterTransformerTest : BaseAbstractTest() {
-
- @Test
- fun `class filtered by package options`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- perPackageOptions = listOf(
- packageOptions(matchingRegex = "suppressed.*", suppress = true),
- packageOptions(matchingRegex = "default.*", suppress = false)
- )
- }
- }
- }
-
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- class Suppressed
-
- /src/default/Default.kt
- package default
- class Default.kt
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals(1, module.children.size, "Expected just a single package in module")
- assertEquals(1, module.packages.size, "Expected just a single package in module")
-
- val pkg = module.packages.single()
- assertEquals("default", pkg.dri.packageName, "Expected 'default' package in module")
- assertEquals(1, pkg.children.size, "Expected just a single child in 'default' package")
- assertEquals(1, pkg.classlikes.size, "Expected just a single child in 'default' package")
-
- val classlike = pkg.classlikes.single()
- assertEquals(DRI("default", "Default"), classlike.dri, "Expected 'Default' class in 'default' package")
- }
- }
- }
-
- @Test
- fun `class filtered by more specific package options`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- perPackageOptions = listOf(
- packageOptions(matchingRegex = "parent.some.*", suppress = false),
- packageOptions(matchingRegex = "parent.some.suppressed.*", suppress = true),
-
- packageOptions(matchingRegex = "parent.other.*", suppress = true),
- packageOptions(matchingRegex = "parent.other.default.*", suppress = false)
- )
- }
- }
- }
-
- testInline(
- """
- /src/parent/some/Some.kt
- package parent.some
- class Some
-
- /src/parent/some/suppressed/Suppressed.kt
- package parent.some.suppressed
- class Suppressed
-
- /src/parent/other/Other.kt
- package parent.other
- class Other
-
- /src/parent/other/default/Default.kt
- package parent.other.default
- class Default
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals(2, module.packages.size, "Expected two packages in module")
- assertEquals(
- listOf(DRI("parent.some"), DRI("parent.other.default")).sortedBy { it.packageName },
- module.packages.map { it.dri }.sortedBy { it.packageName },
- "Expected 'parent.some' and 'parent.other.default' packages to be not suppressed"
- )
- }
- }
- }
-
- @Test
- fun `class filtered by parent file path`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- suppressedFiles = listOf("src/suppressed")
- }
- }
- }
-
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- class Suppressed
-
- /src/default/Default.kt
- package default
- class Default.kt
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals(1, module.children.size, "Expected just a single package in module")
- assertEquals(1, module.packages.size, "Expected just a single package in module")
-
- val pkg = module.packages.single()
- assertEquals("default", pkg.dri.packageName, "Expected 'default' package in module")
- assertEquals(1, pkg.children.size, "Expected just a single child in 'default' package")
- assertEquals(1, pkg.classlikes.size, "Expected just a single child in 'default' package")
-
- val classlike = pkg.classlikes.single()
- assertEquals(DRI("default", "Default"), classlike.dri, "Expected 'Default' class in 'default' package")
- }
- }
- }
-
- @Test
- fun `class filtered by exact file path`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- suppressedFiles = listOf("src/suppressed/Suppressed.kt")
- }
- }
- }
-
- testInline(
- """
- /src/suppressed/Suppressed.kt
- package suppressed
- class Suppressed
-
- /src/default/Default.kt
- package default
- class Default.kt
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals(1, module.children.size, "Expected just a single package in module")
- assertEquals(1, module.packages.size, "Expected just a single package in module")
-
- val pkg = module.packages.single()
- assertEquals("default", pkg.dri.packageName, "Expected 'default' package in module")
- assertEquals(1, pkg.children.size, "Expected just a single child in 'default' package")
- assertEquals(1, pkg.classlikes.size, "Expected just a single child in 'default' package")
-
- val classlike = pkg.classlikes.single()
- assertEquals(DRI("default", "Default"), classlike.dri, "Expected 'Default' class in 'default' package")
- }
- }
- }
-
- private fun packageOptions(
- matchingRegex: String,
- suppress: Boolean
- ) = PackageOptionsImpl(
- matchingRegex = matchingRegex,
- suppress = suppress,
- includeNonPublic = true,
- documentedVisibilities = DokkaDefaults.documentedVisibilities,
- reportUndocumented = false,
- skipDeprecated = false
- )
-
-}
diff --git a/plugins/base/src/test/kotlin/transformers/isExceptionTest.kt b/plugins/base/src/test/kotlin/transformers/isExceptionTest.kt
deleted file mode 100644
index a387c60d..00000000
--- a/plugins/base/src/test/kotlin/transformers/isExceptionTest.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package transformers
-
-import org.jetbrains.dokka.base.transformers.documentables.isException
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DTypeAlias
-import utils.AbstractModelTest
-import kotlin.test.Test
-
-class IsExceptionKotlinTest : AbstractModelTest("/src/main/kotlin/classes/Test.kt", "classes") {
- @Test
- fun `isException should work for kotlin exception`(){
- inlineModelTest(
- """
- |class ExampleException(): Exception()"""
- ) {
- with((this / "classes" / "ExampleException").cast<DClass>()) {
- name equals "ExampleException"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should work for java exceptions`(){
- inlineModelTest(
- """
- |class ExampleException(): java.lang.Exception()"""
- ) {
- with((this / "classes" / "ExampleException").cast<DClass>()) {
- name equals "ExampleException"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should work for RuntimeException`(){
- inlineModelTest(
- """
- |class ExampleException(reason: String): RuntimeException(reason)"""
- ) {
- with((this / "classes" / "ExampleException").cast<DClass>()) {
- name equals "ExampleException"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should work if exception is typealiased`(){
- inlineModelTest(
- """
- |typealias ExampleException = java.lang.Exception"""
- ) {
- with((this / "classes" / "ExampleException").cast<DTypeAlias>()) {
- name equals "ExampleException"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should work if exception is extending a typaliased class`(){
- inlineModelTest(
- """
- |class ExampleException(): Exception()
- |typealias ExampleExceptionAlias = ExampleException"""
- ) {
- with((this / "classes" / "ExampleExceptionAlias").cast<DTypeAlias>()) {
- name equals "ExampleExceptionAlias"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should return false for a basic class`(){
- inlineModelTest(
- """
- |class NotAnException(): Serializable"""
- ) {
- with((this / "classes" / "NotAnException").cast<DClass>()) {
- name equals "NotAnException"
- isException equals false
- }
- }
- }
-
- @Test
- fun `isException should return false for a typealias`(){
- inlineModelTest(
- """
- |typealias NotAnException = Serializable"""
- ) {
- with((this / "classes" / "NotAnException").cast<DTypeAlias>()) {
- name equals "NotAnException"
- isException equals false
- }
- }
- }
-}
-
-class IsExceptionJavaTest: AbstractModelTest("/src/main/kotlin/java/Test.java", "java") {
- @Test
- fun `isException should work for java exceptions`(){
- inlineModelTest(
- """
- |public class ExampleException extends java.lang.Exception { }"""
- ) {
- with((this / "java" / "ExampleException").cast<DClass>()) {
- name equals "ExampleException"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should work for RuntimeException`(){
- inlineModelTest(
- """
- |public class ExampleException extends java.lang.RuntimeException"""
- ) {
- with((this / "java" / "ExampleException").cast<DClass>()) {
- name equals "ExampleException"
- isException equals true
- }
- }
- }
-
- @Test
- fun `isException should return false for a basic class`(){
- inlineModelTest(
- """
- |public class NotAnException extends Serializable"""
- ) {
- with((this / "java" / "NotAnException").cast<DClass>()) {
- name equals "NotAnException"
- isException equals false
- }
- }
- }
-}
-
diff --git a/plugins/base/src/test/kotlin/translators/AccessorMethodNamingTest.kt b/plugins/base/src/test/kotlin/translators/AccessorMethodNamingTest.kt
deleted file mode 100644
index ff36337a..00000000
--- a/plugins/base/src/test/kotlin/translators/AccessorMethodNamingTest.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DProperty
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-/**
- * https://kotlinlang.org/docs/java-to-kotlin-interop.html#properties
- * https://kotlinlang.org/docs/java-interop.html#getters-and-setters
- */
-class AccessorMethodNamingTest : BaseAbstractTest() {
-
- @Test
- fun `standard property`() {
- testAccessors("data class TestCase(var standardString: String, var standardBoolean: Boolean)") {
- doTest("standardString", "getStandardString", "setStandardString")
- doTest("standardBoolean", "getStandardBoolean", "setStandardBoolean")
- }
- }
-
- @Test
- fun `properties that start with the word 'is' use the special is rules`() {
- testAccessors("data class TestCase(var isFoo: String, var isBar: Boolean)") {
- doTest("isFoo", "isFoo", "setFoo")
- doTest("isBar", "isBar", "setBar")
- }
- }
-
- @Test
- fun `properties that start with a word that starts with 'is' use get and set`() {
- testAccessors("data class TestCase(var issuesFetched: Int, var issuesWereDisplayed: Boolean)") {
- doTest("issuesFetched", "getIssuesFetched", "setIssuesFetched")
- doTest("issuesWereDisplayed", "getIssuesWereDisplayed", "setIssuesWereDisplayed")
- }
- }
-
- @Test
- fun `properties that start with the word 'is' followed by underscore use the special is rules`() {
- testAccessors("data class TestCase(var is_foo: String, var is_bar: Boolean)") {
- doTest("is_foo", "is_foo", "set_foo")
- doTest("is_bar", "is_bar", "set_bar")
- }
- }
-
- @Test
- fun `properties that start with the word 'is' followed by a number use the special is rules`() {
- testAccessors("data class TestCase(var is1of: String, var is2of: Boolean)") {
- doTest("is1of", "is1of", "set1of")
- doTest("is2of", "is2of", "set2of")
- }
- }
-
- @Test
- fun `sanity check short names`() {
- testAccessors(
- """
- data class TestCase(
- var i: Boolean,
- var `is`: Boolean,
- var isz: Boolean,
- var isA: Int,
- var isB: Boolean,
- )
- """.trimIndent()
- ) {
- doTest("i", "getI", "setI")
- doTest("is", "getIs", "setIs")
- doTest("isz", "getIsz", "setIsz")
- doTest("isA", "isA", "setA")
- doTest("isB", "isB", "setB")
- }
- }
-
- private fun testAccessors(code: String, block: PropertyTestCase.() -> Unit) {
- val configuration = dokkaConfiguration {
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- }
- }
- }
-
- testInline("""
- /src/main/kotlin/sample/TestCase.kt
- package sample
-
- $code
- """.trimIndent(),
- configuration) {
- documentablesMergingStage = { module ->
- val properties = module.packages.single().classlikes.first().properties
- PropertyTestCase(properties).apply {
- block()
- finish()
- }
- }
- }
- }
-
- private class PropertyTestCase(private val properties: List<DProperty>) {
- private var testsDone: Int = 0
-
- fun doTest(kotlinName: String, getter: String? = null, setter: String? = null) {
- properties.first { it.name == kotlinName }.let {
- assertEquals(getter, it.getter?.name)
- assertEquals(setter, it.setter?.name)
- }
- testsDone += 1
- }
-
- fun finish() {
- assertTrue(testsDone > 0, "No tests in TestCase")
- assertEquals(testsDone, properties.size)
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/translators/Bug1341.kt b/plugins/base/src/test/kotlin/translators/Bug1341.kt
deleted file mode 100644
index 6a7bfc97..00000000
--- a/plugins/base/src/test/kotlin/translators/Bug1341.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class Bug1341 : BaseAbstractTest() {
- @Test
- fun `reproduce bug #1341`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- analysisPlatform = "jvm"
- }
- }
- }
-
- testInline(
- """
- /src/com/sample/OtherClass.kt
- package com.sample
- class OtherClass internal constructor() {
- internal annotation class CustomAnnotation
- }
-
- /src/com/sample/ClassUsingAnnotation.java
- package com.sample
- public class ClassUsingAnnotation {
- @OtherClass.CustomAnnotation
- public int doSomething() {
- return 1;
- }
- }
- """.trimIndent(),
- configuration
- ) {
- this.documentablesMergingStage = { module ->
- assertEquals(DRI("com.sample"), module.packages.single().dri)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/translators/DefaultDescriptorToDocumentableTranslatorTest.kt b/plugins/base/src/test/kotlin/translators/DefaultDescriptorToDocumentableTranslatorTest.kt
deleted file mode 100644
index 6812f0b4..00000000
--- a/plugins/base/src/test/kotlin/translators/DefaultDescriptorToDocumentableTranslatorTest.kt
+++ /dev/null
@@ -1,1107 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.signatures.KotlinSignatureUtils.modifiers
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.*
-import utils.text
-import kotlin.test.*
-import utils.OnlyDescriptors
-
-class DefaultDescriptorToDocumentableTranslatorTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- classpath = listOf(commonStdlibPath!!, jvmStdlibPath!!)
- }
- }
- }
-
- @Suppress("DEPRECATION") // for includeNonPublic
- val javaConfiguration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- includeNonPublic = true
- }
- }
- }
-
- @Test
- fun `data class kdocs over generated methods`() {
- testInline(
- """
- |/src/main/kotlin/sample/XD.kt
- |package sample
- |/**
- | * But the fat Hobbit, he knows. Eyes always watching.
- | */
- |data class XD(val xd: String) {
- | /**
- | * But the fat Hobbit, he knows. Eyes always watching.
- | */
- | fun custom(): String = ""
- |
- | /**
- | * Memory is not what the heart desires. That is only a mirror.
- | */
- | override fun equals(other: Any?): Boolean = true
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals("", module.documentationOf("XD", "copy"))
- assertEquals(
- "Memory is not what the heart desires. That is only a mirror.",
- module.documentationOf(
- "XD",
- "equals"
- )
- )
- assertEquals("", module.documentationOf("XD", "hashCode"))
- assertEquals("", module.documentationOf("XD", "toString"))
- assertEquals("But the fat Hobbit, he knows. Eyes always watching.", module.documentationOf("XD", "custom"))
- }
- }
- }
-
- @Test
- fun `simple class kdocs`() {
- testInline(
- """
- |/src/main/kotlin/sample/XD.kt
- |package sample
- |/**
- | * But the fat Hobbit, he knows. Eyes always watching.
- | */
- |class XD(val xd: String) {
- | /**
- | * But the fat Hobbit, he knows. Eyes always watching.
- | */
- | fun custom(): String = ""
- |
- | /**
- | * Memory is not what the heart desires. That is only a mirror.
- | */
- | override fun equals(other: Any?): Boolean = true
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals("But the fat Hobbit, he knows. Eyes always watching.", module.documentationOf("XD", "custom"))
- assertEquals(
- "Memory is not what the heart desires. That is only a mirror.",
- module.documentationOf(
- "XD",
- "equals"
- )
- )
- }
- }
- }
-
- @Test
- fun `kdocs with code block`() {
- testInline(
- """
- |/src/main/kotlin/sample/TestForCodeInDocs.kt
- |package sample
- |/**
- | * Utility for building a String that represents an XML document.
- | * The XmlBlob object is immutable and the passed values are copied where it makes sense.
- | *
- | * Note the XML Declaration is not output as part of the XmlBlob
- | *
- | *
- | * val soapAttrs = attrs("soap-env" to "http://www.w3.org/2001/12/soap-envelope",
- | * "soap-env:encodingStyle" to "http://www.w3.org/2001/12/soap-encoding")
- | * val soapXml = node("soap-env:Envelope", soapAttrs,
- | * node("soap-env:Body", attrs("xmlns:m" to "http://example"),
- | * node("m:GetExample",
- | * node("m:GetExampleName", "BasePair")
- | * )
- | * )
- | * )
- | *
- | *
- | */
- |class TestForCodeInDocs {
- |}
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val description = module.descriptionOf("TestForCodeInDocs")
- val expected = listOf(
- P(
- children = listOf(Text("Utility for building a String that represents an XML document. The XmlBlob object is immutable and the passed values are copied where it makes sense."))
- ),
- P(
- children = listOf(Text("Note the XML Declaration is not output as part of the XmlBlob"))
- ),
- CodeBlock(
- children = listOf(
- Text(
- """val soapAttrs = attrs("soap-env" to "http://www.w3.org/2001/12/soap-envelope",
- "soap-env:encodingStyle" to "http://www.w3.org/2001/12/soap-encoding")
-val soapXml = node("soap-env:Envelope", soapAttrs,
- node("soap-env:Body", attrs("xmlns:m" to "http://example"),
- node("m:GetExample",
- node("m:GetExampleName", "BasePair")
- )
- )
-)"""
- )
- )
- )
- )
- assertEquals(expected, description?.root?.children)
- }
- }
- }
-
- private fun runTestSuitesAgainstGivenClasses(classlikes: List<DClasslike>, testSuites: List<List<TestSuite>>) {
- classlikes.zip(testSuites).forEach { (classlike, testSuites) ->
- testSuites.forEach { testSuite ->
- when (testSuite) {
- is TestSuite.PropertyDoesntExist -> assertEquals(
- null,
- classlike.properties.firstOrNull { it.name == testSuite.propertyName },
- "Test for class ${classlike.name} failed"
- )
- is TestSuite.PropertyExists -> classlike.properties.single { it.name == testSuite.propertyName }
- .run {
- assertEquals(
- testSuite.modifier,
- modifier.values.single(),
- "Test for class ${classlike.name} with property $name failed"
- )
- assertEquals(
- testSuite.visibility,
- visibility.values.single(),
- "Test for class ${classlike.name} with property $name failed"
- )
- assertEquals(
- testSuite.additionalModifiers,
- extra[AdditionalModifiers]?.content?.values?.single() ?: emptySet<ExtraModifiers>(),
- "Test for class ${classlike.name} with property $name failed"
- )
- }
- is TestSuite.FunctionDoesntExist -> assertEquals(
- null,
- classlike.functions.firstOrNull { it.name == testSuite.propertyName },
- "Test for class ${classlike.name} failed"
- )
- is TestSuite.FunctionExists -> classlike.functions.single { it.name == testSuite.propertyName }
- .run {
- assertEquals(
- testSuite.modifier,
- modifier.values.single(),
- "Test for class ${classlike.name} with function $name failed"
- )
- assertEquals(
- testSuite.visibility,
- visibility.values.single(),
- "Test for class ${classlike.name} with function $name failed"
- )
- assertEquals(
- testSuite.additionalModifiers,
- extra[AdditionalModifiers]?.content?.values?.single() ?: emptySet<ExtraModifiers>(),
- "Test for class ${classlike.name} with function $name failed"
- )
- }
- }
- }
- }
- }
-
- @Test
- fun `derived properties with non-public code included`() {
-
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PRIVATE,
- DokkaConfiguration.Visibility.PROTECTED,
- DokkaConfiguration.Visibility.INTERNAL,
- )
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/sample/XD.kt
- |package sample
- |
- |open class A {
- | private val privateProperty: Int = 1
- | protected val protectedProperty: Int = 2
- | internal val internalProperty: Int = 3
- | val publicProperty: Int = 4
- | open val propertyToOverride: Int = 5
- |
- | private fun privateFun(): Int = 6
- | protected fun protectedFun(): Int = 7
- | internal fun internalFun(): Int = 8
- | fun publicFun(): Int = 9
- | open fun funToOverride(): Int = 10
- |}
- |
- |open class B : A() {
- | override val propertyToOverride: Int = 11
- |
- | override fun funToOverride(): Int = 12
- |}
- |class C : B()
- """.trimIndent(),
- configuration
- ) {
-
- documentablesMergingStage = { module ->
- val classes = module.packages.single().classlikes.sortedBy { it.name }
-
- val testSuites: List<List<TestSuite>> = listOf(
- listOf(
- TestSuite.PropertyExists(
- "privateProperty",
- KotlinModifier.Final,
- KotlinVisibility.Private,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "protectedProperty",
- KotlinModifier.Final,
- KotlinVisibility.Protected,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "internalProperty",
- KotlinModifier.Final,
- KotlinVisibility.Internal,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "publicProperty",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "privateFun",
- KotlinModifier.Final,
- KotlinVisibility.Private,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "protectedFun",
- KotlinModifier.Final,
- KotlinVisibility.Protected,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "internalFun",
- KotlinModifier.Final,
- KotlinVisibility.Internal,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "publicFun",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- emptySet()
- )
- ),
- listOf(
- TestSuite.PropertyExists(
- "privateProperty",
- KotlinModifier.Final,
- KotlinVisibility.Private,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "protectedProperty",
- KotlinModifier.Final,
- KotlinVisibility.Protected,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "internalProperty",
- KotlinModifier.Final,
- KotlinVisibility.Internal,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "publicProperty",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.FunctionExists(
- "privateFun",
- KotlinModifier.Final,
- KotlinVisibility.Private,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "protectedFun",
- KotlinModifier.Final,
- KotlinVisibility.Protected,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "internalFun",
- KotlinModifier.Final,
- KotlinVisibility.Internal,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "publicFun",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- )
- ),
- listOf(
- TestSuite.PropertyExists(
- "privateProperty",
- KotlinModifier.Final,
- KotlinVisibility.Private,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "protectedProperty",
- KotlinModifier.Final,
- KotlinVisibility.Protected,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "internalProperty",
- KotlinModifier.Final,
- KotlinVisibility.Internal,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "publicProperty",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.FunctionExists(
- "privateFun",
- KotlinModifier.Final,
- KotlinVisibility.Private,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "protectedFun",
- KotlinModifier.Final,
- KotlinVisibility.Protected,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "internalFun",
- KotlinModifier.Final,
- KotlinVisibility.Internal,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "publicFun",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- )
- )
- )
-
- runTestSuitesAgainstGivenClasses(classes, testSuites)
- }
- }
- }
-
-
- @Test
- fun `derived properties with only public code`() {
-
- @Suppress("DEPRECATION") // for includeNonPublic
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- includeNonPublic = false
- }
- }
- }
-
- testInline(
- """
- |/src/main/kotlin/sample/XD.kt
- |package sample
- |
- |open class A {
- | private val privateProperty: Int = 1
- | protected val protectedProperty: Int = 2
- | internal val internalProperty: Int = 3
- | val publicProperty: Int = 4
- | open val propertyToOverride: Int = 5
- | open val propertyToOverrideButCloseMeanwhile: Int = 6
- |
- | private fun privateFun(): Int = 7
- | protected fun protectedFun(): Int = 8
- | internal fun internalFun(): Int = 9
- | fun publicFun(): Int = 10
- | open fun funToOverride(): Int = 11
- | open fun funToOverrideButCloseMeanwhile(): Int = 12
- |}
- |
- |open class B : A() {
- | override val propertyToOverride: Int = 13
- | final override val propertyToOverrideButCloseMeanwhile: Int = 14
- |
- | override fun funToOverride(): Int = 15
- | final override fun funToOverrideButCloseMeanwhile(): Int = 16
- |}
- |class C : B()
- """.trimIndent(),
- configuration
- ) {
-
- documentablesMergingStage = { module ->
- val classes = module.packages.single().classlikes.sortedBy { it.name }
-
- val testSuites: List<List<TestSuite>> = listOf(
- listOf(
- TestSuite.PropertyDoesntExist("privateProperty"),
- TestSuite.PropertyDoesntExist("protectedProperty"),
- TestSuite.PropertyDoesntExist("internalProperty"),
- TestSuite.PropertyExists(
- "publicProperty",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverrideButCloseMeanwhile",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionDoesntExist("privateFun"),
- TestSuite.FunctionDoesntExist("protectedFun"),
- TestSuite.FunctionDoesntExist("internalFun"),
- TestSuite.FunctionExists(
- "publicFun",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverrideButCloseMeanwhile",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- emptySet()
- )
- ),
- listOf(
- TestSuite.PropertyDoesntExist("privateProperty"),
- TestSuite.PropertyDoesntExist("protectedProperty"),
- TestSuite.PropertyDoesntExist("internalProperty"),
- TestSuite.PropertyExists(
- "publicProperty",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.PropertyExists(
- "propertyToOverrideButCloseMeanwhile",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.FunctionDoesntExist("privateFun"),
- TestSuite.FunctionDoesntExist("protectedFun"),
- TestSuite.FunctionDoesntExist("internalFun"),
- TestSuite.FunctionExists(
- "publicFun",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.FunctionExists(
- "funToOverrideButCloseMeanwhile",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- )
- ),
- listOf(
- TestSuite.PropertyDoesntExist("privateProperty"),
- TestSuite.PropertyDoesntExist("protectedProperty"),
- TestSuite.PropertyDoesntExist("internalProperty"),
- TestSuite.PropertyExists(
- "publicProperty",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.PropertyExists(
- "propertyToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.PropertyExists(
- "propertyToOverrideButCloseMeanwhile",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.FunctionDoesntExist("privateFun"),
- TestSuite.FunctionDoesntExist("protectedFun"),
- TestSuite.FunctionDoesntExist("internalFun"),
- TestSuite.FunctionExists(
- "publicFun",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- emptySet()
- ),
- TestSuite.FunctionExists(
- "funToOverride",
- KotlinModifier.Open,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- ),
- TestSuite.FunctionExists(
- "funToOverrideButCloseMeanwhile",
- KotlinModifier.Final,
- KotlinVisibility.Public,
- setOf(ExtraModifiers.KotlinOnlyModifiers.Override)
- )
- )
- )
-
- runTestSuitesAgainstGivenClasses(classes, testSuites)
- }
- }
- }
-
- @Ignore // The compiler throws away annotations on unresolved types upstream
- @Test
- fun `Can annotate unresolved type`() {
- testInline(
- """
- |/src/main/java/sample/FooLibrary.kt
- |package sample;
- |@MustBeDocumented
- |@Target(AnnotationTarget.TYPE)
- |annotation class Hello()
- |fun bar(): @Hello() TypeThatDoesntResolve
- """.trimMargin(),
- javaConfiguration
- ) {
- documentablesMergingStage = { module ->
- val type = module.packages.single().functions.single().type as GenericTypeConstructor
- assertEquals(
- Annotations.Annotation(DRI("sample", "Hello"), emptyMap()),
- type.extra[Annotations]?.directAnnotations?.values?.single()?.single()
- )
- }
- }
- }
-
- /**
- * Kotlin Int becomes java int. Java int cannot be annotated in source, but Kotlin Int can be.
- * This is paired with KotlinAsJavaPluginTest.`Java primitive annotations work`()
- */
- @Test
- fun `Java primitive annotations work`() {
- testInline(
- """
- |/src/main/java/sample/FooLibrary.kt
- |package sample;
- |@MustBeDocumented
- |@Target(AnnotationTarget.TYPE)
- |annotation class Hello()
- |fun bar(): @Hello() Int
- """.trimMargin(),
- javaConfiguration
- ) {
- documentablesMergingStage = { module ->
- val type = module.packages.single().functions.single().type as GenericTypeConstructor
- assertEquals(
- Annotations.Annotation(DRI("sample", "Hello"), emptyMap()),
- type.extra[Annotations]?.directAnnotations?.values?.single()?.single()
- )
- assertEquals("kotlin/Int///PointingToDeclaration/", type.dri.toString())
- }
- }
- }
-
- @Test
- fun `should preserve regular functions that look like accessors, but are not accessors`() {
- testInline(
- """
- |/src/main/kotlin/A.kt
- |package test
- |class A {
- | private var v: Int = 0
- |
- | // not accessors because declared separately, just functions
- | fun setV(new: Int) { v = new }
- | fun getV(): Int = v
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testClass = module.packages.single().classlikes.single { it.name == "A" }
- val setterLookalike = testClass.functions.firstOrNull { it.name == "setV" }
- assertNotNull(setterLookalike) {
- "Expected regular function not found, wrongly categorized as setter?"
- }
-
- val getterLookalike = testClass.functions.firstOrNull { it.name == "getV" }
- assertNotNull(getterLookalike) {
- "Expected regular function not found, wrongly categorized as getter?"
- }
- }
- }
- }
-
- @Test
- fun `should correctly add IsVar extra for properties`() {
- testInline(
- """
- |/src/main/kotlin/A.kt
- |package test
- |class A {
- | public var mutable: Int = 0
- | public val immutable: Int = 0
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testClass = module.packages.single().classlikes.single { it.name == "A" }
- assertEquals(2, testClass.properties.size)
-
- val mutable = testClass.properties[0]
- assertEquals("mutable", mutable.name)
- assertNotNull(mutable.extra[IsVar])
-
- val immutable = testClass.properties[1]
- assertEquals("immutable", immutable.name)
- assertNull(immutable.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `should correctly parse multiple see tags with static function and property links`() {
- testInline(
- """
- |/src/main/kotlin/com/example/package/CollectionExtensions.kt
- |package com.example.util
- |
- |object CollectionExtensions {
- | val property = "Hi"
- |
- | fun emptyList() {}
- | fun emptyMap() {}
- | fun emptySet() {}
- |}
- |
- |/src/main/kotlin/com/example/foo.kt
- |package com.example
- |
- |import com.example.util.CollectionExtensions.emptyMap
- |import com.example.util.CollectionExtensions.emptyList
- |import com.example.util.CollectionExtensions.emptySet
- |import com.example.util.CollectionExtensions.property
- |
- |/**
- | * @see [List] stdlib list
- | * @see [Map] stdlib map
- | * @see [emptyMap] static emptyMap
- | * @see [emptyList] static emptyList
- | * @see [emptySet] static emptySet
- | * @see [property] static property
- | */
- |fun foo() {}
- """.trimIndent(),
- configuration
- ) {
- fun assertSeeTag(tag: TagWrapper, expectedName: String, expectedDescription: String) {
- assertTrue(tag is See)
- assertEquals(expectedName, tag.name)
- val description = tag.children.joinToString { it.text().trim() }
- assertEquals(expectedDescription, description)
- }
-
- documentablesMergingStage = { module ->
- val testFunction = module.packages.find { it.name == "com.example" }
- ?.functions
- ?.single { it.name == "foo" }
- assertNotNull(testFunction)
-
- val documentationTags = testFunction.documentation.values.single().children
- assertEquals(7, documentationTags.size)
-
- val descriptionTag = documentationTags[0]
- assertTrue(descriptionTag is Description, "Expected first tag to be empty description")
- assertTrue(descriptionTag.children.isEmpty(), "Expected first tag to be empty description")
-
- assertSeeTag(
- tag = documentationTags[1],
- expectedName = "kotlin.collections.List",
- expectedDescription = "stdlib list"
- )
- assertSeeTag(
- tag = documentationTags[2],
- expectedName = "kotlin.collections.Map",
- expectedDescription = "stdlib map"
- )
- assertSeeTag(
- tag = documentationTags[3],
- expectedName = "com.example.util.CollectionExtensions.emptyMap",
- expectedDescription = "static emptyMap"
- )
- assertSeeTag(
- tag = documentationTags[4],
- expectedName = "com.example.util.CollectionExtensions.emptyList",
- expectedDescription = "static emptyList"
- )
- assertSeeTag(
- tag = documentationTags[5],
- expectedName = "com.example.util.CollectionExtensions.emptySet",
- expectedDescription = "static emptySet"
- )
- assertSeeTag(
- tag = documentationTags[6],
- expectedName = "com.example.util.CollectionExtensions.property",
- expectedDescription = "static property"
- )
- }
- }
- }
-
- @Test
- fun `should have documentation for synthetic Enum values functions`() {
- testInline(
- """
- |/src/main/kotlin/test/KotlinEnum.kt
- |package test
- |
- |enum class KotlinEnum {
- | FOO, BAR;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val kotlinEnum = module.packages.find { it.name == "test" }
- ?.classlikes
- ?.single { it.name == "KotlinEnum" }
- assertNotNull(kotlinEnum)
- val valuesFunction = kotlinEnum.functions.single { it.name == "values" }
-
- val expectedValuesType = GenericTypeConstructor(
- dri = DRI(
- packageName = "kotlin",
- classNames = "Array"
- ),
- projections = listOf(
- Invariance(
- GenericTypeConstructor(
- dri = DRI(
- packageName = "test",
- classNames = "KotlinEnum"
- ),
- projections = emptyList()
- )
- )
- )
- )
- assertEquals(expectedValuesType, valuesFunction.type)
-
- val expectedDocumentation = DocumentationNode(listOf(
- Description(
- CustomDocTag(
- children = listOf(
- P(listOf(
- Text(
- "Returns an array containing the constants of this enum type, in the order " +
- "they're declared."
- ),
- )),
- P(listOf(
- Text("This method may be used to iterate over the constants.")
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- )
- ))
- assertEquals(expectedDocumentation, valuesFunction.documentation.values.single())
- }
- }
- }
-
- @Test
- fun `should have documentation for synthetic Enum entries property`() {
- testInline(
- """
- |/src/main/kotlin/test/KotlinEnum.kt
- |package test
- |
- |enum class KotlinEnum {
- | FOO, BAR;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val kotlinEnum = module.packages.find { it.name == "test" }
- ?.classlikes
- ?.single { it.name == "KotlinEnum" }
-
- assertNotNull(kotlinEnum)
-
- val entriesProperty = kotlinEnum.properties.single { it.name == "entries" }
- val expectedEntriesType = GenericTypeConstructor(
- dri = DRI(
- packageName = "kotlin.enums",
- classNames = "EnumEntries"
- ),
- projections = listOf(
- Invariance(
- GenericTypeConstructor(
- dri = DRI(
- packageName = "test",
- classNames = "KotlinEnum"
- ),
- projections = emptyList()
- )
- )
- )
- )
- assertEquals(expectedEntriesType, entriesProperty.type)
-
- val expectedDocumentation = DocumentationNode(listOf(
- Description(
- CustomDocTag(
- children = listOf(
- P(listOf(
- Text(
- "Returns a representation of an immutable list of all enum entries, " +
- "in the order they're declared."
- ),
- )),
- P(listOf(
- Text("This method may be used to iterate over the enum entries.")
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- )
- ))
- assertEquals(expectedDocumentation, entriesProperty.documentation.values.single())
- }
- }
- }
-
- @OnlyDescriptors("Fix kdoc link") // TODO
- @Test
- fun `should have documentation for synthetic Enum valueOf functions`() {
- testInline(
- """
- |/src/main/kotlin/test/KotlinEnum.kt
- |package test
- |
- |enum class KotlinEnum {
- | FOO, BAR;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val kotlinEnum = module.packages.find { it.name == "test" }
- ?.classlikes
- ?.single { it.name == "KotlinEnum" }
- assertNotNull(kotlinEnum)
-
- val expectedValueOfType = GenericTypeConstructor(
- dri = DRI(
- packageName = "test",
- classNames = "KotlinEnum"
- ),
- projections = emptyList()
- )
-
- val expectedDocumentation = DocumentationNode(listOf(
- Description(
- CustomDocTag(
- children = listOf(
- P(listOf(
- Text(
- "Returns the enum constant of this type with the specified name. " +
- "The string must match exactly an identifier used to declare an enum " +
- "constant in this type. (Extraneous whitespace characters are not permitted.)"
- )
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- ),
- Throws(
- root = CustomDocTag(
- children = listOf(
- P(listOf(
- Text("if this enum type has no constant with the specified name")
- ))
- ),
- name = "MARKDOWN_FILE"
- ),
- name = "kotlin.IllegalArgumentException",
- exceptionAddress = DRI(
- packageName = "kotlin",
- classNames = "IllegalArgumentException",
- target = PointingToDeclaration
- ),
- )
- ))
-
- val valueOfFunction = kotlinEnum.functions.single { it.name == "valueOf" }
- assertEquals(expectedDocumentation, valueOfFunction.documentation.values.single())
- assertEquals(expectedValueOfType, valueOfFunction.type)
-
- val valueOfParamDRI = (valueOfFunction.parameters.single().type as GenericTypeConstructor).dri
- assertEquals(DRI(packageName = "kotlin", classNames = "String"), valueOfParamDRI)
- }
- }
- }
-
- @Test
- fun `should add data modifier to data objects`() {
- testInline(
- """
- |/src/main/kotlin/test/KotlinDataObject.kt
- |package test
- |
- |data object KotlinDataObject {}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val pckg = module.packages.single { it.name == "test" }
-
- val dataObject = pckg.classlikes.single { it.name == "KotlinDataObject" }
- assertTrue(dataObject is DObject)
-
- val modifiers = dataObject.modifiers().values.flatten()
- assertEquals(1, modifiers.size)
- assertEquals(ExtraModifiers.KotlinOnlyModifiers.Data, modifiers[0])
- }
- }
- }
-}
-
-private sealed class TestSuite {
- abstract val propertyName: String
-
- data class PropertyDoesntExist(
- override val propertyName: String
- ) : TestSuite()
-
-
- data class PropertyExists(
- override val propertyName: String,
- val modifier: KotlinModifier,
- val visibility: KotlinVisibility,
- val additionalModifiers: Set<ExtraModifiers.KotlinOnlyModifiers>
- ) : TestSuite()
-
- data class FunctionDoesntExist(
- override val propertyName: String,
- ) : TestSuite()
-
- data class FunctionExists(
- override val propertyName: String,
- val modifier: KotlinModifier,
- val visibility: KotlinVisibility,
- val additionalModifiers: Set<ExtraModifiers.KotlinOnlyModifiers>
- ) : TestSuite()
-}
diff --git a/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt b/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt
deleted file mode 100644
index 7e9bff1e..00000000
--- a/plugins/base/src/test/kotlin/translators/DefaultPsiToDocumentableTranslatorTest.kt
+++ /dev/null
@@ -1,1027 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfiguration.Visibility
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.*
-import kotlin.test.*
-
-class DefaultPsiToDocumentableTranslatorTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- @Test
- fun `method overriding two documented classes picks closest class documentation`() {
- testInline(
- """
- |/src/main/java/sample/BaseClass1.java
- |package sample;
- |public class BaseClass1 {
- | /** B1 */
- | public void x() { }
- |}
- |
- |/src/main/java/sample/BaseClass2.java
- |package sample;
- |public class BaseClass2 extends BaseClass1 {
- | /** B2 */
- | public void x() { }
- |}
- |
- |/src/main/java/sample/X.java
- |package sample;
- |public class X extends BaseClass2 {
- | public void x() { }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val documentationOfFunctionX = module.documentationOf("X", "x")
- assertTrue(
- "B2" in documentationOfFunctionX,
- "Expected nearest super method documentation to be parsed as documentation. " +
- "Documentation: $documentationOfFunctionX"
- )
- }
- }
- }
-
- @Test
- fun `method overriding class and interface picks class documentation`() {
- testInline(
- """
- |/src/main/java/sample/BaseClass1.java
- |package sample;
- |public class BaseClass1 {
- | /** B1 */
- | public void x() { }
- |}
- |
- |/src/main/java/sample/Interface1.java
- |package sample;
- |public interface Interface1 {
- | /** I1 */
- | public void x() {}
- |}
- |
- |/src/main/java/sample/X.java
- |package sample;
- |public class X extends BaseClass1 implements Interface1 {
- | public void x() { }
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val documentationOfFunctionX = module.documentationOf("X", "x")
- assertTrue(
- "B1" in documentationOfFunctionX,
- "Expected documentation of superclass being prioritized over interface " +
- "Documentation: $documentationOfFunctionX"
- )
- }
- }
- }
-
- @Test
- fun `method overriding two classes picks closest documented class documentation`() {
- testInline(
- """
- |/src/main/java/sample/BaseClass1.java
- |package sample;
- |public class BaseClass1 {
- | /** B1 */
- | public void x() { }
- |}
- |
- |/src/main/java/sample/BaseClass2.java
- |package sample;
- |public class BaseClass2 extends BaseClass1 {
- | public void x() {}
- |}
- |
- |/src/main/java/sample/X.java
- |package sample;
- |public class X extends BaseClass2 {
- | public void x() { }
- |}
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val documentationOfFunctionX = module.documentationOf("X", "x")
- assertTrue(
- "B1" in documentationOfFunctionX,
- "Expected Documentation \"B1\", found: \"$documentationOfFunctionX\""
- )
- }
- }
- }
-
- @Test
- fun `java package-info package description`() {
- testInline(
- """
- |/src/main/java/sample/BaseClass1.java
- |package sample;
- |public class BaseClass1 {
- | /** B1 */
- | void x() { }
- |}
- |
- |/src/main/java/sample/BaseClass2.java
- |package sample;
- |public class BaseClass2 extends BaseClass1 {
- | void x() {}
- |}
- |
- |/src/main/java/sample/X.java
- |package sample;
- |public class X extends BaseClass2 {
- | void x() { }
- |}
- |
- |/src/main/java/sample/package-info.java
- |/**
- | * Here comes description from package-info
- | */
- |package sample;
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val documentationOfPackage = module.packages.single().documentation.values.single().children.single()
- .firstMemberOfType<Text>().body
- assertEquals(
- "Here comes description from package-info", documentationOfPackage
- )
- }
- }
- }
-
- @Test
- fun `java package-info package annotations`() {
- testInline(
- """
- |/src/main/java/sample/PackageAnnotation.java
- |package sample;
- |@java.lang.annotation.Target(java.lang.annotation.ElementType.PACKAGE)
- |public @interface PackageAnnotation {
- |}
- |
- |/src/main/java/sample/package-info.java
- |@PackageAnnotation
- |package sample;
- """.trimMargin(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- assertEquals(
- Annotations.Annotation(DRI("sample", "PackageAnnotation"), emptyMap()),
- module.packages.single().extra[Annotations]?.directAnnotations?.values?.single()?.single()
- )
- }
- }
- }
-
- @Test
- fun `should add default value to constant properties`() {
- testInline(
- """
- |/src/main/java/test/JavaConstants.java
- |package test;
- |
- |public class JavaConstants {
- | public static final byte BYTE = 1;
- | public static final short SHORT = 2;
- | public static final int INT = 3;
- | public static final long LONG = 4L;
- | public static final float FLOAT = 5.0f;
- | public static final double DOUBLE = 6.0d;
- | public static final String STRING = "Seven";
- | public static final char CHAR = 'E';
- | public static final boolean BOOLEAN = true;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "JavaConstants" }
-
- val constants = testedClass.properties
- assertEquals(9, constants.size)
-
- val constantsByName = constants.associateBy { it.name }
- fun getConstantExpression(name: String): Expression? {
- return constantsByName.getValue(name).extra[DefaultValue]?.expression?.values?.first()
- }
-
- assertEquals(IntegerConstant(1), getConstantExpression("BYTE"))
- assertEquals(IntegerConstant(2), getConstantExpression("SHORT"))
- assertEquals(IntegerConstant(3), getConstantExpression("INT"))
- assertEquals(IntegerConstant(4), getConstantExpression("LONG"))
- assertEquals(FloatConstant(5.0f), getConstantExpression("FLOAT"))
- assertEquals(DoubleConstant(6.0), getConstantExpression("DOUBLE"))
- assertEquals(StringConstant("Seven"), getConstantExpression("STRING"))
- assertEquals(StringConstant("E"), getConstantExpression("CHAR"))
- assertEquals(BooleanConstant(true), getConstantExpression("BOOLEAN"))
- }
- }
- }
-
- @Test
- fun `should resolve static imports used as annotation param values as literal values`() {
- testInline(
- """
- |/src/main/java/test/JavaClassUsingAnnotation.java
- |package test;
- |
- |import static test.JavaConstants.STRING;
- |import static test.JavaConstants.INTEGER;
- |import static test.JavaConstants.LONG;
- |import static test.JavaConstants.BOOLEAN;
- |import static test.JavaConstants.DOUBLE;
- |import static test.JavaConstants.FLOAT;
- |import static test.JavaConstants.BYTE;
- |import static test.JavaConstants.SHORT;
- |import static test.JavaConstants.CHAR;
- |
- |@JavaAnnotation(
- | byteValue = BYTE, shortValue = SHORT, intValue = INTEGER, longValue = LONG, booleanValue = BOOLEAN,
- | doubleValue = DOUBLE, floatValue = FLOAT, stringValue = STRING, charValue = CHAR
- |)
- |public class JavaClassUsingAnnotation {
- |}
- |
- |/src/main/java/test/JavaAnnotation.java
- |package test;
- |@Documented
- |public @interface JavaAnnotation {
- | byte byteValue();
- | short shortValue();
- | int intValue();
- | long longValue();
- | boolean booleanValue();
- | double doubleValue();
- | float floatValue();
- | String stringValue();
- | char charValue();
- |}
- |
- |/src/main/java/test/JavaConstants.java
- |package test;
- |public class JavaConstants {
- | public static final byte BYTE = 3;
- | public static final short SHORT = 4;
- | public static final int INTEGER = 5;
- | public static final long LONG = 6L;
- | public static final boolean BOOLEAN = true;
- | public static final double DOUBLE = 7.0d;
- | public static final float FLOAT = 8.0f;
- | public static final String STRING = "STRING_CONSTANT_VALUE";
- | public static final char CHAR = 'c';
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "JavaClassUsingAnnotation" }
-
- val annotation = (testedClass as DClass).extra[Annotations]?.directAnnotations?.values?.single()?.single()
- assertNotNull(annotation)
-
- assertEquals("JavaAnnotation", annotation.dri.classNames)
-
- assertEquals(IntValue(3), annotation.params["byteValue"])
- assertEquals(IntValue(4), annotation.params["shortValue"])
- assertEquals(IntValue(5), annotation.params["intValue"])
- assertEquals(LongValue(6), annotation.params["longValue"])
- assertEquals(BooleanValue(true), annotation.params["booleanValue"])
- assertEquals(DoubleValue(7.0), annotation.params["doubleValue"])
- assertEquals(FloatValue(8.0f), annotation.params["floatValue"])
- assertEquals(StringValue("STRING_CONSTANT_VALUE"), annotation.params["stringValue"])
- assertEquals(StringValue("c"), annotation.params["charValue"])
- }
- }
- }
-
- // TODO [beresnev] fix
-// class OnlyPsiPlugin : DokkaPlugin() {
-// private val kotlinAnalysisPlugin by lazy { plugin<Kotlin>() }
-//
-// @Suppress("unused")
-// val psiOverrideDescriptorTranslator by extending {
-// (plugin<JavaAnalysisPlugin>().psiToDocumentableTranslator
-// override kotlinAnalysisPlugin.descriptorToDocumentableTranslator)
-// }
-//
-// @OptIn(DokkaPluginApiPreview::class)
-// override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
-// PluginApiPreviewAcknowledgement
-// }
-//
-// // for Kotlin classes from DefaultPsiToDocumentableTranslator
-// @Test
-// fun `should resolve ultralight class`() {
-// val configurationWithNoJVM = dokkaConfiguration {
-// sourceSets {
-// sourceSet {
-// sourceRoots = listOf("src/main/java")
-// }
-// }
-// }
-//
-// testInline(
-// """
-// |/src/main/java/example/Test.kt
-// |package example
-// |
-// |open class KotlinSubClass {
-// | fun kotlinSubclassFunction(bar: String): String {
-// | return "KotlinSubClass"
-// | }
-// |}
-// |
-// |/src/main/java/example/JavaLeafClass.java
-// |package example;
-// |
-// |public class JavaLeafClass extends KotlinSubClass {
-// | public String javaLeafClassFunction(String baz) {
-// | return "JavaLeafClass";
-// | }
-// |}
-// """.trimMargin(),
-// configurationWithNoJVM,
-// pluginOverrides = listOf(OnlyPsiPlugin()) // suppress a descriptor translator because of psi and descriptor translators work in parallel
-// ) {
-// documentablesMergingStage = { module ->
-// val kotlinSubclassFunction =
-// module.packages.single().classlikes.find { it.name == "JavaLeafClass" }?.functions?.find { it.name == "kotlinSubclassFunction" }
-// .assertNotNull("kotlinSubclassFunction ")
-//
-// assertEquals(
-// "String",
-// (kotlinSubclassFunction.type as? TypeConstructor)?.dri?.classNames
-// )
-// assertEquals(
-// "String",
-// (kotlinSubclassFunction.parameters.firstOrNull()?.type as? TypeConstructor)?.dri?.classNames
-// )
-// }
-// }
-// }
-
- @Test
- fun `should preserve regular functions that are named like getters, but are not getters`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public String getA() { return "s"; } // wrong return type
- | public int getA(String param) { return 123; } // shouldn't have params
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val getterLookalikes = testClass.functions.filter { it.name == "getA" }
- assertEquals(2, getterLookalikes.size, "Not all expected regular functions found, wrongly categorized as getters?")
- }
- }
- }
-
- @Test
- fun `should ignore additional non-accessor setters`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- |
- | public int getA() { return a; }
- |
- | public void setA(long a) { }
- | public void setA(Number a) {}
- |
- | // the qualifying setter is intentionally in the middle
- | // to rule out the order making a difference
- | public void setA(int a) { }
- |
- | public void setA(String a) {}
- | public void setA() {}
- |
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val property = testClass.properties.single { it.name == "a" }
- assertNotNull(property.getter)
-
- val setter = property.setter
- assertNotNull(setter)
- assertEquals(1, setter.parameters.size)
- assertEquals(PrimitiveJavaType("int"), setter.parameters[0].type)
-
- val regularSetterFunctions = testClass.functions.filter { it.name == "setA" }
- assertEquals(4, regularSetterFunctions.size)
- }
- }
- }
-
- @Test
- fun `should not qualify methods with subtype parameters as type accessors`() {
- testInline(
- """
- |/src/main/java/test/Shape.java
- |package test;
- |public class Shape { }
- |
- |/src/main/java/test/Triangle.java
- |package test;
- |public class Triangle extends Shape { }
- |
- |/src/main/java/test/Square.java
- |package test;
- |public class Square extends Shape { }
- |
- |/src/main/java/test/Test.java
- |package test;
- |public class Test {
- | private Shape foo = 1;
- |
- | public Shape getFoo() { return new Square(); }
- |
- | public void setFoo(Square foo) { }
- | public void setFoo(Triangle foo) { }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testClass = module.packages.single().classlikes.single { it.name == "Test" }
-
- val field = testClass.properties.singleOrNull { it.name == "foo" }
- assertNotNull(field) {
- "Expected the foo property to exist because the field is private with a public getter"
- }
- assertNull(field.setter)
-
- val setterMethodsWithSubtypeParams = testClass.functions.filter { it.name == "setFoo" }
- assertEquals(
- 2,
- setterMethodsWithSubtypeParams.size,
- "Expected the setter methods to not qualify as accessors because of subtype parameters"
- )
- }
- }
- }
-
- @Test
- fun `should preserve private fields without getters even if they have qualifying setters`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- |
- | public void setA(int a) { }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val tetClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val property = tetClass.properties.firstOrNull { it.name == "a" }
- assertNull(property, "Expected the property to stay private because there are no getters")
-
- val regularSetterFunction = tetClass.functions.firstOrNull { it.name == "setA" }
- assertNotNull(regularSetterFunction) {
- "The qualifying setter function should stay a regular function because the field is inaccessible"
- }
- }
- }
- }
-
- @Test
- fun `should not mark a multi-param setter overload as an accessor`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private int field = 1;
- |
- | public void setField(int a, int b) { }
- | public int getField() { return a; }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testClass = module.packages.single().classlikes.single { it.name == "A" } as DClass
-
- val property = testClass.properties.single { it.name == "field" }
- assertEquals("getField", property.getter?.name)
- assertNull(property.setter)
-
-
- // the setField function should not qualify to be an accessor due to the second param
- assertEquals(1, testClass.functions.size)
- assertEquals("setField", testClass.functions[0].name)
- }
- }
- }
-
- @Test
- fun `should not associate accessors with field because field is public api`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- documentedVisibilities = setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- }
-
- testInline(
- """
- |/src/test/A.java
- |package test;
- |public class A {
- | protected int a = 1;
- | public int getA() { return a; }
- | public void setA(int a) { this.a = a; }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val property = testedClass.properties.single { it.name == "a" }
- assertEquals(JavaVisibility.Protected, property.visibility.values.single())
- assertNull(property.getter)
- assertNull(property.setter)
-
- assertEquals(2, testedClass.functions.size)
-
- assertEquals("getA", testedClass.functions[0].name)
- assertEquals("setA", testedClass.functions[1].name)
- }
- }
- }
-
- @Test
- fun `should add IsVar extra for field with getter and setter`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public int getA() { return a; }
- | public void setA(int a) { this.a = a; }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val property = testedClass.properties.single { it.name == "a" }
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `should not add IsVar extra if field does not have a setter`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private int a = 1;
- | public int getA() { return a; }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val property = testedClass.properties.single { it.name == "a" }
- assertNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `should add IsVar for non-final java field without any accessors`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | public int a = 1;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val property = testedClass.properties.single { it.name == "a" }
- assertNotNull(property.extra[IsVar])
- }
- }
- }
-
- @Test
- fun `should not add IsVar for final java field`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | public final int a = 2;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.packages.single().classlikes.single { it.name == "A" }
-
- val publicFinal = testedClass.properties.single { it.name == "a" }
- assertNull(publicFinal.extra[IsVar])
- }
- }
- }
-
- @Test // see https://github.com/Kotlin/dokka/issues/2646
- fun `should resolve PsiImmediateClassType as class reference`() {
- testInline(
- """
- |/src/main/java/test/JavaEnum.java
- |package test;
- |public enum JavaEnum {
- | FOO, BAR
- |}
- |
- |/src/main/java/test/ContainingEnumType.java
- |package test;
- |public class ContainingEnumType {
- |
- | public JavaEnum returningEnumType() {
- | return null;
- | }
- |
- | public JavaEnum[] returningEnumTypeArray() {
- | return null;
- | }
- |
- | public void acceptingEnumType(JavaEnum javaEnum) {}
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val expectedType = GenericTypeConstructor(
- dri = DRI(packageName = "test", classNames = "JavaEnum", target = PointingToDeclaration),
- projections = emptyList()
- )
- val expectedArrayType = GenericTypeConstructor(
- dri = DRI("kotlin", "Array", target = PointingToDeclaration),
- projections = listOf(expectedType)
- )
-
- val classWithEnumUsage = module.packages.single().classlikes.single { it.name == "ContainingEnumType" }
-
- val returningEnum = classWithEnumUsage.functions.single { it.name == "returningEnumType" }
- assertEquals(expectedType, returningEnum.type)
-
- val acceptingEnum = classWithEnumUsage.functions.single { it.name == "acceptingEnumType" }
- assertEquals(1, acceptingEnum.parameters.size)
- assertEquals(expectedType, acceptingEnum.parameters[0].type)
-
- val returningArray = classWithEnumUsage.functions.single { it.name == "returningEnumTypeArray" }
- assertEquals(expectedArrayType, returningArray.type)
- }
- }
- }
-
- @Test
- fun `should have documentation for synthetic Enum values functions`() {
- testInline(
- """
- |/src/main/java/test/JavaEnum.java
- |package test
- |
- |public enum JavaEnum {
- | FOO, BAR;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val kotlinEnum = module.packages.find { it.name == "test" }
- ?.classlikes
- ?.single { it.name == "JavaEnum" }
- assertNotNull(kotlinEnum)
-
- val valuesFunction = kotlinEnum.functions.single { it.name == "values" }
-
- val expectedDocumentation = DocumentationNode(listOf(
- Description(
- CustomDocTag(
- children = listOf(
- P(listOf(
- Text(
- "Returns an array containing the constants of this enum type, " +
- "in the order they're declared. This method may be used to " +
- "iterate over the constants."
- ),
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- ),
- Return(
- CustomDocTag(
- children = listOf(
- P(listOf(
- Text("an array containing the constants of this enum type, in the order they're declared")
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- )
- ))
- assertEquals(expectedDocumentation, valuesFunction.documentation.values.single())
-
- val expectedValuesType = GenericTypeConstructor(
- dri = DRI(
- packageName = "kotlin",
- classNames = "Array"
- ),
- projections = listOf(
- GenericTypeConstructor(
- dri = DRI(
- packageName = "test",
- classNames = "JavaEnum"
- ),
- projections = emptyList()
- )
- )
- )
- assertEquals(expectedValuesType, valuesFunction.type)
- }
- }
- }
-
- @Test
- fun `should have documentation for synthetic Enum valueOf functions`() {
- testInline(
- """
- |/src/main/java/test/JavaEnum.java
- |package test
- |
- |public enum JavaEnum {
- | FOO, BAR;
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val javaEnum = module.packages.find { it.name == "test" }
- ?.classlikes
- ?.single { it.name == "JavaEnum" }
- assertNotNull(javaEnum)
-
- val valueOfFunction = javaEnum.functions.single { it.name == "valueOf" }
-
- val expectedDocumentation = DocumentationNode(listOf(
- Description(
- CustomDocTag(
- children = listOf(
- P(listOf(
- Text(
- "Returns the enum constant of this type with the " +
- "specified name. The string must match exactly an identifier used " +
- "to declare an enum constant in this type. (Extraneous whitespace " +
- "characters are not permitted.)"
- )
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- ),
- Return(
- root = CustomDocTag(
- children = listOf(
- P(listOf(
- Text("the enum constant with the specified name")
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- ),
- Throws(
- name = "java.lang.IllegalArgumentException",
- exceptionAddress = DRI(
- packageName = "java.lang",
- classNames = "IllegalArgumentException",
- target = PointingToDeclaration
- ),
- root = CustomDocTag(
- children = listOf(
- P(listOf(
- Text("if this enum type has no constant with the specified name")
- ))
- ),
- name = "MARKDOWN_FILE"
- )
- ),
- ))
- assertEquals(expectedDocumentation, valueOfFunction.documentation.values.single())
-
- val expectedValueOfType = GenericTypeConstructor(
- dri = DRI(
- packageName = "test",
- classNames = "JavaEnum"
- ),
- projections = emptyList()
- )
- assertEquals(expectedValueOfType, valueOfFunction.type)
-
- val valueOfParamDRI = (valueOfFunction.parameters.single().type as GenericTypeConstructor).dri
- assertEquals(DRI(packageName = "java.lang", classNames = "String"), valueOfParamDRI)
- }
- }
- }
-
- @Test
- fun `should have public default constructor in public class`() {
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.findClasslike(packageName = "test", "A") as DClass
-
- assertEquals(1, testedClass.constructors.size, "Expect 1 default constructor")
- assertTrue(
- testedClass.constructors.first().parameters.isEmpty(),
- "Expect default constructor doesn't have params"
- )
- assertEquals(JavaVisibility.Public, testedClass.constructors.first().visibility())
- }
- }
- }
-
- @Test
- fun `should have package-private default constructor in package-private class`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- documentedVisibilities = setOf(Visibility.PUBLIC, Visibility.PACKAGE)
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |class A {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.findClasslike(packageName = "test", "A") as DClass
-
- assertEquals(1, testedClass.constructors.size, "Expect 1 default constructor")
- assertEquals(JavaVisibility.Default, testedClass.constructors.first().visibility())
- }
- }
- }
-
- @Test
- fun `should have private default constructor in private nested class`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- documentedVisibilities = setOf(Visibility.PUBLIC, Visibility.PRIVATE)
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private static class PrivateNested{}
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val parentClass = module.findClasslike(packageName = "test", "A") as DClass
- val testedClass = parentClass.classlikes.single { it.name == "PrivateNested" } as DClass
-
- assertEquals(1, testedClass.constructors.size, "Expect 1 default constructor")
- assertEquals(JavaVisibility.Private, testedClass.constructors.first().visibility())
- }
- }
- }
-
- @Test
- fun `should not have a default public constructor because have explicit private`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- documentedVisibilities = setOf(Visibility.PUBLIC, Visibility.PRIVATE)
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/test/A.java
- |package test;
- |public class A {
- | private A(){}
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.findClasslike(packageName = "test", "A") as DClass
-
- assertEquals(1, testedClass.constructors.size, "Expect 1 declared constructor")
- assertEquals(JavaVisibility.Private, testedClass.constructors.first().visibility())
- }
- }
- }
-
- @Test
- fun `default constructor should get the package name`() {
- testInline(
- """
- |/src/main/java/org/test/A.java
- |package org.test;
- |public class A {
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = { module ->
- val testedClass = module.findClasslike(packageName = "org.test", "A") as DClass
-
- assertEquals(1, testedClass.constructors.size, "Expect 1 default constructor")
-
- val constructorDRI = testedClass.constructors.first().dri
- assertEquals("org.test", constructorDRI.packageName)
- assertEquals("A", constructorDRI.classNames)
- }
- }
- }
-}
-
-private fun DFunction.visibility() = visibility.values.first()
diff --git a/plugins/base/src/test/kotlin/translators/ExternalDocumentablesTest.kt b/plugins/base/src/test/kotlin/translators/ExternalDocumentablesTest.kt
deleted file mode 100644
index 1879c538..00000000
--- a/plugins/base/src/test/kotlin/translators/ExternalDocumentablesTest.kt
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.analysis.kotlin.internal.ExternalDocumentablesProvider
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DInterface
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.cast
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ExternalDocumentablesTest : BaseAbstractTest() {
- @Test
- fun `external documentable from java stdlib`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- analysisPlatform = "jvm"
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- testInline(
- """
- /src/com/sample/MyList.kt
- package com.sample
- class MyList: ArrayList<Int>()
- """.trimIndent(),
- configuration
- ) {
- lateinit var provider: ExternalDocumentablesProvider
- pluginsSetupStage = {
- provider = it.plugin<InternalKotlinAnalysisPlugin>().querySingle { externalDocumentablesProvider }
- }
- documentablesTransformationStage = { mod ->
- val entry = mod.packages.single().classlikes.single().cast<DClass>().supertypes.entries.single()
- val res = provider.findClasslike(
- entry.value.single().typeConstructor.dri,
- entry.key)
- assertEquals("ArrayList", res?.name)
- assertEquals("java.util/ArrayList///PointingToDeclaration/", res?.dri?.toString())
-
- val supertypes = res?.cast<DClass>()?.supertypes?.values?.single()
- ?.map { it.typeConstructor.dri.classNames }
- assertEquals(
- listOf("AbstractList", "RandomAccess", "Cloneable", "Serializable", "MutableList"),
- supertypes
- )
- }
- }
- }
-
- @Test
- fun `external documentable from dependency`() {
- val coroutinesPath =
- ClassLoader.getSystemResource("kotlinx/coroutines/Job.class")
- ?.file
- ?.replace("file:", "")
- ?.replaceAfter(".jar", "")
-
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- analysisPlatform = "jvm"
- classpath += listOf(jvmStdlibPath!!, coroutinesPath!!)
- }
- }
- }
-
- testInline(
- """
- /src/com/sample/MyJob.kt
- package com.sample
- import kotlinx.coroutines.Job
- abstract class MyJob: Job
- """.trimIndent(),
- configuration
- ) {
- lateinit var provider: ExternalDocumentablesProvider
- pluginsSetupStage = {
- provider = it.plugin<InternalKotlinAnalysisPlugin>().querySingle { externalDocumentablesProvider }
- }
- documentablesTransformationStage = { mod ->
- val entry = mod.packages.single().classlikes.single().cast<DClass>().supertypes.entries.single()
- val res = provider.findClasslike(
- entry.value.single().typeConstructor.dri,
- entry.key)
- assertEquals("Job", res?.name)
- assertEquals("kotlinx.coroutines/Job///PointingToDeclaration/", res?.dri?.toString())
-
- val supertypes = res?.cast<DInterface>()?.supertypes?.values?.single()
- ?.map { it.typeConstructor.dri.classNames }
- assertEquals(
- listOf("CoroutineContext.Element"),
- supertypes
- )
- }
- }
- }
-
- @Test
- fun `external documentable for nested class`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- analysisPlatform = "jvm"
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- testInline(
- """
- /src/com/sample/MyList.kt
- package com.sample
- abstract class MyEntry: Map.Entry<Int, String>
- """.trimIndent(),
- configuration
- ) {
- lateinit var provider: ExternalDocumentablesProvider
- pluginsSetupStage = {
- provider = it.plugin<InternalKotlinAnalysisPlugin>().querySingle { externalDocumentablesProvider }
- }
- documentablesTransformationStage = { mod ->
- val entry = mod.packages.single().classlikes.single().cast<DClass>().supertypes.entries.single()
- val res = provider.findClasslike(
- entry.value.single().typeConstructor.dri,
- entry.key)
- assertEquals("Entry", res?.name)
- assertEquals("kotlin.collections/Map.Entry///PointingToDeclaration/", res?.dri?.toString())
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/translators/JavadocInheritDocsTest.kt b/plugins/base/src/test/kotlin/translators/JavadocInheritDocsTest.kt
deleted file mode 100644
index 6413866f..00000000
--- a/plugins/base/src/test/kotlin/translators/JavadocInheritDocsTest.kt
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.doc.CustomDocTag
-import org.jetbrains.dokka.model.doc.Description
-import org.jetbrains.dokka.model.doc.P
-import org.jetbrains.dokka.model.doc.Text
-import kotlin.test.Ignore
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavadocInheritDocsTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- @Test
- fun `work when whole description is inherited`() {
- testInline(
- """
- |/src/main/java/sample/Superclass.java
- |package sample;
- |/**
- |* Superclass docs
- |*/
- |public class Superclass { }
- |
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* {@inheritDoc}
- |*/
- |public class Subclass extends Superclass { }
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val subclass = module.findClasslike("sample", "Subclass")
- val descriptionGot = subclass.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Superclass docs"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-
- @Test
- fun `work when inherited part is inside description`() {
- testInline(
- """
- |/src/main/java/sample/Superclass.java
- |package sample;
- |/**
- |* Superclass docs
- |*/
- |public class Superclass { }
- |
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* Subclass docs. {@inheritDoc} End of subclass docs
- |*/
- |public class Subclass extends Superclass { }
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val subclass = module.findClasslike("sample", "Subclass")
- val descriptionGot = subclass.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Subclass docs. Superclass docs End of subclass docs"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-
- @Test
- fun `work when inherited part is empty`() {
- testInline(
- """
- |/src/main/java/sample/Superclass.java
- |package sample;
- |public class Superclass { }
- |
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* Subclass docs. {@inheritDoc} End of subclass docs
- |*/
- |public class Subclass extends Superclass { }
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val subclass = module.findClasslike("sample", "Subclass")
- val descriptionGot = subclass.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Subclass docs. End of subclass docs"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-
- @Test
- @Ignore // This should be enabled when we have proper tag inheritance in javadoc parser
- fun `work when inherited part is empty in supertype but present in its supertype`() {
- testInline(
- """
- |/src/main/java/sample/SuperSuperclass.java
- |package sample;
- |/**
- |* Super super docs
- |*/
- |public class SuperSuperclass { }
- |/src/main/java/sample/Superclass.java
- |package sample;
- |public class Superclass extends SuperSuperClass { }
- |
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* Subclass docs. {@inheritDoc} End of subclass docs
- |*/
- |public class Subclass extends Superclass { }
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val subclass = module.findClasslike("sample", "Subclass")
- val descriptionGot = subclass.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Subclass docs. Super super docs End of subclass docs"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-
- @Test
- //Original javadoc doesn't treat interfaces as valid candidates for inherit doc
- fun `work with interfaces`() {
- testInline(
- """
- |/src/main/java/sample/SuperInterface.java
- |package sample;
- |/**
- |* Super super docs
- |*/
- |public interface SuperInterface { }
- |
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* Subclass docs. {@inheritDoc} End of subclass docs
- |*/
- |public interface Subclass extends SuperInterface { }
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val subclass = module.findClasslike("sample", "Subclass")
- val descriptionGot = subclass.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Subclass docs. End of subclass docs"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-
-
- @Test
- fun `work with multiple supertypes`() {
- testInline(
- """
- |/src/main/java/sample/SuperInterface.java
- |package sample;
- |/**
- |* Super interface docs
- |*/
- |public interface SuperInterface { }
- |/src/main/java/sample/Superclass.java
- |package sample;
- |/**
- |* Super class docs
- |*/
- |public class Superclass { }
- |
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* Subclass docs. {@inheritDoc} End of subclass docs
- |*/
- |public class Subclass extends Superclass implements SuperInterface { }
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val subclass = module.findClasslike("sample", "Subclass")
- val descriptionGot = subclass.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Subclass docs. Super class docs End of subclass docs"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-
- @Test
- fun `work with methods`() {
- testInline(
- """
- |/src/main/java/sample/Superclass.java
- |package sample;
- |public class Superclass {
- |/**
- |* Sample super method
- |*
- |* @return super string
- |* @throws RuntimeException super throws
- |* @see java.lang.String super see
- |* @deprecated super deprecated
- |*/
- |public String test() {
- | return "";
- |}
- |}
- |/src/main/java/sample/Subclass.java
- |package sample;
- |public class Subclass extends Superclass {
- | /**
- | * Sample sub method. {@inheritDoc}
- | */
- | @Override
- | public String test() {
- | return super.test();
- | }
- |}
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = { module ->
- val function = module.findFunction("sample", "Subclass", "test")
- val descriptionGot = function.documentation.values.first().children.first()
- val expectedDescription = Description(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Sample sub method. Sample super method"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedDescription, descriptionGot)
- }
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/translators/JavadocInheritedDocTagsTest.kt b/plugins/base/src/test/kotlin/translators/JavadocInheritedDocTagsTest.kt
deleted file mode 100644
index a20db4ca..00000000
--- a/plugins/base/src/test/kotlin/translators/JavadocInheritedDocTagsTest.kt
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.model.doc.*
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import org.jetbrains.dokka.model.doc.Deprecated as DokkaDeprecatedTag
-import org.jetbrains.dokka.model.doc.Throws as DokkaThrowsTag
-
-class JavadocInheritedDocTagsTest : BaseAbstractTest() {
- @Suppress("DEPRECATION") // for includeNonPublic
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- includeNonPublic = true
- }
- }
- }
-
- private fun performTagsTest(test: (DModule) -> Unit) {
- testInline(
- """
- |/src/main/java/sample/Superclass.java
- |package sample;
- |/**
- |* @author super author
- |*/
- |class Superclass {
- | /**
- | * Sample super method
- | *
- | * @return super string
- | * @throws RuntimeException super throws
- | * @see java.lang.String super see
- | * @deprecated super deprecated
- | */
- | public String test(){
- | return "";
- | }
- |
- | /**
- | *
- | * @param xd String superclass
- | * @param asd Integer superclass
- | */
- | public void test2(String xd, Integer asd){
- | }
- |}
- |/src/main/java/sample/Subclass.java
- |package sample;
- |/**
- |* @author Ja, {@inheritDoc}
- |*/
- |class Subclass extends Superclass {
- |/**
- | * Sample sub method. {@inheritDoc}
- | *
- | * @return "sample string". {@inheritDoc}
- | * @throws RuntimeException because i can, {@inheritDoc}
- | * @throws IllegalStateException this should be it {@inheritDoc}
- | * @see java.lang.String string, {@inheritDoc}
- | * @deprecated do not use, {@inheritDoc}
- | */
- | @Override
- | public String test() {
- | return super.test();
- | }
- |
- | /**
- | *
- | * @param asd2 integer subclass, {@inheritDoc}
- | * @param xd2 string subclass, {@inheritDoc}
- | */
- | public void test2(String xd2, Integer asd2){
- | }
- |}
- """.trimIndent(), configuration
- ) {
- documentablesMergingStage = test
- }
- }
-
- @Test
- fun `work with return`() {
- performTagsTest { module ->
- val function = module.findFunction("sample", "Subclass", "test")
- val renderedTag = function.documentation.values.first().children.filterIsInstance<Return>().first()
- val expectedTag = Return(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("\"sample string\". super string"))
- )
- ),
- name = "MARKDOWN_FILE"
- )
- )
-
- assertEquals(expectedTag, renderedTag)
- }
- }
-
- @Test
- fun `work with throws`() {
- performTagsTest { module ->
- val function = module.findFunction("sample", "Subclass", "test")
- val renderedTag =
- function.documentation.values.first().children.first { it is DokkaThrowsTag && it.name == "java.lang.RuntimeException" }
- val expectedTag = DokkaThrowsTag(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("because i can, super throws"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- "java.lang.RuntimeException",
- DRI("java.lang", "RuntimeException", target = PointingToDeclaration)
- )
-
- assertEquals(expectedTag, renderedTag)
- }
- }
-
- @Test
- fun `work with throws when exceptions are different`() {
- performTagsTest { module ->
- val function = module.findFunction("sample", "Subclass", "test")
- val renderedTag =
- function.documentation.values.first().children.first { it is DokkaThrowsTag && it.name == "java.lang.IllegalStateException" }
- val expectedTag = DokkaThrowsTag(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("this should be it"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- "java.lang.IllegalStateException",
- DRI("java.lang", "IllegalStateException", target = PointingToDeclaration)
- )
-
- assertEquals(expectedTag, renderedTag)
- }
- }
-
- @Test
- fun `work with deprecated`() {
- performTagsTest { module ->
- val function = module.findFunction("sample", "Subclass", "test")
- val renderedTag = function.documentation.values.first().children.filterIsInstance<DokkaDeprecatedTag>().first()
- val expectedTag = DokkaDeprecatedTag(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("do not use, Sample super method"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- )
-
- assertEquals(expectedTag, renderedTag)
- }
- }
-
- @Test
- fun `work with see also`() {
- performTagsTest { module ->
- val function = module.findFunction("sample", "Subclass", "test")
- val renderedTag = function.documentation.values.first().children.filterIsInstance<See>().first()
- val expectedTag = See(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("string,"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- "java.lang.String",
- DRI("java.lang", "String")
- )
-
- assertEquals(expectedTag, renderedTag)
- }
- }
-
- @Test
- fun `work with author`() {
- performTagsTest { module ->
- val classlike = module.findClasslike("sample", "Subclass")
- val renderedTag = classlike.documentation.values.first().children.filterIsInstance<Author>().first()
- val expectedTag = Author(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("Ja, super author"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- )
-
- assertEquals(expectedTag, renderedTag)
- }
- }
-
- @Test
- fun `work with params`() {
- performTagsTest { module ->
- val function = module.findFunction("sample", "Subclass", "test2")
- val (asdTag, xdTag) = function.documentation.values.first().children.filterIsInstance<Param>()
- .sortedBy { it.name }
-
- val expectedAsdTag = Param(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("integer subclass, Integer superclass"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- "asd2"
- )
- val expectedXdTag = Param(
- CustomDocTag(
- children = listOf(
- P(
- children = listOf(Text("string subclass, String superclass"))
- )
- ),
- name = "MARKDOWN_FILE"
- ),
- "xd2"
- )
- assertEquals(expectedAsdTag, asdTag)
- assertEquals(expectedXdTag, xdTag)
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/translators/JavadocParserTest.kt b/plugins/base/src/test/kotlin/translators/JavadocParserTest.kt
deleted file mode 100644
index 3f83f462..00000000
--- a/plugins/base/src/test/kotlin/translators/JavadocParserTest.kt
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.model.childrenOfType
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.firstChildOfType
-import org.jetbrains.dokka.model.firstMemberOfType
-import utils.text
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavadocParserTest : BaseAbstractTest() {
-
- private fun performJavadocTest(testOperation: (DModule) -> Unit) {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/java")
- }
- }
- }
-
- testInline(
- """
- |/src/main/java/sample/Date2.java
- |/**
- | * The class <code>Date</code> represents a specific instant
- | * in time, with millisecond precision.
- | * <p>
- | * Prior to JDK&nbsp;1.1, the class <code>Date</code> had two additional
- | * functions. It allowed the interpretation of dates as year, month, day, hour,
- | * minute, and second values. It also allowed the formatting and parsing
- | * of date strings. Unfortunately, the API for these functions was not
- | * amenable to internationalization. As of JDK&nbsp;1.1, the
- | * <code>Calendar</code> class should be used to convert between dates and time
- | * fields and the <code>DateFormat</code> class should be used to format and
- | * parse date strings.
- | * The corresponding methods in <code>Date</code> are deprecated.
- | * <p>
- | * Although the <code>Date</code> class is intended to reflect
- | * coordinated universal time (UTC), it may not do so exactly,
- | * depending on the host environment of the Java Virtual Machine.
- | * Nearly all modern operating systems assume that 1&nbsp;day&nbsp;=
- | * 24&nbsp;&times;&nbsp;60&nbsp;&times;&nbsp;60&nbsp;= 86400 seconds
- | * in all cases. In UTC, however, about once every year or two there
- | * is an extra second, called a "leap second." The leap
- | * second is always added as the last second of the day, and always
- | * on December 31 or June 30. For example, the last minute of the
- | * year 1995 was 61 seconds long, thanks to an added leap second.
- | * Most computer clocks are not accurate enough to be able to reflect
- | * the leap-second distinction.
- | * <p>
- | * Some computer standards are defined in terms of Greenwich mean
- | * time (GMT), which is equivalent to universal time (UT). GMT is
- | * the "civil" name for the standard; UT is the
- | * "scientific" name for the same standard. The
- | * distinction between UTC and UT is that UTC is based on an atomic
- | * clock and UT is based on astronomical observations, which for all
- | * practical purposes is an invisibly fine hair to split. Because the
- | * earth's rotation is not uniform (it slows down and speeds up
- | * in complicated ways), UT does not always flow uniformly. Leap
- | * seconds are introduced as needed into UTC so as to keep UTC within
- | * 0.9 seconds of UT1, which is a version of UT with certain
- | * corrections applied. There are other time and date systems as
- | * well; for example, the time scale used by the satellite-based
- | * global positioning system (GPS) is synchronized to UTC but is
- | * <i>not</i> adjusted for leap seconds. An interesting source of
- | * further information is the U.S. Naval Observatory, particularly
- | * the Directorate of Time at:
- | * <blockquote><pre>
- | * <a href=http://tycho.usno.navy.mil>http://tycho.usno.navy.mil</a>
- | * </pre></blockquote>
- | * <p>
- | * and their definitions of "Systems of Time" at:
- | * <blockquote><pre>
- | * <a href=http://tycho.usno.navy.mil/systime.html>http://tycho.usno.navy.mil/systime.html</a>
- | * </pre></blockquote>
- | * <p>
- | * In all methods of class <code>Date</code> that accept or return
- | * year, month, date, hours, minutes, and seconds values, the
- | * following representations are used:
- | * <ul>
- | * <li>A year <i>y</i> is represented by the integer
- | * <i>y</i>&nbsp;<code>-&nbsp;1900</code>.
- | * <li>A month is represented by an integer from 0 to 11; 0 is January,
- | * 1 is February, and so forth; thus 11 is December.
- | * <li>A date (day of month) is represented by an integer from 1 to 31
- | * in the usual manner.
- | * <li>An hour is represented by an integer from 0 to 23. Thus, the hour
- | * from midnight to 1 a.m. is hour 0, and the hour from noon to 1
- | * p.m. is hour 12.
- | * <li>A minute is represented by an integer from 0 to 59 in the usual manner.
- | * <li>A second is represented by an integer from 0 to 61; the values 60 and
- | * 61 occur only for leap seconds and even then only in Java
- | * implementations that actually track leap seconds correctly. Because
- | * of the manner in which leap seconds are currently introduced, it is
- | * extremely unlikely that two leap seconds will occur in the same
- | * minute, but this specification follows the date and time conventions
- | * for ISO C.
- | * </ul>
- | * <pre class="prettyprint">
- | * &lt;androidx.fragment.app.FragmentContainerView
- | * xmlns:android="http://schemas.android.com/apk/res/android"
- | * xmlns:app="http://schemas.android.com/apk/res-auto"
- | * android:id="@+id/fragment_container_view"
- | * android:layout_width="match_parent"
- | * android:layout_height="match_parent"&gt;
- | * &lt;/androidx.fragment.app.FragmentContainerView&gt;
- | * </pre>
- | * <p>
- | * In all cases, arguments given to methods for these purposes need
- | * not fall within the indicated ranges; for example, a date may be
- | * specified as January 32 and is interpreted as meaning February 1.
- | *
- | * <pre class="prettyprint">
- | * class MyFragment extends Fragment {
- | * public MyFragment() {
- | * super(R.layout.fragment_main);
- | * }
- | * }
- | * </pre>
- |
- | * @author James Gosling
- | * @author Arthur van Hoff
- | * @author Alan Liu
- | * @see java.text.DateFormat
- | * @see java.util.Calendar
- | * @since JDK1.0
- | * @apiSince 1
- | */
- |public class Date2 implements java.io.Serializable, java.lang.Cloneable, java.lang.Comparable<java.util.Date> {
- | void x() { }
- |}
- """.trimIndent(),
- configuration
- ) {
- documentablesMergingStage = testOperation
- }
- }
-
- @Test
- fun `correctly parsed list`() {
- performJavadocTest { module ->
- val dateDescription = module.descriptionOf("Date2")!!
- assertEquals(6, dateDescription.firstChildOfType<Ul>().children.filterIsInstance<Li>().size)
- }
- }
-
- @Test
- fun `correctly parsed author tags`() {
- performJavadocTest { module ->
- val authors = module.findClasslike().documentation.values.single().childrenOfType<Author>()
- assertEquals(3, authors.size)
- assertEquals("James Gosling", authors[0].firstMemberOfType<Text>().text())
- assertEquals("Arthur van Hoff", authors[1].firstMemberOfType<Text>().text())
- assertEquals("Alan Liu", authors[2].firstMemberOfType<Text>().text())
- }
- }
-
- @Test
- fun `correctly parsed see tags`() {
- performJavadocTest { module ->
- val sees = module.findClasslike().documentation.values.single().childrenOfType<See>()
- assertEquals(2, sees.size)
- assertEquals(DRI("java.text", "DateFormat"), sees[0].address)
- assertEquals("java.text.DateFormat", sees[0].name)
- assertEquals(DRI("java.util", "Calendar"), sees[1].address)
- assertEquals("java.util.Calendar", sees[1].name)
- }
- }
-
- @Test
- fun `correctly parsed code block`(){
- performJavadocTest { module ->
- val dateDescription = module.descriptionOf("Date2")!!
- val preTagContent = dateDescription.firstChildOfType<Pre>().firstChildOfType<Text>()
- val expectedText = """<androidx.fragment.app.FragmentContainerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/fragment_container_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-</androidx.fragment.app.FragmentContainerView>""".trimIndent()
- assertEquals(expectedText.trim(), preTagContent.body.trim())
- }
- }
-
- @Test
- fun `correctly parsed code block with curly braces (which PSI has problem with)`() {
- performJavadocTest { module ->
- val dateDescription = module.descriptionOf("Date2")!!
- val preTagContent = dateDescription.childrenOfType<Pre>()[1].firstChildOfType<Text>()
- val expectedText = """class MyFragment extends Fragment {
- public MyFragment() {
- super(R.layout.fragment_main);
- }
-}""".trimIndent()
- assertEquals(expectedText.trim(), preTagContent.body.trim())
- }
- }
-
-}
diff --git a/plugins/base/src/test/kotlin/translators/utils.kt b/plugins/base/src/test/kotlin/translators/utils.kt
deleted file mode 100644
index b1979f60..00000000
--- a/plugins/base/src/test/kotlin/translators/utils.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package translators
-
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.Description
-import org.jetbrains.dokka.model.doc.Text
-
-fun DModule.documentationOf(className: String, functionName: String? = null): String =
- descriptionOf(className, functionName)
- ?.firstMemberOfType<Text>()
- ?.body.orEmpty()
-
-fun DModule.descriptionOf(className: String, functionName: String? = null): Description? {
- val classlike = packages.single()
- .classlikes.single { it.name == className }
- val target: Documentable =
- if (functionName != null) classlike.functions.single { it.name == functionName } else classlike
- return target.documentation.values.singleOrNull()
- ?.firstChildOfTypeOrNull<Description>()
-}
-
-fun DModule.findPackage(packageName: String? = null) =
- packageName?.let { packages.firstOrNull { pkg -> pkg.packageName == packageName }
- ?: throw NoSuchElementException("No packageName with name $packageName") } ?: packages.single()
-
-fun DModule.findClasslike(packageName: String? = null, className: String? = null): DClasslike {
- val pkg = findPackage(packageName)
- return className?.let {
- pkg.classlikes.firstOrNull { cls -> cls.name == className }
- ?: throw NoSuchElementException("No classlike with name $className")
- } ?: pkg.classlikes.single()
-}
-
-fun DModule.findFunction(packageName: String? = null, className: String, functionName: String? = null): DFunction {
- val classlike = findClasslike(packageName, className)
- return functionName?.let {
- classlike.functions.firstOrNull { fn -> fn.name == functionName }
- ?: throw NoSuchElementException("No classlike with name $functionName")
- } ?: classlike.functions.single()
-}
diff --git a/plugins/base/src/test/kotlin/utils/HtmlUtils.kt b/plugins/base/src/test/kotlin/utils/HtmlUtils.kt
deleted file mode 100644
index cb700a94..00000000
--- a/plugins/base/src/test/kotlin/utils/HtmlUtils.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
-import com.fasterxml.jackson.module.kotlin.readValue
-import org.jetbrains.dokka.base.renderers.html.SearchRecord
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-
-internal fun TestOutputWriter.navigationHtml(): Element = contents.getValue("navigation.html").let { Jsoup.parse(it) }
-
-internal fun TestOutputWriter.pagesJson(): List<SearchRecord> = jacksonObjectMapper().readValue(contents.getValue("scripts/pages.json"))
-
-internal fun Elements.selectNavigationGrid(): Element {
- return this.select("div.overview").select("span.nav-link-grid").single()
-}
diff --git a/plugins/base/src/test/kotlin/utils/ModelUtils.kt b/plugins/base/src/test/kotlin/utils/ModelUtils.kt
deleted file mode 100644
index fc7e9a2c..00000000
--- a/plugins/base/src/test/kotlin/utils/ModelUtils.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.plugability.DokkaPlugin
-
-abstract class AbstractModelTest(val path: String? = null, val pkg: String) : ModelDSL(), AssertDSL {
-
- fun inlineModelTest(
- query: String,
- platform: String = "jvm",
- prependPackage: Boolean = true,
- cleanupOutput: Boolean = true,
- pluginsOverrides: List<DokkaPlugin> = emptyList(),
- configuration: DokkaConfigurationImpl? = null,
- block: DModule.() -> Unit
- ) {
- val testConfiguration = configuration ?: dokkaConfiguration {
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- analysisPlatform = platform
- classpath += jvmStdlibPath!!
- }
- }
- }
- val prepend = path.let { p -> p?.let { "|$it\n" } ?: "" } + if (prependPackage) "|package $pkg" else ""
-
- testInline(
- query = ("$prepend\n$query").trim().trimIndent(),
- configuration = testConfiguration,
- cleanupOutput = cleanupOutput,
- pluginOverrides = pluginsOverrides
- ) {
- documentablesTransformationStage = block
- }
- }
-}
diff --git a/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt b/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt
deleted file mode 100644
index a81b1dae..00000000
--- a/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import org.junit.jupiter.api.Tag
-
-
-/**
- * Run a test only for descriptors, not symbols.
- *
- * In theory, these tests can be fixed
- */
-@Target(
- AnnotationTarget.CLASS,
- AnnotationTarget.FUNCTION,
- AnnotationTarget.PROPERTY_GETTER,
- AnnotationTarget.PROPERTY_SETTER
-)
-@Retention(
- AnnotationRetention.RUNTIME
-)
-@Tag("onlyDescriptors")
-annotation class OnlyDescriptors(val reason: String = "")
-
-/**
- * Run a test only for descriptors, not symbols.
- *
- * These tests cannot be fixed until Analysis API does not support MPP
- */
-@Target(
- AnnotationTarget.CLASS,
- AnnotationTarget.FUNCTION,
- AnnotationTarget.PROPERTY_GETTER,
- AnnotationTarget.PROPERTY_SETTER
-)
-@Retention(
- AnnotationRetention.RUNTIME
-)
-@Tag("onlyDescriptorsMPP")
-annotation class OnlyDescriptorsMPP(val reason: String = "")
diff --git a/plugins/base/src/test/kotlin/utils/TestUtils.kt b/plugins/base/src/test/kotlin/utils/TestUtils.kt
deleted file mode 100644
index 39ac4b23..00000000
--- a/plugins/base/src/test/kotlin/utils/TestUtils.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.doc.P
-import kotlin.collections.orEmpty
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-import kotlin.test.asserter
-import kotlin.test.fail
-
-@DslMarker
-annotation class TestDSL
-
-@TestDSL
-abstract class ModelDSL : BaseAbstractTest() {
- operator fun Documentable?.div(name: String): Documentable? =
- this?.children?.find { it.name == name }
-
- inline fun <reified T : Documentable> Documentable?.cast(): T =
- (this as? T).assertNotNull()
-}
-
-@TestDSL
-interface AssertDSL {
- infix fun Any?.equals(other: Any?) = assertEquals(other, this)
- infix fun Collection<Any>?.allEquals(other: Any?) =
- this?.onEach { it equals other } ?: run { fail("Collection is empty") }
- infix fun <T> Collection<T>?.exists(e: T) {
- assertTrue(this.orEmpty().isNotEmpty(), "Collection cannot be null or empty")
- assertTrue(this!!.any{it == e}, "Collection doesn't contain $e")
- }
-
- infix fun <T> Collection<T>?.counts(n: Int) = this.orEmpty().assertCount(n)
-
- infix fun <T> T?.notNull(name: String): T = this.assertNotNull(name)
-
- fun <T> Collection<T>.assertCount(n: Int, prefix: String = "") =
- assertEquals(n, count(), "${prefix}Expected $n, got ${count()}")
-}
-
-/*
- * TODO replace with kotlin.test.assertContains after migrating to Kotlin 1.5+
- */
-internal fun <T> assertContains(iterable: Iterable<T>, element: T, ) {
- asserter.assertTrue(
- { "Expected the collection to contain the element.\nCollection <$iterable>, element <$element>." },
- iterable.contains(element)
- )
-}
-
-inline fun <reified T : Any> Any?.assertIsInstance(name: String): T =
- this.let { it as? T } ?: throw AssertionError("$name should not be null")
-
-fun TagWrapper.text(): String = when (val t = this) {
- is NamedTagWrapper -> "${t.name}: [${t.root.text()}]"
- else -> t.root.text()
-}
-
-fun DocTag.text(): String = when (val t = this) {
- is Text -> t.body
- is Code -> t.children.joinToString("\n") { it.text() }
- is P -> t.children.joinToString("") { it.text() } + "\n"
- else -> t.children.joinToString("") { it.text() }
-}
-
-fun <T : Documentable> T?.comments(): String = docs().map { it.text() }
- .joinToString(separator = "\n") { it }
-
-fun <T> T?.assertNotNull(name: String = ""): T = this ?: throw AssertionError("$name should not be null")
-
-fun <T : Documentable> T?.docs() = this?.documentation.orEmpty().values.flatMap { it.children }
-
-val DClass.supers
- get() = supertypes.flatMap { it.component2() }
-
-val Bound.name: String?
- get() = when (this) {
- is Nullable -> inner.name
- is DefinitelyNonNullable -> inner.name
- is TypeParameter -> name
- is PrimitiveJavaType -> name
- is TypeConstructor -> dri.classNames
- is JavaObject -> "Object"
- is Void -> "void"
- is Dynamic -> "dynamic"
- is UnresolvedBound -> "<ERROR CLASS>"
- is TypeAliased -> typeAlias.name
- }
diff --git a/plugins/base/src/test/kotlin/utils/contentUtils.kt b/plugins/base/src/test/kotlin/utils/contentUtils.kt
deleted file mode 100644
index 3ca0bd2d..00000000
--- a/plugins/base/src/test/kotlin/utils/contentUtils.kt
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package utils
-
-import matchers.content.*
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.*
-import kotlin.test.assertEquals
-
-//TODO: Try to unify those functions after update to 1.4
-fun ContentMatcherBuilder<*>.functionSignature(
- annotations: Map<String, Set<String>>,
- visibility: String,
- modifier: String,
- keywords: Set<String>,
- name: String,
- returnType: String? = null,
- vararg params: Pair<String, ParamAttributes>
-) =
- platformHinted {
- bareSignature(annotations, visibility, modifier, keywords, name, returnType, *params)
- }
-
-fun ContentMatcherBuilder<*>.bareSignature(
- annotations: Map<String, Set<String>>,
- visibility: String,
- modifier: String,
- keywords: Set<String>,
- name: String,
- returnType: String? = null,
- vararg params: Pair<String, ParamAttributes>
-) = group {
- annotations.entries.forEach {
- group {
- unwrapAnnotation(it)
- }
- }
- if (visibility.isNotBlank()) +"$visibility "
- if (modifier.isNotBlank()) +"$modifier "
- +("${keywords.joinToString("") { "$it " }}fun ")
- link { +name }
- +"("
- if (params.isNotEmpty()) {
- group {
- params.forEachIndexed { id, (n, t) ->
- group {
- t.annotations.forEach {
- unwrapAnnotation(it)
- }
- t.keywords.forEach {
- +it
- }
-
- +"$n: "
- group { link { +(t.type) } }
- if (id != params.lastIndex)
- +", "
- }
- }
- }
- }
- +")"
- if (returnType != null) {
- +(": ")
- group {
- link {
- +(returnType)
- }
- }
- }
-}
-
-fun ContentMatcherBuilder<*>.classSignature(
- annotations: Map<String, Set<String>>,
- visibility: String,
- modifier: String,
- keywords: Set<String>,
- name: String,
- vararg params: Pair<String, ParamAttributes>,
- parent: String? = null
-) = group {
- annotations.entries.forEach {
- group {
- unwrapAnnotation(it)
- }
- }
- if (visibility.isNotBlank()) +"$visibility "
- if (modifier.isNotBlank()) +"$modifier "
- +("${keywords.joinToString("") { "$it " }}class ")
- link { +name }
- if (params.isNotEmpty()) {
- +"("
- group {
- params.forEachIndexed { id, (n, t) ->
- group {
- t.annotations.forEach {
- unwrapAnnotation(it)
- }
- t.keywords.forEach {
- +it
- }
-
- +"$n: "
- group { link { +(t.type) } }
- if (id != params.lastIndex)
- +", "
- }
- }
- }
- +")"
- }
- if (parent != null) {
- +(" : ")
- link {
- +(parent)
- }
- }
-}
-
-fun ContentMatcherBuilder<*>.functionSignatureWithReceiver(
- annotations: Map<String, Set<String>>,
- visibility: String?,
- modifier: String?,
- keywords: Set<String>,
- receiver: String,
- name: String,
- returnType: String? = null,
- vararg params: Pair<String, ParamAttributes>
-) =
- platformHinted {
- bareSignatureWithReceiver(annotations, visibility, modifier, keywords, receiver, name, returnType, *params)
- }
-
-fun ContentMatcherBuilder<*>.bareSignatureWithReceiver(
- annotations: Map<String, Set<String>>,
- visibility: String?,
- modifier: String?,
- keywords: Set<String>,
- receiver: String,
- name: String,
- returnType: String? = null,
- vararg params: Pair<String, ParamAttributes>
-) = group { // TODO: remove it when double wrapping for signatures will be resolved
- annotations.entries.forEach {
- group {
- unwrapAnnotation(it)
- }
- }
- if (visibility != null && visibility.isNotBlank()) +"$visibility "
- if (modifier != null && modifier.isNotBlank()) +"$modifier "
- +("${keywords.joinToString("") { "$it " }}fun ")
- group {
- link { +receiver }
- }
- +"."
- link { +name }
- +"("
- if (params.isNotEmpty()) {
- group {
- params.forEachIndexed { id, (n, t) ->
- group {
- t.annotations.forEach {
- unwrapAnnotation(it)
- }
- t.keywords.forEach {
- +it
- }
-
- +"$n: "
- group { link { +(t.type) } }
- if (id != params.lastIndex)
- +", "
- }
- }
- }
- }
- +")"
- if (returnType != null) {
- +(": ")
- group {
- link {
- +(returnType)
- }
- }
- }
-}
-
-fun ContentMatcherBuilder<*>.propertySignature(
- annotations: Map<String, Set<String>>,
- visibility: String,
- modifier: String,
- keywords: Set<String>,
- preposition: String,
- name: String,
- type: String? = null,
- value: String? = null
-) {
- group {
- header { +"Package-level declarations" }
- skipAllNotMatching()
- }
- tabbedGroup {
- group {
- skipAllNotMatching()
- tab(BasicTabbedContentType.PROPERTY) {
- header{ + "Properties" }
- table {
- group {
- link { +name }
- divergentGroup {
- divergentInstance {
- divergent {
- group {
- group {
- annotations.entries.forEach {
- group {
- unwrapAnnotation(it)
- }
- }
- if (visibility.isNotBlank()) +"$visibility "
- if (modifier.isNotBlank()) +"$modifier "
- +("${keywords.joinToString("") { "$it " }}$preposition ")
- link { +name }
- if (type != null) {
- +(": ")
- group {
- link {
- +(type)
- }
- }
- }
- if (value != null) {
- +(" = $value")
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-
-fun ContentMatcherBuilder<*>.typealiasSignature(name: String, expressionTarget: String) {
- group {
- header { +"Package-level declarations" }
- skipAllNotMatching()
- }
- group {
- group {
- tab(BasicTabbedContentType.TYPE) {
- header{ + "Types" }
- table {
- group {
- link { +name }
- divergentGroup {
- divergentInstance {
- group {
- group {
- group {
- group {
- +"typealias "
- group {
- group {
- link { +name }
- }
- skipAllNotMatching()
- }
- +" = "
- group {
- link { +expressionTarget }
- }
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- skipAllNotMatching()
- }
- skipAllNotMatching()
- }
- }
- }
-}
-
-fun ContentMatcherBuilder<*>.pWrapped(text: String) =
- group {// TODO: remove it when double wrapping for descriptions will be resolved
- group { +text }
- }
-
-fun ContentMatcherBuilder<*>.unnamedTag(tag: String, content: ContentMatcherBuilder<ContentGroup>.() -> Unit) =
- group {
- header(4) { +tag }
- content()
- }
-
-fun ContentMatcherBuilder<*>.comment(content: ContentMatcherBuilder<ContentGroup>.() -> Unit) =
- group {
- group {
- content()
- }
- }
-
-fun ContentMatcherBuilder<*>.unwrapAnnotation(elem: Map.Entry<String, Set<String>>) {
- group {
- +"@"
- link { +elem.key }
- if(elem.value.isNotEmpty()) {
- +"("
- elem.value.forEach {
- group {
- +("$it = ")
- skipAllNotMatching()
- }
- }
- +")"
- }
- }
-}
-inline fun<reified T> PageNode.contentPage(name: String, block: T.() -> Unit) {
- (dfs { it.name == name } as? T).assertNotNull("The page `$name` is not found").block()
-}
-
-fun ClasslikePageNode.assertHasFunctions(vararg expectedFunctionName: String) {
- val functions = this.findSectionWithName("Functions").assertNotNull("Functions")
- val functionsName = functions.children.map { (it.dfs { it is ContentText } as ContentText).text }
- assertEquals(expectedFunctionName.toList(), functionsName)
-}
-
-fun ClasslikePageNode.findSectionWithName(name: String) : ContentNode? {
- var sectionHeader: ContentHeader? = null
- return content.dfs { node ->
- node.children.filterIsInstance<ContentHeader>().any { header ->
- header.children.firstOrNull { it is ContentText && it.text == name }?.also { sectionHeader = header } != null
- }
- }?.children?.dropWhile { child -> child != sectionHeader }?.drop(1)?.firstOrNull()
-}
-
-data class ParamAttributes(
- val annotations: Map<String, Set<String>>,
- val keywords: Set<String>,
- val type: String
-)
-
-fun RootPageNode.findTestType(packageName: String, name: String) =
- children.single { it.name == packageName }.children.single { it.name == name } as ContentPage
diff --git a/plugins/base/src/test/resources/content/samples/samples.kt b/plugins/base/src/test/resources/content/samples/samples.kt
deleted file mode 100644
index 4c9f38dc..00000000
--- a/plugins/base/src/test/resources/content/samples/samples.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package test
-
-fun sampleForClassDescription() {
- print("Hello")
-}
diff --git a/plugins/base/src/test/resources/linkable/includes/include1.md b/plugins/base/src/test/resources/linkable/includes/include1.md
deleted file mode 100644
index 09882ec1..00000000
--- a/plugins/base/src/test/resources/linkable/includes/include1.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Module example
-
-This is JVM documentation for module example
-
-# Package example
-
-This is JVM documentation for package example
-
-## Example
-
-```kotlin
-\@SqlTable(People::class)
-class Person(val name: String, uuid: UUID = UUID.randomUUID()) : Entity(uuid)
-```
diff --git a/plugins/base/src/test/resources/linkable/includes/include11.md b/plugins/base/src/test/resources/linkable/includes/include11.md
deleted file mode 100644
index fa27b23d..00000000
--- a/plugins/base/src/test/resources/linkable/includes/include11.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Module example
-
-This is second JVM documentation for module example
diff --git a/plugins/base/src/test/resources/linkable/includes/include2.md b/plugins/base/src/test/resources/linkable/includes/include2.md
deleted file mode 100644
index 1574003d..00000000
--- a/plugins/base/src/test/resources/linkable/includes/include2.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Module example
-
-This is JS documentation for module example
-
-# Package greeteer
-
-This is JS documentation for package greeteer \ No newline at end of file
diff --git a/plugins/base/src/test/resources/linkable/samples/jsMain/kotlin/JsClass.kt b/plugins/base/src/test/resources/linkable/samples/jsMain/kotlin/JsClass.kt
deleted file mode 100644
index 62a961c1..00000000
--- a/plugins/base/src/test/resources/linkable/samples/jsMain/kotlin/JsClass.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package p2
-
-class JsClass {
-
- /**
- * @sample samples.SamplesJs.exampleUsage
- */
- fun printWithExclamation(msg: String) = println("$msg!")
-}
diff --git a/plugins/base/src/test/resources/linkable/samples/jsMain/resources/Samples.kt b/plugins/base/src/test/resources/linkable/samples/jsMain/resources/Samples.kt
deleted file mode 100644
index 5dc791d7..00000000
--- a/plugins/base/src/test/resources/linkable/samples/jsMain/resources/Samples.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package samples
-
-import p2.JsClass
-
-class SamplesJs {
-
- fun exampleUsage() {
- JsClass().printWithExclamation("Hi, Js")
- }
-}
diff --git a/plugins/base/src/test/resources/linkable/samples/jvmMain/kotlin/JvmClass.kt b/plugins/base/src/test/resources/linkable/samples/jvmMain/kotlin/JvmClass.kt
deleted file mode 100644
index 0014cdb7..00000000
--- a/plugins/base/src/test/resources/linkable/samples/jvmMain/kotlin/JvmClass.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package p2
-
-class JvmClass {
-
- /**
- * @sample samples.SamplesJvm.exampleUsage
- */
- fun printWithExclamation(msg: String) = println("$msg!")
-}
diff --git a/plugins/base/src/test/resources/linkable/samples/jvmMain/resources/Samples.kt b/plugins/base/src/test/resources/linkable/samples/jvmMain/resources/Samples.kt
deleted file mode 100644
index f32538cc..00000000
--- a/plugins/base/src/test/resources/linkable/samples/jvmMain/resources/Samples.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package samples
-
-import p2.JvmClass
-
-class SamplesJvm {
-
- fun exampleUsage() {
- JvmClass().printWithExclamation("Hi, Jvm")
- }
-}
diff --git a/plugins/base/src/test/resources/linkable/sources/jsMain/kotlin/JsClass.kt b/plugins/base/src/test/resources/linkable/sources/jsMain/kotlin/JsClass.kt
deleted file mode 100644
index 180d9519..00000000
--- a/plugins/base/src/test/resources/linkable/sources/jsMain/kotlin/JsClass.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package p1
-
-class JsClass
diff --git a/plugins/base/src/test/resources/linkable/sources/jvmMain/kotlin/JvmClass.kt b/plugins/base/src/test/resources/linkable/sources/jvmMain/kotlin/JvmClass.kt
deleted file mode 100644
index 3adf9520..00000000
--- a/plugins/base/src/test/resources/linkable/sources/jvmMain/kotlin/JvmClass.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package p1
-
-class JvmClass
diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java
deleted file mode 100644
index 016365a7..00000000
--- a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package linking.source;
-
-public enum JavaEnum {
- ON_DECEIT, ON_DESTROY;
-}
diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java
deleted file mode 100644
index ac416530..00000000
--- a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package linking.source;
-
-/**
- * Reference link {@link linking.source.KotlinEnum} should resolve <p>
- * sjuff sjuff {@link linking.source.KotlinEnum#ON_CREATE} should resolve <p>
- * sjujj sjujj {@link linking.source.JavaEnum#ON_DECEIT} should resolve
- */
-public class JavaLinker {}
diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt
deleted file mode 100644
index 2d5498c1..00000000
--- a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package linking.source
-
-enum class KotlinEnum {
- ON_CREATE, ON_CATASTROPHE
-}
diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt
deleted file mode 100644
index ca6e233d..00000000
--- a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package linking.source
-
-/**
- * Reference link [KotlinEnum] should resolve <p>
- * stuff stuff [KotlinEnum.ON_CREATE] should resolve <p>
- * stuff stuff [JavaEnum.ON_DECEIT] should resolve
- */
-class KotlinLinker {}
diff --git a/plugins/base/src/test/resources/locationProvider/jdk8-package-list b/plugins/base/src/test/resources/locationProvider/jdk8-package-list
deleted file mode 100644
index 351c1868..00000000
--- a/plugins/base/src/test/resources/locationProvider/jdk8-package-list
+++ /dev/null
@@ -1,217 +0,0 @@
-java.applet
-java.awt
-java.awt.color
-java.awt.datatransfer
-java.awt.dnd
-java.awt.event
-java.awt.font
-java.awt.geom
-java.awt.im
-java.awt.im.spi
-java.awt.image
-java.awt.image.renderable
-java.awt.print
-java.beans
-java.beans.beancontext
-java.io
-java.lang
-java.lang.annotation
-java.lang.instrument
-java.lang.invoke
-java.lang.management
-java.lang.ref
-java.lang.reflect
-java.math
-java.net
-java.nio
-java.nio.channels
-java.nio.channels.spi
-java.nio.charset
-java.nio.charset.spi
-java.nio.file
-java.nio.file.attribute
-java.nio.file.spi
-java.rmi
-java.rmi.activation
-java.rmi.dgc
-java.rmi.registry
-java.rmi.server
-java.security
-java.security.acl
-java.security.cert
-java.security.interfaces
-java.security.spec
-java.sql
-java.text
-java.text.spi
-java.time
-java.time.chrono
-java.time.format
-java.time.temporal
-java.time.zone
-java.util
-java.util.concurrent
-java.util.concurrent.atomic
-java.util.concurrent.locks
-java.util.function
-java.util.jar
-java.util.logging
-java.util.prefs
-java.util.regex
-java.util.spi
-java.util.stream
-java.util.zip
-javax.accessibility
-javax.activation
-javax.activity
-javax.annotation
-javax.annotation.processing
-javax.crypto
-javax.crypto.interfaces
-javax.crypto.spec
-javax.imageio
-javax.imageio.event
-javax.imageio.metadata
-javax.imageio.plugins.bmp
-javax.imageio.plugins.jpeg
-javax.imageio.spi
-javax.imageio.stream
-javax.jws
-javax.jws.soap
-javax.lang.model
-javax.lang.model.element
-javax.lang.model.type
-javax.lang.model.util
-javax.management
-javax.management.loading
-javax.management.modelmbean
-javax.management.monitor
-javax.management.openmbean
-javax.management.relation
-javax.management.remote
-javax.management.remote.rmi
-javax.management.timer
-javax.naming
-javax.naming.directory
-javax.naming.event
-javax.naming.ldap
-javax.naming.spi
-javax.net
-javax.net.ssl
-javax.print
-javax.print.attribute
-javax.print.attribute.standard
-javax.print.event
-javax.rmi
-javax.rmi.CORBA
-javax.rmi.ssl
-javax.script
-javax.security.auth
-javax.security.auth.callback
-javax.security.auth.kerberos
-javax.security.auth.login
-javax.security.auth.spi
-javax.security.auth.x500
-javax.security.cert
-javax.security.sasl
-javax.sound.midi
-javax.sound.midi.spi
-javax.sound.sampled
-javax.sound.sampled.spi
-javax.sql
-javax.sql.rowset
-javax.sql.rowset.serial
-javax.sql.rowset.spi
-javax.swing
-javax.swing.border
-javax.swing.colorchooser
-javax.swing.event
-javax.swing.filechooser
-javax.swing.plaf
-javax.swing.plaf.basic
-javax.swing.plaf.metal
-javax.swing.plaf.multi
-javax.swing.plaf.nimbus
-javax.swing.plaf.synth
-javax.swing.table
-javax.swing.text
-javax.swing.text.html
-javax.swing.text.html.parser
-javax.swing.text.rtf
-javax.swing.tree
-javax.swing.undo
-javax.tools
-javax.transaction
-javax.transaction.xa
-javax.xml
-javax.xml.bind
-javax.xml.bind.annotation
-javax.xml.bind.annotation.adapters
-javax.xml.bind.attachment
-javax.xml.bind.helpers
-javax.xml.bind.util
-javax.xml.crypto
-javax.xml.crypto.dom
-javax.xml.crypto.dsig
-javax.xml.crypto.dsig.dom
-javax.xml.crypto.dsig.keyinfo
-javax.xml.crypto.dsig.spec
-javax.xml.datatype
-javax.xml.namespace
-javax.xml.parsers
-javax.xml.soap
-javax.xml.stream
-javax.xml.stream.events
-javax.xml.stream.util
-javax.xml.transform
-javax.xml.transform.dom
-javax.xml.transform.sax
-javax.xml.transform.stax
-javax.xml.transform.stream
-javax.xml.validation
-javax.xml.ws
-javax.xml.ws.handler
-javax.xml.ws.handler.soap
-javax.xml.ws.http
-javax.xml.ws.soap
-javax.xml.ws.spi
-javax.xml.ws.spi.http
-javax.xml.ws.wsaddressing
-javax.xml.xpath
-org.ietf.jgss
-org.omg.CORBA
-org.omg.CORBA.DynAnyPackage
-org.omg.CORBA.ORBPackage
-org.omg.CORBA.TypeCodePackage
-org.omg.CORBA.portable
-org.omg.CORBA_2_3
-org.omg.CORBA_2_3.portable
-org.omg.CosNaming
-org.omg.CosNaming.NamingContextExtPackage
-org.omg.CosNaming.NamingContextPackage
-org.omg.Dynamic
-org.omg.DynamicAny
-org.omg.DynamicAny.DynAnyFactoryPackage
-org.omg.DynamicAny.DynAnyPackage
-org.omg.IOP
-org.omg.IOP.CodecFactoryPackage
-org.omg.IOP.CodecPackage
-org.omg.Messaging
-org.omg.PortableInterceptor
-org.omg.PortableInterceptor.ORBInitInfoPackage
-org.omg.PortableServer
-org.omg.PortableServer.CurrentPackage
-org.omg.PortableServer.POAManagerPackage
-org.omg.PortableServer.POAPackage
-org.omg.PortableServer.ServantLocatorPackage
-org.omg.PortableServer.portable
-org.omg.SendingContext
-org.omg.stub.java.rmi
-org.w3c.dom
-org.w3c.dom.bootstrap
-org.w3c.dom.events
-org.w3c.dom.ls
-org.w3c.dom.views
-org.xml.sax
-org.xml.sax.ext
-org.xml.sax.helpers
diff --git a/plugins/base/src/test/resources/locationProvider/multi-module-package-list b/plugins/base/src/test/resources/locationProvider/multi-module-package-list
deleted file mode 100644
index 03f33d9a..00000000
--- a/plugins/base/src/test/resources/locationProvider/multi-module-package-list
+++ /dev/null
@@ -1,8 +0,0 @@
-$dokka.format:html-v1
-$dokka.linkExtension:html
-$dokka.location:/NoPackageClass///PointingToDeclaration/moduleB/[root]/-no-package-class/index.html
-module:moduleA
-foo
-bar
-module:moduleB
-baz
diff --git a/plugins/base/src/test/resources/locationProvider/old-package-list b/plugins/base/src/test/resources/locationProvider/old-package-list
deleted file mode 100644
index d05b4535..00000000
--- a/plugins/base/src/test/resources/locationProvider/old-package-list
+++ /dev/null
@@ -1,9 +0,0 @@
-$dokka.format:kotlin-website-html
-$dokka.linkExtension:html
-$dokka.location:kotlin.text.StringBuilderkotlin.relocated.text/-string-builder/index.html
-$dokka.location:kotlin$minus(java.math.BigDecimal, java.math.BigDecimal)kotlin/java.math.-big-decimal/minus.html
-$dokka.location:kotlin.Int$MAX_VALUE()kotlin/-int/max-value.html
-kotlin
-kotlin.text
-kotlin.reflect
-
diff --git a/plugins/base/src/test/resources/locationProvider/stdlib-package-list b/plugins/base/src/test/resources/locationProvider/stdlib-package-list
deleted file mode 100644
index 298321aa..00000000
--- a/plugins/base/src/test/resources/locationProvider/stdlib-package-list
+++ /dev/null
@@ -1,67 +0,0 @@
-$dokka.format:html-v1
-$dokka.linkExtension:html
-$dokka.location://arrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,TypeParam(bounds=[kotlin.Any?])]/PointingToDeclaration/kotlin-stdlib/[JS root]/array-with-fun.html
-$dokka.location://booleanArray/#kotlin.Int#kotlin.Any/PointingToDeclaration/kotlin-stdlib/[JS root]/boolean-array.html
-$dokka.location://booleanArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Boolean]/PointingToDeclaration/kotlin-stdlib/[JS root]/boolean-array-with-fun.html
-$dokka.location://charArray/#kotlin.Int#kotlin.Any/PointingToDeclaration/kotlin-stdlib/[JS root]/char-array.html
-$dokka.location://charArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Char]/PointingToDeclaration/kotlin-stdlib/[JS root]/char-array-with-fun.html
-$dokka.location://fillArrayFun/#kotlin.Array[TypeParam(bounds=[kotlin.Any?])]#kotlin.Function1[kotlin.Int,TypeParam(bounds=[kotlin.Any?])]/PointingToDeclaration/kotlin-stdlib/[JS root]/fill-array-fun.html
-$dokka.location://longArray/#kotlin.Int#kotlin.Any/PointingToDeclaration/kotlin-stdlib/[JS root]/long-array.html
-$dokka.location://longArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Long]/PointingToDeclaration/kotlin-stdlib/[JS root]/long-array-with-fun.html
-$dokka.location://newArray/#kotlin.Int#TypeParam(bounds=[kotlin.Any?])/PointingToDeclaration/kotlin-stdlib/[JS root]/new-array.html
-$dokka.location://untypedCharArrayWithFun/#kotlin.Int#kotlin.Function1[kotlin.Int,kotlin.Char]/PointingToDeclaration/kotlin-stdlib/[JS root]/untyped-char-array-with-fun.html
-kotlin
-kotlin.annotation
-kotlin.browser
-kotlin.collections
-kotlin.comparisons
-kotlin.concurrent
-kotlin.contracts
-kotlin.coroutines
-kotlin.coroutines.cancellation
-kotlin.coroutines.intrinsics
-kotlin.dom
-kotlin.experimental
-kotlin.io
-kotlin.js
-kotlin.jvm
-kotlin.math
-kotlin.native
-kotlin.native.concurrent
-kotlin.native.ref
-kotlin.properties
-kotlin.random
-kotlin.ranges
-kotlin.reflect
-kotlin.reflect.full
-kotlin.reflect.jvm
-kotlin.sequences
-kotlin.streams
-kotlin.system
-kotlin.text
-kotlin.time
-kotlinx.browser
-kotlinx.cinterop
-kotlinx.cinterop.internal
-kotlinx.dom
-kotlinx.wasm.jsinterop
-org.khronos.webgl
-org.w3c.css.masking
-org.w3c.dom
-org.w3c.dom.clipboard
-org.w3c.dom.css
-org.w3c.dom.encryptedmedia
-org.w3c.dom.events
-org.w3c.dom.mediacapture
-org.w3c.dom.mediasource
-org.w3c.dom.parsing
-org.w3c.dom.pointerevents
-org.w3c.dom.svg
-org.w3c.dom.url
-org.w3c.fetch
-org.w3c.files
-org.w3c.notifications
-org.w3c.performance
-org.w3c.workers
-org.w3c.xhr
-
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/Clock.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/Clock.kt
deleted file mode 100644
index 5459b2d7..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/Clock.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-/**
- * Documentation for expected class Clock
- * in common module
- */
-expect open class Clock() {
- fun getTime(): String
- /**
- * Time in minis
- */
- fun getTimesInMillis(): String
- fun getYear(): String
-}
-
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/House.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/House.kt
deleted file mode 100644
index e79e2904..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/commonMain/kotlin/House.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-class House(val street: String, val number: Int) {
-
- /**
- * The owner of the house
- */
- var owner: String = ""
-
- /**
- * The owner of the house
- */
- val differentOwner: String = ""
-
- fun addFloor() {}
-
- class Basement {
- val pickles : List<Any> = mutableListOf()
- }
-
- companion object {
- val DEFAULT = House("",0)
- }
-}
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jsMain/kotlin/Clock.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jsMain/kotlin/Clock.kt
deleted file mode 100644
index aad5787d..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jsMain/kotlin/Clock.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-import greeteer.Greeter
-import kotlin.js.Date
-
-/**
- * Documentation for actual class Clock in JS
- */
-actual open class Clock {
- actual fun getTime() = Date.now().toString()
- fun onlyJsFunction(): Int = 42
-
- /**
- * JS implementation of getTimeInMillis
- */
- actual fun getTimesInMillis(): String = Date.now().toString()
-
- /**
- * JS custom kdoc
- */
- actual fun getYear(): String {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-}
-
-fun main() {
- Greeter().greet().also { println(it) }
-}
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmAndJsSecondCommonMain/kotlin/Greeter.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmAndJsSecondCommonMain/kotlin/Greeter.kt
deleted file mode 100644
index e9e15d0b..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmAndJsSecondCommonMain/kotlin/Greeter.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package greeteer
-
-import example.Clock
-
-class Greeter {
- /**
- * Some docs for the [greet] function
- */
- fun greet() = Clock().let{ "Hello there! THe time is ${it.getTime()}" }
-}
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/Clock.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/Clock.kt
deleted file mode 100644
index f38ff749..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/Clock.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-import greeteer.Greeter
-
-/**
- * Documentation for actual class Clock in JVM
- */
-actual open class Clock {
- actual fun getTime(): String = System.currentTimeMillis().toString()
-
- /**
- * Time in minis
- */
- actual fun getTimesInMillis(): String = System.currentTimeMillis().toString()
-
- /**
- * Documentation for onlyJVMFunction on...
- * wait for it...
- * ...JVM!
- */
- fun onlyJVMFunction(): Double = 2.5
-
- open fun getDayOfTheWeek(): String {
- TODO("not implemented")
- }
-
- /**
- * JVM custom kdoc
- */
- actual fun getYear(): String {
- TODO("not implemented")
- }
-}
-
-fun clockList() = listOf(Clock())
-
-fun main() {
- Greeter().greet().also { println(it) }
-}
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ClockDays.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ClockDays.kt
deleted file mode 100644
index e96acf1c..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ClockDays.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-/**
- * frgergergrthe
- * */
-enum class ClockDays {
- /**
- * dfsdfsdfds
- * */
- FIRST,
- SECOND, // test2
- THIRD, // test3
- FOURTH, // test4
- FIFTH // test5
-}
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/HtmlTest.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/HtmlTest.kt
deleted file mode 100644
index 2fa3622b..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/HtmlTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-/**
- * <!-- this shouldn't be visible -->
- */
-class HtmlTest {
- /**
- * This is an example <!-- not visible --> of html
- */
- fun test(){
-
- }
-
- /**
- * This is an <b> documentation </b>
- */
- fun testP(){
-
- }
-}
diff --git a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ParticularClock.kt b/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ParticularClock.kt
deleted file mode 100644
index 3b7a403d..00000000
--- a/plugins/base/src/test/resources/multiplatform/basicMultiplatformTest/jvmMain/kotlin/example/ParticularClock.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package example
-
-import greeteer.Greeter
-
-class ParticularClock(private val clockDay: ClockDays) : Clock() {
-
- /**
- * Rings bell [times]
- */
- fun ringBell(times: Int) {}
-
- /**
- * Uses provider [greeter]
- */
- fun useGreeter(greeter: Greeter) {
-
- }
-
- /**
- * Day of the week
- */
- override fun getDayOfTheWeek() = clockDay.name
-}
-
-/**
- * A sample extension function
- * When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$
- * @usesMathJax
- */
-fun Clock.extensionFun() {
-
-}
diff --git a/plugins/gfm/README.md b/plugins/gfm/README.md
deleted file mode 100644
index 1d65c0f0..00000000
--- a/plugins/gfm/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# GFM plugin
-
-The GFM plugin adds the ability to generate documentation in `GitHub Flavoured Markdown` format. It supports both
-multi-module and multiplatform projects.
-
-The GFM plugin is shipped together with the Dokka Gradle Plugin, so you can start using it
-right away with one of the following tasks:
-
-* `dokkaGfm` - generate documentation for a single-project build or one specific module.
-* `dokkaGfmMultiModule` - generate documentation for a multi-module project, assemble it together and
- generate navigation page/menu for all the modules.
-
-To use it with Maven or the CLI runner, you have to add it as a dependency. You can find it on
-[Maven Central](https://mvnrepository.com/artifact/org.jetbrains.dokka/gfm-plugin)
-
-GFM plugin comes built in with the Dokka Gradle plugin. You can also find it on
-[Maven Central](https://mvnrepository.com/artifact/org.jetbrains.dokka/gfm-plugin).
diff --git a/plugins/gfm/api/gfm.api b/plugins/gfm/api/gfm.api
deleted file mode 100644
index f77c9b68..00000000
--- a/plugins/gfm/api/gfm.api
+++ /dev/null
@@ -1,77 +0,0 @@
-public abstract class org/jetbrains/dokka/gfm/GfmCommand {
- public static final field Companion Lorg/jetbrains/dokka/gfm/GfmCommand$Companion;
-}
-
-public final class org/jetbrains/dokka/gfm/GfmCommand$Companion {
- public final fun getCommand (Lkotlin/text/MatchResult;)Ljava/lang/String;
- public final fun getLabel (Lkotlin/text/MatchResult;)Ljava/lang/String;
- public final fun getTemplateCommandRegex ()Lkotlin/text/Regex;
- public final fun templateCommand (Ljava/lang/Appendable;Lorg/jetbrains/dokka/gfm/GfmCommand;Lkotlin/jvm/functions/Function1;)V
-}
-
-public final class org/jetbrains/dokka/gfm/GfmPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getBriefCommentPreprocessor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getGfmPreprocessors ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPackageListCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getRenderer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getRootCreator ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/gfm/ResolveLinkGfmCommand : org/jetbrains/dokka/gfm/GfmCommand {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;)V
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
-}
-
-public final class org/jetbrains/dokka/gfm/location/MarkdownLocationProvider : org/jetbrains/dokka/base/resolvers/local/DokkaLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
-}
-
-public final class org/jetbrains/dokka/gfm/location/MarkdownLocationProvider$Factory : org/jetbrains/dokka/base/resolvers/local/LocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun getLocationProvider (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;
-}
-
-public final class org/jetbrains/dokka/gfm/renderer/BriefCommentPreprocessor : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> ()V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public class org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer : org/jetbrains/dokka/base/renderers/DefaultRenderer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public synthetic fun buildCodeBlock (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentCodeBlock;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildCodeBlock (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentCodeBlock;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildCodeInline (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentCodeInline;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildCodeInline (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentCodeInline;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildDRILink (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDRILink;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildDRILink (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentDRILink;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildDivergent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentDivergentGroup;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildDivergent (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentDivergentGroup;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildError (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public synthetic fun buildHeader (Ljava/lang/Object;ILorg/jetbrains/dokka/pages/ContentHeader;Lkotlin/jvm/functions/Function1;)V
- public fun buildHeader (Ljava/lang/StringBuilder;ILorg/jetbrains/dokka/pages/ContentHeader;Lkotlin/jvm/functions/Function1;)V
- public synthetic fun buildLineBreak (Ljava/lang/Object;)V
- public fun buildLineBreak (Ljava/lang/StringBuilder;)V
- public synthetic fun buildLink (Ljava/lang/Object;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public fun buildLink (Ljava/lang/StringBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
- public synthetic fun buildList (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentList;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildList (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentList;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildNavigation (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/PageNode;)V
- public fun buildNavigation (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/PageNode;)V
- public fun buildPage (Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function2;)Ljava/lang/String;
- public synthetic fun buildPlatformDependent (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/PlatformHintedContent;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildPlatformDependent (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/PlatformHintedContent;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildResource (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentEmbeddedResource;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public fun buildResource (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentEmbeddedResource;Lorg/jetbrains/dokka/pages/ContentPage;)V
- public synthetic fun buildTable (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public fun buildTable (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentTable;Lorg/jetbrains/dokka/pages/ContentPage;Ljava/util/Set;)V
- public synthetic fun buildText (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentText;)V
- public fun buildText (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentText;)V
- public synthetic fun getPreprocessors ()Ljava/lang/Iterable;
- protected fun getPreprocessors ()Ljava/util/List;
- public fun renderPage (Lorg/jetbrains/dokka/pages/PageNode;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
- public synthetic fun wrapGroup (Ljava/lang/Object;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function1;)V
- public fun wrapGroup (Ljava/lang/StringBuilder;Lorg/jetbrains/dokka/pages/ContentGroup;Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function1;)V
-}
-
diff --git a/plugins/gfm/build.gradle.kts b/plugins/gfm/build.gradle.kts
deleted file mode 100644
index bc83f742..00000000
--- a/plugins/gfm/build.gradle.kts
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
-
- implementation(kotlin("reflect"))
- implementation(libs.jackson.kotlin)
- constraints {
- implementation(libs.jackson.databind) {
- because("CVE-2022-42003")
- }
- }
-
- testImplementation(kotlin("test"))
- testImplementation(projects.plugins.base)
- testImplementation(projects.plugins.base.baseTestUtils)
- testImplementation(projects.core.testApi)
-}
-
-registerDokkaArtifactPublication("gfmPlugin") {
- artifactId = "gfm-plugin"
-}
diff --git a/plugins/gfm/gfm-template-processing/api/gfm-template-processing.api b/plugins/gfm/gfm-template-processing/api/gfm-template-processing.api
deleted file mode 100644
index e94d666e..00000000
--- a/plugins/gfm/gfm-template-processing/api/gfm-template-processing.api
+++ /dev/null
@@ -1,14 +0,0 @@
-public final class org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getGfmLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getGfmPartialLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getGfmTemplateProcessingStrategy ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingStrategy : org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun finish (Ljava/io/File;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
diff --git a/plugins/gfm/gfm-template-processing/build.gradle.kts b/plugins/gfm/gfm-template-processing/build.gradle.kts
deleted file mode 100644
index 955e052f..00000000
--- a/plugins/gfm/gfm-template-processing/build.gradle.kts
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
- implementation(projects.plugins.gfm)
- implementation(projects.plugins.allModulesPage)
- implementation(projects.plugins.templating)
-
- implementation(kotlin("reflect"))
- implementation(libs.kotlinx.coroutines.core)
-
- testImplementation(kotlin("test"))
- testImplementation(projects.core.testApi)
-}
-
-registerDokkaArtifactPublication("dokkaGfmTemplateProcessing") {
- artifactId = "gfm-template-processing-plugin"
-}
diff --git a/plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingPlugin.kt b/plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingPlugin.kt
deleted file mode 100644
index fd2af274..00000000
--- a/plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingPlugin.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm.templateProcessing
-
-import org.jetbrains.dokka.allModulesPage.AllModulesPagePlugin
-import org.jetbrains.dokka.allModulesPage.MultimoduleLocationProvider
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.gfm.GfmPlugin
-import org.jetbrains.dokka.gfm.location.MarkdownLocationProvider
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.Extension
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import org.jetbrains.dokka.templates.TemplateProcessingStrategy
-import org.jetbrains.dokka.templates.TemplatingPlugin
-
-public class GfmTemplateProcessingPlugin : DokkaPlugin() {
-
- private val allModulesPagePlugin by lazy { plugin<AllModulesPagePlugin>() }
- private val templateProcessingPlugin by lazy { plugin<TemplatingPlugin>() }
- private val gfmPlugin by lazy { plugin<GfmPlugin>() }
- private val dokkaBase by lazy { plugin<DokkaBase>()}
-
- public val gfmTemplateProcessingStrategy: Extension<TemplateProcessingStrategy, *, *> by extending {
- (templateProcessingPlugin.templateProcessingStrategy
- providing ::GfmTemplateProcessingStrategy
- order { before(templateProcessingPlugin.fallbackProcessingStrategy) })
- }
-
- public val gfmLocationProvider: Extension<LocationProviderFactory, *, *> by extending {
- dokkaBase.locationProviderFactory providing MultimoduleLocationProvider::Factory override listOf(gfmPlugin.locationProvider, allModulesPagePlugin.multimoduleLocationProvider)
- }
-
- public val gfmPartialLocationProvider: Extension<LocationProviderFactory, *, *> by extending {
- allModulesPagePlugin.partialLocationProviderFactory providing MarkdownLocationProvider::Factory override allModulesPagePlugin.baseLocationProviderFactory
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingStrategy.kt b/plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingStrategy.kt
deleted file mode 100644
index 8f23e8e9..00000000
--- a/plugins/gfm/gfm-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/GfmTemplateProcessingStrategy.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm.templateProcessing
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.allModulesPage.AllModulesPagePlugin
-import org.jetbrains.dokka.base.templating.parseJson
-import org.jetbrains.dokka.gfm.GfmCommand
-import org.jetbrains.dokka.gfm.GfmCommand.Companion.command
-import org.jetbrains.dokka.gfm.GfmCommand.Companion.label
-import org.jetbrains.dokka.gfm.GfmCommand.Companion.templateCommandRegex
-import org.jetbrains.dokka.gfm.ResolveLinkGfmCommand
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.templates.TemplateProcessingStrategy
-import java.io.BufferedWriter
-import java.io.File
-
-public class GfmTemplateProcessingStrategy(
- public val context: DokkaContext
-) : TemplateProcessingStrategy {
-
- private val externalModuleLinkResolver =
- context.plugin<AllModulesPagePlugin>().querySingle { externalModuleLinkResolver }
-
- override fun process(input: File, output: File, moduleContext: DokkaConfiguration.DokkaModuleDescription?): Boolean =
- if (input.extension == "md") {
- input.bufferedReader().use { reader ->
- //This should also work whenever we have a misconfigured dokka and output is pointing to the input
- //the same way that html processing does
- if (input.absolutePath == output.absolutePath) {
- context.logger.info("Attempting to process GFM templates in place for directory $input, this suggests miss configuration.")
- val lines = reader.readLines()
- output.bufferedWriter().use { writer ->
- lines.forEach { line ->
- writer.processAndWrite(line, output)
- }
-
- }
- } else {
- output.bufferedWriter().use { writer ->
- reader.lineSequence().forEach { line ->
- writer.processAndWrite(line, output)
- }
- }
- }
- }
- true
- } else false
-
- private fun BufferedWriter.processAndWrite(line: String, output: File) =
- processLine(line, output).run {
- write(this)
- newLine()
- }
-
- private fun processLine(line: String, output: File): String =
- line.replace(templateCommandRegex) {
- when (val command = parseJson<GfmCommand>(it.command)) {
- is ResolveLinkGfmCommand -> resolveLink(output, command.dri, it.label)
- }
- }
-
- private fun resolveLink(fileContext: File, dri: DRI, label: String): String =
- externalModuleLinkResolver.resolve(dri, fileContext)?.let { address ->
- "[$label]($address)"
- } ?: label
-}
diff --git a/plugins/gfm/gfm-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/gfm/gfm-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index 375990bb..00000000
--- a/plugins/gfm/gfm-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.gfm.templateProcessing.GfmTemplateProcessingPlugin
diff --git a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/GfmPlugin.kt b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/GfmPlugin.kt
deleted file mode 100644
index 3fd7b514..00000000
--- a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/GfmPlugin.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.PackageListCreator
-import org.jetbrains.dokka.base.renderers.RootCreator
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.gfm.location.MarkdownLocationProvider
-import org.jetbrains.dokka.gfm.renderer.BriefCommentPreprocessor
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.renderers.PostAction
-import org.jetbrains.dokka.renderers.Renderer
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class GfmPlugin : DokkaPlugin() {
-
- public val gfmPreprocessors: ExtensionPoint<PageTransformer> by extensionPoint<PageTransformer>()
-
- private val dokkaBase by lazy { plugin<DokkaBase>() }
-
- public val renderer: Extension<Renderer, *, *> by extending {
- CoreExtensions.renderer providing ::CommonmarkRenderer override dokkaBase.htmlRenderer
- }
-
- public val locationProvider: Extension<LocationProviderFactory, *, *> by extending {
- dokkaBase.locationProviderFactory providing MarkdownLocationProvider::Factory override dokkaBase.locationProvider
- }
-
- public val rootCreator: Extension<PageTransformer, *, *> by extending {
- gfmPreprocessors with RootCreator
- }
-
- public val briefCommentPreprocessor: Extension<PageTransformer, *, *> by extending {
- gfmPreprocessors with BriefCommentPreprocessor()
- }
-
- public val packageListCreator: Extension<PageTransformer, *, *> by extending {
- (gfmPreprocessors
- providing { PackageListCreator(it, RecognizedLinkFormat.DokkaGFM) }
- order { after(rootCreator) })
- }
-
- internal val alphaVersionNotifier by extending {
- CoreExtensions.postActions providing { ctx ->
- PostAction {
- ctx.logger.info(
- "The GFM output format is still in Alpha so you may find bugs and experience migration " +
- "issues when using it. You use it at your own risk."
- )
- }
- }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/gfmTemplating.kt b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/gfmTemplating.kt
deleted file mode 100644
index 194127df..00000000
--- a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/gfmTemplating.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm
-
-import com.fasterxml.jackson.annotation.JsonTypeInfo
-import com.fasterxml.jackson.annotation.JsonTypeInfo.Id.CLASS
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jetbrains.dokka.links.DRI
-
-@JsonTypeInfo(use = CLASS)
-public sealed class GfmCommand {
-
- public companion object {
- private const val delimiter = "\u1680"
-
- public val templateCommandRegex: Regex =
- Regex("<!---$delimiter GfmCommand ([^$delimiter ]*)$delimiter--->(.+?)(?=<!---$delimiter)<!---$delimiter--->")
-
- public val MatchResult.command: String
- get() = groupValues[1]
-
- public val MatchResult.label: String
- get() = groupValues[2]
-
- public fun Appendable.templateCommand(command: GfmCommand, content: Appendable.() -> Unit) {
- append("<!---$delimiter GfmCommand ${toJsonString(command)}$delimiter--->")
- content()
- append("<!---$delimiter--->")
- }
- }
-}
-
-public class ResolveLinkGfmCommand(
- public val dri: DRI
-) : GfmCommand()
-
-
diff --git a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/location/MarkdownLocationProvider.kt b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/location/MarkdownLocationProvider.kt
deleted file mode 100644
index f331a6d9..00000000
--- a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/location/MarkdownLocationProvider.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm.location
-
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class MarkdownLocationProvider(
- pageGraphRoot: RootPageNode,
- dokkaContext: DokkaContext
-) : DokkaLocationProvider(pageGraphRoot, dokkaContext, ".md") {
-
- public class Factory(private val context: DokkaContext) : LocationProviderFactory {
- override fun getLocationProvider(pageNode: RootPageNode): LocationProvider =
- MarkdownLocationProvider(pageNode, context)
- }
-}
-
diff --git a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/BriefCommentPreprocessor.kt b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/BriefCommentPreprocessor.kt
deleted file mode 100644
index 6023cca1..00000000
--- a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/BriefCommentPreprocessor.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm.renderer
-
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class BriefCommentPreprocessor : PageTransformer {
- override fun invoke(input: RootPageNode): RootPageNode {
- return input.transformContentPagesTree { contentPage ->
- contentPage.modified(content = contentPage.content.recursiveMapTransform<ContentGroup, ContentNode> {
- if (it.dci.kind == ContentKind.BriefComment) {
- it.copy(style = it.style + setOf(TextStyle.Block))
- } else {
- it
- }
- })
- }
- }
-}
diff --git a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt
deleted file mode 100644
index 3bc420ac..00000000
--- a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm.renderer
-
-import org.jetbrains.dokka.DokkaException
-import org.jetbrains.dokka.base.renderers.DefaultRenderer
-import org.jetbrains.dokka.base.renderers.isImage
-import org.jetbrains.dokka.gfm.GfmCommand.Companion.templateCommand
-import org.jetbrains.dokka.gfm.GfmPlugin
-import org.jetbrains.dokka.gfm.ResolveLinkGfmCommand
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jetbrains.dokka.utilities.htmlEscape
-
-public open class CommonmarkRenderer(
- context: DokkaContext
-) : DefaultRenderer<StringBuilder>(context) {
-
- override val preprocessors: List<PageTransformer> = context.plugin<GfmPlugin>().query { gfmPreprocessors }
-
- private val isPartial = context.configuration.delayTemplateSubstitution
-
- override fun StringBuilder.wrapGroup(
- node: ContentGroup,
- pageContext: ContentPage,
- childrenCallback: StringBuilder.() -> Unit
- ) {
- return when {
- node.hasStyle(TextStyle.Block) || node.hasStyle(TextStyle.Paragraph) -> {
- buildParagraph()
- childrenCallback()
- buildParagraph()
- }
- node.dci.kind == ContentKind.Deprecation -> {
- append("---")
- childrenCallback()
- append("---")
- buildNewLine()
- }
- node.hasStyle(ContentStyle.Footnote) -> {
- childrenCallback()
- buildParagraph()
- }
- else -> childrenCallback()
- }
- }
-
- override fun StringBuilder.buildHeader(level: Int, node: ContentHeader, content: StringBuilder.() -> Unit) {
- buildParagraph()
- append("#".repeat(level) + " ")
- content()
- buildParagraph()
- }
-
- override fun StringBuilder.buildLink(address: String, content: StringBuilder.() -> Unit) {
- append("[")
- content()
- append("]($address)")
- }
-
- override fun StringBuilder.buildList(
- node: ContentList,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildParagraph()
- buildList(node, pageContext)
- buildParagraph()
- }
-
- private fun StringBuilder.buildList(
- node: ContentList,
- pageContext: ContentPage
- ) {
- node.children.forEachIndexed { i, it ->
- if (node.ordered) {
- // number is irrelevant, but a nice touch
- // period is more widely compatible
- append("${i + 1}. ")
- } else {
- append("- ")
- }
-
- /*
- Handle case when list item transitions to another complex node with no preceding text.
- For example, the equivalent of:
- <li>
- <ul><li><ul>Item</ul></li></ul>
- </li>
-
- Would be:
- -
- - Item
- */
- if (it is ContentGroup && it.children.firstOrNull()?.let { it !is ContentText } == true) {
- append("\n ")
- }
-
- buildString { it.build(this, pageContext, it.sourceSets) }
- .replace("\n", "\n ") // apply indent
- .trim().let { append(it) }
- buildNewLine()
- }
- }
-
- override fun StringBuilder.buildDRILink(
- node: ContentDRILink,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- val location = locationProvider.resolve(node.address, node.sourceSets, pageContext)
- if (location == null) {
- if (isPartial) {
- templateCommand(ResolveLinkGfmCommand(node.address)) {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- } else {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- } else {
- buildLink(location) {
- buildText(node.children, pageContext, sourceSetRestriction)
- }
- }
- }
-
- override fun StringBuilder.buildLineBreak() {
- append("\\")
- buildNewLine()
- }
-
- private fun StringBuilder.buildNewLine() {
- append("\n")
- }
-
- private fun StringBuilder.buildParagraph() {
- buildNewLine()
- buildNewLine()
- }
-
- override fun StringBuilder.buildPlatformDependent(
- content: PlatformHintedContent,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildPlatformDependentItem(content.inner, content.sourceSets, pageContext)
- }
-
- private fun StringBuilder.buildPlatformDependentItem(
- content: ContentNode,
- sourceSets: Set<DisplaySourceSet>,
- pageContext: ContentPage,
- ) {
- if (content is ContentGroup && content.children.firstOrNull { it is ContentTable } != null) {
- buildContentNode(content, pageContext, sourceSets)
- } else {
- val distinct = sourceSets.map {
- it to buildString { buildContentNode(content, pageContext, setOf(it)) }
- }.groupBy(Pair<DisplaySourceSet, String>::second, Pair<DisplaySourceSet, String>::first)
-
- distinct.filter { it.key.isNotBlank() }.forEach { (text, platforms) ->
- buildParagraph()
- buildSourceSetTags(platforms.toSet())
- buildLineBreak()
- append(text.trim())
- buildParagraph()
- }
- }
- }
-
- override fun StringBuilder.buildResource(node: ContentEmbeddedResource, pageContext: ContentPage) {
- if (node.isImage()) {
- append("!")
- }
- append("[${node.altText}](${node.address})")
- }
-
- override fun StringBuilder.buildTable(
- node: ContentTable,
- pageContext: ContentPage,
- sourceSetRestriction: Set<DisplaySourceSet>?
- ) {
- buildNewLine()
- if (node.dci.kind == ContentKind.Sample || node.dci.kind == ContentKind.Parameters) {
- node.sourceSets.forEach { sourcesetData ->
- append(sourcesetData.name)
- buildNewLine()
- buildTable(
- node.copy(
- children = node.children.filter { it.sourceSets.contains(sourcesetData) },
- dci = node.dci.copy(kind = ContentKind.Main)
- ), pageContext, sourceSetRestriction
- )
- buildNewLine()
- }
- } else {
- val size = node.header.firstOrNull()?.children?.size ?: node.children.firstOrNull()?.children?.size ?: 0
- if (size <= 0) return
-
- if (node.header.isNotEmpty()) {
- node.header.forEach {
- it.children.forEach {
- append("| ")
- it.build(this, pageContext, it.sourceSets)
- append(" ")
- }
- }
- } else {
- append("| ".repeat(size))
- }
- append("|")
- buildNewLine()
-
- append("|---".repeat(size))
- append("|")
- buildNewLine()
-
- node.children.forEach { row ->
- row.children.forEach { cell ->
- append("| ")
- append(buildString { cell.build(this, pageContext) }
- .trim()
- .replace("#+ ".toRegex(), "") // Workaround for headers inside tables
- .replace("\\\n", "\n\n")
- .replace("\n[\n]+".toRegex(), "<br>")
- .replace("\n", " ")
- )
- append(" ")
- }
- append("|")
- buildNewLine()
- }
- }
- }
-
- override fun StringBuilder.buildText(textNode: ContentText) {
- if (textNode.extra[HtmlContent] != null) {
- append(textNode.text)
- } else if (textNode.text.isNotBlank()) {
- val decorators = decorators(textNode.style)
- append(textNode.text.takeWhile { it == ' ' })
- append(decorators)
- append(textNode.text.trim().htmlEscape())
- append(decorators.reversed())
- append(textNode.text.takeLastWhile { it == ' ' })
- }
- }
-
- override fun StringBuilder.buildNavigation(page: PageNode) {
- locationProvider.ancestors(page).asReversed().forEach { node ->
- append("/")
- if (node.isNavigable) buildLink(node, page)
- else append(node.name)
- }
- buildParagraph()
- }
-
- override fun buildPage(page: ContentPage, content: (StringBuilder, ContentPage) -> Unit): String =
- buildString {
- content(this, page)
- }.trim().replace("\n[\n]+".toRegex(), "\n\n")
-
- override fun buildError(node: ContentNode) {
- context.logger.warn("Markdown renderer has encountered problem. The unmatched node is $node")
- }
-
- override fun StringBuilder.buildDivergent(node: ContentDivergentGroup, pageContext: ContentPage) {
-
- val distinct =
- node.groupDivergentInstances(pageContext, { instance, _, sourceSet ->
- instance.before?.let { before ->
- buildString { buildContentNode(before, pageContext, sourceSet) }
- } ?: ""
- }, { instance, _, sourceSet ->
- instance.after?.let { after ->
- buildString { buildContentNode(after, pageContext, sourceSet) }
- } ?: ""
- })
-
- distinct.values.forEach { entry ->
- val (instance, sourceSets) = entry.getInstanceAndSourceSets()
-
- buildParagraph()
- buildSourceSetTags(sourceSets)
- buildLineBreak()
-
- instance.before?.let {
- buildContentNode(
- it,
- pageContext,
- sourceSets.first()
- ) // It's workaround to render content only once
- buildParagraph()
- }
-
- entry.groupBy { buildString { buildContentNode(it.first.divergent, pageContext, setOf(it.second)) } }
- .values.forEach { innerEntry ->
- val (innerInstance, innerSourceSets) = innerEntry.getInstanceAndSourceSets()
- if (sourceSets.size > 1) {
- buildSourceSetTags(innerSourceSets)
- buildLineBreak()
- }
- innerInstance.divergent.build(
- this@buildDivergent,
- pageContext,
- setOf(innerSourceSets.first())
- ) // It's workaround to render content only once
- buildParagraph()
- }
-
- instance.after?.let {
- buildContentNode(
- it,
- pageContext,
- sourceSets.first()
- ) // It's workaround to render content only once
- }
-
- buildParagraph()
- }
- }
-
- override fun StringBuilder.buildCodeBlock(code: ContentCodeBlock, pageContext: ContentPage) {
- append("```")
- append(code.language.ifEmpty { "kotlin" })
- buildNewLine()
- code.children.forEach {
- if (it is ContentText) {
- // since this is a code block where text will be rendered as is,
- // no need to escape text, apply styles, etc. Just need the plain value
- append(it.text)
- } else if (it is ContentBreakLine) {
- // since this is a code block where text will be rendered as is,
- // there's no need to add tailing slash for line breaks
- buildNewLine()
- }
- }
- buildNewLine()
- append("```")
- buildNewLine()
- }
-
- override fun StringBuilder.buildCodeInline(code: ContentCodeInline, pageContext: ContentPage) {
- append("`")
- code.children.filterIsInstance<ContentText>().forEach { append(it.text) }
- append("`")
- }
-
- private fun decorators(styles: Set<Style>) = buildString {
- styles.forEach {
- when (it) {
- TextStyle.Bold -> append("**")
- TextStyle.Italic -> append("*")
- TextStyle.Strong -> append("**")
- TextStyle.Strikethrough -> append("~~")
- else -> Unit
- }
- }
- }
-
- private val PageNode.isNavigable: Boolean
- get() = this !is RendererSpecificPage || strategy != RenderingStrategy.DoNothing
-
- private fun StringBuilder.buildLink(to: PageNode, from: PageNode) =
- buildLink(locationProvider.resolve(to, from)!!) {
- append(to.name)
- }
-
- override suspend fun renderPage(page: PageNode) {
- val path by lazy {
- locationProvider.resolve(page, skipExtension = true)
- ?: throw DokkaException("Cannot resolve path for ${page.name}")
- }
-
- return when (page) {
- is ContentPage -> outputWriter.write(path, buildPage(page) { c, p -> buildPageContent(c, p) }, ".md")
- is RendererSpecificPage -> when (val strategy = page.strategy) {
- is RenderingStrategy.Copy -> outputWriter.writeResources(strategy.from, path)
- is RenderingStrategy.Write -> outputWriter.write(path, strategy.text, "")
- is RenderingStrategy.Callback -> outputWriter.write(path, strategy.instructions(this, page), ".md")
- is RenderingStrategy.DriLocationResolvableWrite -> outputWriter.write(
- path,
- strategy.contentToResolve { dri, sourcesets ->
- locationProvider.resolve(dri, sourcesets)
- },
- ""
- )
- is RenderingStrategy.PageLocationResolvableWrite -> outputWriter.write(
- path,
- strategy.contentToResolve { pageToLocate, context ->
- locationProvider.resolve(pageToLocate, context)
- },
- ""
- )
- RenderingStrategy.DoNothing -> Unit
- }
- else -> throw AssertionError(
- "Page ${page.name} cannot be rendered by renderer as it is not renderer specific nor contains content"
- )
- }
- }
-
- private fun List<Pair<ContentDivergentInstance, DisplaySourceSet>>.getInstanceAndSourceSets() =
- this.let { Pair(it.first().first, it.map { it.second }.toSet()) }
-
- private fun StringBuilder.buildSourceSetTags(sourceSets: Set<DisplaySourceSet>) =
- append(sourceSets.joinToString(prefix = "[", postfix = "]") { it.name })
-}
diff --git a/plugins/gfm/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/gfm/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index 83575bb1..00000000
--- a/plugins/gfm/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.gfm.GfmPlugin
diff --git a/plugins/gfm/src/test/kotlin/renderers/gfm/CodeWrappingTest.kt b/plugins/gfm/src/test/kotlin/renderers/gfm/CodeWrappingTest.kt
deleted file mode 100644
index 0d6a18cc..00000000
--- a/plugins/gfm/src/test/kotlin/renderers/gfm/CodeWrappingTest.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.gfm
-
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import renderers.testPage
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class CodeWrappingTest : GfmRenderingOnlyTestBase() {
- @Test
- fun wrappedCodeBlock() {
- val page = testPage {
- codeBlock {
- text("fun myCode(): String")
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |```kotlin
- |fun myCode(): String
- |```""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `should preserve original text without escaping`() {
- val page = testPage {
- codeBlock {
- text("<----> **text** & ~~this~~ and \"that\"")
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |```kotlin
- |<----> **text** & ~~this~~ and "that"
- |```""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
-
- @Test
- fun wrappedInlineCode() {
- val page = testPage {
- text("This function adds the values of ")
- codeInline {
- text("left")
- }
- text(" and ")
- codeInline {
- text("right")
- }
- text(".\nBoth numbers must be finite, or an exception occurs.\n")
- }
- val expect = """|//[testPage](test-page.md)
- |
- |This function adds the values of `left` and `right`.
- |Both numbers must be finite, or an exception occurs.""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `should not add trailing backslash to newline elements for code inline code`() {
- val page = testPage {
- text("This adds some symbols (")
- codeInline {
- text("<----> **text** & ~~this~~ and \"that\"")
- }
- text(") to the test")
- }
- val expect = """|//[testPage](test-page.md)
- |
- |This adds some symbols (`<----> **text** & ~~this~~ and "that"`) to the test""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-}
diff --git a/plugins/gfm/src/test/kotlin/renderers/gfm/DivergentTest.kt b/plugins/gfm/src/test/kotlin/renderers/gfm/DivergentTest.kt
deleted file mode 100644
index 8d90fac2..00000000
--- a/plugins/gfm/src/test/kotlin/renderers/gfm/DivergentTest.kt
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.gfm
-
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.ContentDivergentGroup
-import renderers.testPage
-import testApi.testRunner.defaultSourceSet
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class DivergentTest : GfmRenderingOnlyTestBase() {
- private val js = defaultSourceSet.copy(
- "js",
- DokkaSourceSetID("root", "js"),
- analysisPlatform = Platform.js,
- sourceRoots = setOf(File("pl1"))
- )
- private val jvm = defaultSourceSet.copy(
- "jvm",
- DokkaSourceSetID("root", "jvm"),
- analysisPlatform = Platform.jvm,
- sourceRoots = setOf(File("pl1"))
- )
- private val native = defaultSourceSet.copy(
- "native",
- DokkaSourceSetID("root", "native"),
- analysisPlatform = Platform.native,
- sourceRoots = setOf(File("pl1"))
- )
-
- @Test
- fun simpleWrappingCase() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[js]\
- |a""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun noPlatformHintCase() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test"), implicitlySourceSetHinted = false) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[js]\
- |a""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentBetweenSourceSets() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("b")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("c")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[js, jvm, native]\
- |[js]\
- |a
- |
- |[jvm]\
- |b
- |
- |[native]\
- |c""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentInOneSourceSet() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("b")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(js)) {
- divergent {
- text("c")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[js]\
- |a
- |
- |b
- |
- |c""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentInAndBetweenSourceSets() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("b")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("c")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("d")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(native)) {
- divergent {
- text("e")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native, js, jvm]\
- |[native]\
- |a
- |
- |[js]\
- |b
- |
- |[jvm]\
- |c
- |
- |[js]\
- |d
- |
- |[native]\
- |e""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentInAndBetweenSourceSetsWithGrouping() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- after {
- text("a+")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("b")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("c")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("d")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(native)) {
- divergent {
- text("e")
- }
- after {
- text("e+")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native]\
- |a
- |
- |a+
- |
- |[js]\
- |b
- |
- |d
- |
- |bd+
- |
- |[jvm]\
- |c
- |
- |[native]\
- |e
- |
- |e+""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentSameBefore() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("a")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("b")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native]\
- |ab-
- |
- |a
- |
- |b""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentSameAfter() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- after {
- text("ab+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- divergent {
- text("b")
- }
- after {
- text("ab+")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native]\
- |a
- |
- |b
- |
- |ab+""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentGroupedByBeforeAndAfter() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("a")
- }
- after {
- text("ab+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- before {
- text("ab-")
- }
- divergent {
- text("b")
- }
- after {
- text("ab+")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native]\
- |ab-
- |
- |a
- |
- |b
- |
- |ab+""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentDifferentBeforeAndAfter() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- before {
- text("a-")
- }
- divergent {
- text("a")
- }
- after {
- text("ab+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(native)) {
- before {
- text("b-")
- }
- divergent {
- text("b")
- }
- after {
- text("ab+")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native]\
- |a-
- |
- |a
- |
- |ab+
- |
- |[native]\
- |b-
- |
- |b
- |
- |ab+""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun divergentInAndBetweenSourceSetsWithGroupingAncCommonParts() {
- val page = testPage {
- divergentGroup(ContentDivergentGroup.GroupID("test")) {
- instance(setOf(DRI("test", "Test")), setOf(native)) {
- divergent {
- text("a")
- }
- after {
- text("a+")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(js)) {
- divergent {
- text("b")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test")), setOf(jvm)) {
- divergent {
- text("c")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test2")), setOf(js)) {
- divergent {
- text("d")
- }
- after {
- text("bd+")
- }
- }
- instance(setOf(DRI("test", "Test3")), setOf(native)) {
- divergent {
- text("e")
- }
- after {
- text("e+")
- }
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[native]\
- |a
- |
- |a+
- |
- |[js, jvm]\
- |[js]\
- |b
- |
- |[jvm]\
- |c
- |
- |[js]\
- |d
- |
- |bd+
- |
- |[native]\
- |e
- |
- |e+""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-}
diff --git a/plugins/gfm/src/test/kotlin/renderers/gfm/GfmRenderingOnlyTestBase.kt b/plugins/gfm/src/test/kotlin/renderers/gfm/GfmRenderingOnlyTestBase.kt
deleted file mode 100644
index 9080a4fd..00000000
--- a/plugins/gfm/src/test/kotlin/renderers/gfm/GfmRenderingOnlyTestBase.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.gfm
-
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.RootCreator
-import org.jetbrains.dokka.base.resolvers.external.DefaultExternalLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.external.javadoc.JavadocExternalLocationProviderFactory
-import org.jetbrains.dokka.gfm.GfmPlugin
-import org.jetbrains.dokka.gfm.location.MarkdownLocationProvider
-import org.jetbrains.dokka.testApi.context.MockContext
-import renderers.RenderingOnlyTestBase
-import utils.TestOutputWriter
-
-abstract class GfmRenderingOnlyTestBase : RenderingOnlyTestBase<String>() {
-
- val files = TestOutputWriter()
- override val context = MockContext(
- DokkaBase().outputWriter to { files },
- DokkaBase().locationProviderFactory to MarkdownLocationProvider::Factory,
- DokkaBase().externalLocationProviderFactory to ::JavadocExternalLocationProviderFactory,
- DokkaBase().externalLocationProviderFactory to ::DefaultExternalLocationProviderFactory,
- GfmPlugin().gfmPreprocessors to { RootCreator },
-
- testConfiguration = DokkaConfigurationImpl(moduleName = "root", finalizeCoroutines = false)
- )
-
- override val renderedContent: String by lazy {
- files.contents.getValue("test-page.md")
- }
-}
diff --git a/plugins/gfm/src/test/kotlin/renderers/gfm/GroupWrappingTest.kt b/plugins/gfm/src/test/kotlin/renderers/gfm/GroupWrappingTest.kt
deleted file mode 100644
index 13cb16c4..00000000
--- a/plugins/gfm/src/test/kotlin/renderers/gfm/GroupWrappingTest.kt
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.gfm
-
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import org.jetbrains.dokka.pages.TextStyle
-import renderers.testPage
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class GroupWrappingTest : GfmRenderingOnlyTestBase() {
-
- @Test
- fun notWrapped() {
- val page = testPage {
- group {
- text("a")
- text("b")
- }
- text("c")
- }
- val expect = """|//[testPage](test-page.md)
- |
- |abc""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun paragraphWrapped() {
- val page = testPage {
- group(styles = setOf(TextStyle.Paragraph)) {
- text("a")
- text("b")
- }
- text("c")
- }
- val expect = """|//[testPage](test-page.md)
- |
- |ab
- |
- |c""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun blockWrapped() {
- val page = testPage {
- group(styles = setOf(TextStyle.Block)) {
- text("a")
- text("b")
- }
- text("c")
- }
- val expect = """|//[testPage](test-page.md)
- |
- |ab
- |
- |c""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun nested() {
- val page = testPage {
- group(styles = setOf(TextStyle.Block)) {
- text("a")
- group(styles = setOf(TextStyle.Block)) {
- group(styles = setOf(TextStyle.Block)) {
- text("b")
- text("c")
- }
- }
- text("d")
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |a
- |
- |bc
- |
- |d""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-}
diff --git a/plugins/gfm/src/test/kotlin/renderers/gfm/SimpleElementsTest.kt b/plugins/gfm/src/test/kotlin/renderers/gfm/SimpleElementsTest.kt
deleted file mode 100644
index 720a0af5..00000000
--- a/plugins/gfm/src/test/kotlin/renderers/gfm/SimpleElementsTest.kt
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.gfm
-
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.ContentEmbeddedResource
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.DCI
-import org.jetbrains.dokka.pages.TextStyle
-import renderers.RawTestPage
-import renderers.testPage
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class SimpleElementsTest : GfmRenderingOnlyTestBase() {
-
- @Test
- fun header() {
- val page = testPage {
- header(1, "The Hobbit or There and Back Again")
- }
- val expect = "//[testPage](test-page.md)\n\n# The Hobbit or There and Back Again"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun link() {
- val page = testPage {
- link("They are not all accounted for, the lost Seeing Stones.", "http://www.google.com")
- }
- val expect =
- "//[testPage](test-page.md)\n\n[They are not all accounted for, the lost Seeing Stones.](http://www.google.com)"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun bold() {
- val page = testPage {
- text(
- "That there’s some good in this world, Mr. Frodo… and it’s worth fighting for.",
- styles = setOf(TextStyle.Bold)
- )
- }
- val expect =
- "//[testPage](test-page.md)\n\n**That there’s some good in this world, Mr. Frodo… and it’s worth fighting for.**"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun italic() {
- val page = testPage {
- text("Even the smallest person can change the course of the future.", styles = setOf(TextStyle.Italic))
- }
- val expect = "//[testPage](test-page.md)\n\n*Even the smallest person can change the course of the future.*"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun italicAndBold() {
- val page = testPage {
- text(
- "There is no curse in Elvish, Entish, or the tongues of Men for this treachery.",
- styles = setOf(TextStyle.Bold, TextStyle.Italic)
- )
- }
- val expect =
- "//[testPage](test-page.md)\n\n***There is no curse in Elvish, Entish, or the tongues of Men for this treachery.***"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun strikethrough() {
- val page = testPage {
- text(
- "A day may come when the courage of men fails… but it is not THIS day",
- styles = setOf(TextStyle.Strikethrough)
- )
- }
- val expect =
- "//[testPage](test-page.md)\n\n~~A day may come when the courage of men fails… but it is not THIS day~~"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun images() {
- val image = ContentEmbeddedResource(
- children = emptyList(),
- address = "https://www.google.pl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png",
- altText = "This is a google logo",
- dci = DCI(setOf(DRI.topLevel), ContentKind.Main),
- sourceSets = emptySet()
- )
- val page = RawTestPage(content = image)
- val expect =
- "//[testPage](test-page.md)\n\n![This is a google logo](https://www.google.pl/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png)"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun simpleTableWithHeader() {
- val page = testPage {
- table {
- header {
- text("Col1")
- text("Col2")
- text("Col3")
- }
- row {
- text("Text1")
- text("Text2")
- text("Text3")
- }
- row {
- text("Text4")
- text("Text5")
- text("Text6")
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- || Col1 | Col2 | Col3 |
- ||---|---|---|
- || Text1 | Text2 | Text3 |
- || Text4 | Text5 | Text6 |""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun simpleTableWithoutHeader() {
- val page = testPage {
- table {
- row {
- text("Text1")
- text("Text2")
- text("Text3")
- }
- row {
- text("Text4")
- text("Text5")
- text("Text6")
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- || | | |
- ||---|---|---|
- || Text1 | Text2 | Text3 |
- || Text4 | Text5 | Text6 |""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `table with extra cell in row`() {
- val page = testPage {
- table {
- header {
- text("Col1")
- }
- row {
- text("Text1")
- text("Text2")
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- || Col1 |
- ||---|
- || Text1 | Text2 |""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `table with extra cell in header`() {
- val page = testPage {
- table {
- header {
- text("Col1")
- text("Col2")
- }
- row {
- text("Text1")
- }
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- || Col1 | Col2 |
- ||---|---|
- || Text1 |""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun escapeText() {
- val page = testPage {
- text(
- "<b>a</b>",
- )
- }
- val expect =
- "//[testPage](test-page.md)\n\n&lt;b&gt;a&lt;/b&gt;"
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `unordered list with two items`() {
- val page = testPage {
- unorderedList {
- item { text("Item 1") }
- item { text("Item 2") }
- }
- }
-
- val expect = """|//[testPage](test-page.md)
- |
- |- Item 1
- |- Item 2""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `unordered list with styled text`() {
- val page = testPage {
- unorderedList {
- item {
- text("Nobody", styles = setOf(TextStyle.Italic))
- text(" tosses a Dwarf!")
- }
- }
- }
-
- val expect = "//[testPage](test-page.md)\n\n- *Nobody* tosses a Dwarf!"
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `ordered list with two items`() {
- val page = testPage {
- orderedList {
- item { text("Item 1") }
- item { text("Item 2") }
- }
- }
-
- val expect = """|//[testPage](test-page.md)
- |
- |1. Item 1
- |2. Item 2""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `ordered list with nested unordered list`() {
- val page = testPage {
- orderedList {
- item {
- text("And another list:")
- unorderedList {
- item { text("Item 1") }
- item { text("Item 2") }
- }
- }
- item { text("Following item") }
- }
- }
-
- val expect = """|//[testPage](test-page.md)
- |
- |1. And another list:
- |
- | - Item 1
- | - Item 2
- |2. Following item""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `ordered list with nested table`() {
- val page = testPage {
- orderedList {
- item {
- text("The following table is nested in a list:")
- table {
- header {
- text("Col1")
- text("Col2")
- }
- row {
- text("Text1")
- text("Text2")
- }
- }
- }
- }
- }
-
- val expect = """|//[testPage](test-page.md)
- |
- |1. The following table is nested in a list:
- | | Col1 | Col2 |
- | |---|---|
- | | Text1 | Text2 |""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `three levels of list`() {
- val page = testPage {
- unorderedList {
- item {
- text("Level 1")
- unorderedList {
- item {
- text("Level 2")
- unorderedList {
- item {
- text("Level 3")
- }
- }
- }
- }
- }
- }
- }
-
- // Extra newlines are not pretty but do not impact formatting
- val expect = """|//[testPage](test-page.md)
- |
- |- Level 1
- |
- | - Level 2
- |
- | - Level 3""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun `nested list with no text preceding it`() {
- val page = testPage {
- unorderedList {
- item {
- unorderedList {
- item {
- text("Nested")
- }
- }
- }
- }
- }
-
- val expect = """|//[testPage](test-page.md)
- |
- |-
- | - Nested""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-}
diff --git a/plugins/gfm/src/test/kotlin/renderers/gfm/SourceSetDependentHintTest.kt b/plugins/gfm/src/test/kotlin/renderers/gfm/SourceSetDependentHintTest.kt
deleted file mode 100644
index 3f0129af..00000000
--- a/plugins/gfm/src/test/kotlin/renderers/gfm/SourceSetDependentHintTest.kt
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package renderers.gfm
-
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import org.jetbrains.dokka.pages.TextStyle
-import renderers.testPage
-import testApi.testRunner.defaultSourceSet
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class SourceSetDependentHintTest : GfmRenderingOnlyTestBase() {
-
- private val pl1 = defaultSourceSet.copy(
- "pl1",
- DokkaSourceSetID("root", "pl1"),
- analysisPlatform = Platform.js,
- sourceRoots = setOf(File("pl1"))
- )
- private val pl2 = defaultSourceSet.copy(
- "pl2",
- DokkaSourceSetID("root", "pl2"),
- analysisPlatform = Platform.jvm,
- sourceRoots = setOf(File("pl1"))
- )
- private val pl3 = defaultSourceSet.copy(
- "pl3",
- DokkaSourceSetID("root", "pl3"),
- analysisPlatform = Platform.native,
- sourceRoots = setOf(File("pl1"))
- )
-
- @Test
- fun platformIndependentCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2, pl3), styles = setOf(TextStyle.Block)) {
- text("a")
- text("b")
- text("c")
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1, pl2, pl3]\
- |abc""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun completelyDivergentCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2, pl3), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1))
- text("b", sourceSets = setOf(pl2))
- text("c", sourceSets = setOf(pl3))
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1]\
- |a
- |
- |[pl2]\
- |b
- |
- |[pl3]\
- |c""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun overlappingCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1))
- text("b", sourceSets = setOf(pl1, pl2))
- text("c", sourceSets = setOf(pl2))
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1]\
- |ab
- |
- |[pl2]\
- |bc""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun caseThatCanBeSimplified() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1, pl2))
- text("b", sourceSets = setOf(pl1))
- text("b", sourceSets = setOf(pl2))
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1, pl2]\
- |ab""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun caseWithGroupBreakingSimplification() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2), styles = setOf(TextStyle.Block)) {
- group(styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1, pl2))
- text("b", sourceSets = setOf(pl1))
- }
- text("b", sourceSets = setOf(pl2))
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1]\
- |ab
- |
- |[pl2]\
- |a
- |
- |b""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun caseWithGroupNotBreakingSimplification() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2)) {
- group {
- text("a", sourceSets = setOf(pl1, pl2))
- text("b", sourceSets = setOf(pl1))
- }
- text("b", sourceSets = setOf(pl2))
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1, pl2]\
- |ab""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-
- @Test
- fun partiallyUnifiedCase() {
- val page = testPage {
- sourceSetDependentHint(sourceSets = setOf(pl1, pl2, pl3), styles = setOf(TextStyle.Block)) {
- text("a", sourceSets = setOf(pl1))
- text("a", sourceSets = setOf(pl2))
- text("b", sourceSets = setOf(pl3))
- }
- }
- val expect = """|//[testPage](test-page.md)
- |
- |[pl1, pl2]\
- |a
- |
- |[pl3]\
- |b""".trimMargin()
-
- CommonmarkRenderer(context).render(page)
- assertEquals(expect, renderedContent)
- }
-}
diff --git a/plugins/javadoc/README.md b/plugins/javadoc/README.md
deleted file mode 100644
index aaa1f272..00000000
--- a/plugins/javadoc/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Javadoc plugin
-
-The Javadoc plugin adds a Javadoc output format that looks like Java's Javadoc HTML, but it's for the most part
-a lookalike, so you may experience problems if you try to use it with a tool that expects native
-Javadoc documentation generated by Java.
-
-The Javadoc plugin is shipped with the Dokka Gradle Plugin, so you can start using it right away with one of the following
-tasks:
-
-* `dokkaJavadoc` - builds Javadoc documentation for single-project builds or for a specific module.
-* `dokkaJavadocCollector` - collects generated Javadoc documentation from submodules and assembles it together.
-
-The Javadoc plugin has its own signature provider that essentially translates Kotlin signatures to Java ones.
-
-To use it with Maven or the CLI runner, you have to add it as a dependency. You can find it on
-[Maven Central](https://mvnrepository.com/artifact/org.jetbrains.dokka/javadoc-plugin).
-
-**This plugin is at its early stages**, so you may experience issues and encounter bugs. Feel free to
-[report](https://github.com/Kotlin/dokka/issues/new/choose) any errors you see.
diff --git a/plugins/javadoc/api/javadoc.api b/plugins/javadoc/api/javadoc.api
deleted file mode 100644
index a6b686d7..00000000
--- a/plugins/javadoc/api/javadoc.api
+++ /dev/null
@@ -1,694 +0,0 @@
-public final class org/jetbrains/dokka/javadoc/JavadocDocumentableToPageTranslator : org/jetbrains/dokka/transformers/documentation/DocumentableToPageTranslator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public class org/jetbrains/dokka/javadoc/JavadocPageCreator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun nodeForJvm (Ljava/util/List;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun pageForClasslike (Lorg/jetbrains/dokka/model/DClasslike;)Lorg/jetbrains/dokka/javadoc/pages/JavadocClasslikePageNode;
- public final fun pageForModule (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/javadoc/pages/JavadocModulePageNode;
- public final fun pageForPackage (Lorg/jetbrains/dokka/model/DPackage;)Lorg/jetbrains/dokka/javadoc/pages/JavadocPackagePageNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/JavadocPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getAllClassessPageInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDeprecatedPageCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDocumentableSourceSetFilter ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDokkaJavadocPlugin ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getIndexGenerator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJavadocLocationProviderFactory ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJavadocMultiplatformCheck ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJavadocPreprocessors ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getJavadocSignatureProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getLocationProviderFactory ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getPackageListCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPageTranslator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getResourcesInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getRootCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getTreeViewInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/javadoc/location/JavadocLocationProvider : org/jetbrains/dokka/base/resolvers/local/DefaultLocationProvider {
- public fun <init> (Lorg/jetbrains/dokka/pages/RootPageNode;Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun ancestors (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/util/List;
- public fun expectedLocationForDri (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String;
- public fun pathToRoot (Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public final fun resolve (Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;Lorg/jetbrains/dokka/pages/PageNode;Z)Ljava/lang/String;
- public fun resolve (Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/pages/PageNode;)Ljava/lang/String;
- public fun resolve (Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/pages/PageNode;Z)Ljava/lang/String;
- public static synthetic fun resolve$default (Lorg/jetbrains/dokka/javadoc/location/JavadocLocationProvider;Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;Lorg/jetbrains/dokka/pages/PageNode;ZILjava/lang/Object;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/javadoc/location/JavadocLocationProviderFactory : org/jetbrains/dokka/base/resolvers/local/LocationProviderFactory {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun getLocationProvider (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/AllClassesPage : org/jetbrains/dokka/javadoc/pages/JavadocPageNode {
- public fun <init> (Ljava/util/List;)V
- public fun getChildren ()Ljava/util/List;
- public final fun getClassEntries ()Ljava/util/List;
- public final fun getClasses ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public fun getEmbeddedResources ()Ljava/util/List;
- public fun getName ()Ljava/lang/String;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/AllClassesPageInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/javadoc/pages/AllClassesPageInstaller;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public abstract class org/jetbrains/dokka/javadoc/pages/AnchorableJavadocNode : org/jetbrains/dokka/javadoc/pages/NavigableJavadocNode {
- public synthetic fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun getDRI ()Lorg/jetbrains/dokka/links/DRI;
- public fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public fun getId ()Ljava/lang/String;
- public fun getName ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/DeprecatedNode {
- public fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Ljava/util/List;)V
- public fun equals (Ljava/lang/Object;)Z
- public final fun getAddress ()Lorg/jetbrains/dokka/links/DRI;
- public final fun getDescription ()Ljava/util/List;
- public final fun getName ()Ljava/lang/String;
- public fun hashCode ()I
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/DeprecatedPage : org/jetbrains/dokka/javadoc/pages/JavadocPageNode {
- public fun <init> (Ljava/util/Map;Ljava/util/Set;)V
- public fun getChildren ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public final fun getElements ()Ljava/util/Map;
- public fun getEmbeddedResources ()Ljava/util/List;
- public fun getName ()Ljava/lang/String;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/DeprecatedPageCreator : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageCreator;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/DeprecatedPageSection : java/lang/Enum {
- public static final field DeprecatedClasses Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedConstructors Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedEnumConstants Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedEnums Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedExceptions Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedFields Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedForRemoval Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedInterfaces Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedMethods Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static final field DeprecatedModules Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public final fun getCaption ()Ljava/lang/String;
- public final fun getHeader ()Ljava/lang/String;
- public final fun getId ()Ljava/lang/String;
- public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
- public static fun values ()[Lorg/jetbrains/dokka/javadoc/pages/DeprecatedPageSection;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/EmptyNode : org/jetbrains/dokka/pages/ContentNode {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun component3 ()Ljava/util/Set;
- public final fun component4 ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/EmptyNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/EmptyNode;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/EmptyNode;
- public fun equals (Ljava/lang/Object;)Z
- public fun getChildren ()Ljava/util/List;
- public fun getDci ()Lorg/jetbrains/dokka/pages/DCI;
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public fun getSourceSets ()Ljava/util/Set;
- public fun getStyle ()Ljava/util/Set;
- public fun hasAnyContent ()Z
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/EmptyNode;
- public fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/EmptyNode;
- public synthetic fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/IndexGenerator : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/javadoc/pages/IndexGenerator;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/IndexPage : org/jetbrains/dokka/javadoc/pages/JavadocPageNode {
- public fun <init> (ILjava/util/List;Ljava/util/List;Ljava/util/Set;)V
- public fun getChildren ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public final fun getElements ()Ljava/util/List;
- public fun getEmbeddedResources ()Ljava/util/List;
- public final fun getId ()I
- public final fun getKeys ()Ljava/util/List;
- public fun getName ()Ljava/lang/String;
- public final fun getTitle ()Ljava/lang/String;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavaContentGroupBuilder {
- public fun <init> (Ljava/util/Set;)V
- public final fun getList ()Ljava/util/List;
- public final fun getSourceSets ()Ljava/util/Set;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocClasslikePageNode : org/jetbrains/dokka/javadoc/pages/JavadocPageNode, org/jetbrains/dokka/javadoc/pages/NavigableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithBrief, org/jetbrains/dokka/javadoc/pages/WithJavadocExtra, org/jetbrains/dokka/javadoc/pages/WithNavigable, org/jetbrains/dokka/pages/ClasslikePage {
- public fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;Ljava/util/Set;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;Ljava/util/Set;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun getAllNavigables ()Ljava/util/List;
- public final fun getAnchorables ()Ljava/util/List;
- public final fun getAuthorTagContent ()Ljava/util/List;
- public fun getBrief ()Ljava/util/List;
- public fun getChildren ()Ljava/util/List;
- public final fun getClasslikes ()Ljava/util/List;
- public final fun getConstructors ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;
- public synthetic fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDRI ()Lorg/jetbrains/dokka/links/DRI;
- public final fun getDescription ()Ljava/util/List;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public fun getEmbeddedResources ()Ljava/util/List;
- public final fun getEntries ()Ljava/util/List;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getId ()Ljava/lang/String;
- public final fun getKind ()Ljava/lang/String;
- public final fun getMethods ()Ljava/util/List;
- public fun getName ()Ljava/lang/String;
- public final fun getPackageName ()Ljava/lang/String;
- public final fun getProperties ()Ljava/util/List;
- public final fun getSignature ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public final fun getSinceTagContent ()Ljava/util/List;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/DClasslike;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocContentGroup : org/jetbrains/dokka/javadoc/pages/JavadocContentNode {
- public static final field Companion Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup$Companion;
- public fun <init> (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/List;)V
- public final fun component1 ()Ljava/util/Set;
- public final fun component2 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun component3 ()Ljava/util/Set;
- public final fun component4 ()Ljava/util/List;
- public final fun copy (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/List;)Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup;
- public fun equals (Ljava/lang/Object;)Z
- public fun getChildren ()Ljava/util/List;
- public final fun getDri ()Ljava/util/Set;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public fun getSourceSets ()Ljava/util/Set;
- public fun hasAnyContent ()Z
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentNode;
- public fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup;
- public synthetic fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocContentGroup$Companion {
- public final fun invoke (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/dokka/javadoc/pages/JavadocContentGroup;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocContentKind : java/lang/Enum, org/jetbrains/dokka/pages/Kind {
- public static final field AllClasses Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static final field Class Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static final field IndexPage Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static final field OverviewSummary Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static final field OverviewTree Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static final field PackageSummary Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static final field PackageTree Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
- public static fun values ()[Lorg/jetbrains/dokka/javadoc/pages/JavadocContentKind;
-}
-
-public abstract class org/jetbrains/dokka/javadoc/pages/JavadocContentNode : org/jetbrains/dokka/pages/ContentNode {
- public fun <init> (Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)V
- public fun getChildren ()Ljava/util/List;
- public fun getDci ()Lorg/jetbrains/dokka/pages/DCI;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getSourceSets ()Ljava/util/Set;
- public fun getStyle ()Ljava/util/Set;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocContentNodesKt {
- public static final fun JavadocList (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/javadoc/pages/JavadocList;
- public static final fun leafList (Lorg/jetbrains/dokka/javadoc/pages/JavaContentGroupBuilder;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Lorg/jetbrains/dokka/javadoc/pages/JavadocList;)V
- public static final fun rootList (Lorg/jetbrains/dokka/javadoc/pages/JavaContentGroupBuilder;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/List;)V
- public static final fun title (Lorg/jetbrains/dokka/javadoc/pages/JavaContentGroupBuilder;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;)V
- public static synthetic fun title$default (Lorg/jetbrains/dokka/javadoc/pages/JavaContentGroupBuilder;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;ILjava/lang/Object;)V
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocEntryNode : org/jetbrains/dokka/javadoc/pages/AnchorableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithBrief, org/jetbrains/dokka/javadoc/pages/WithJavadocExtra {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public final fun component4 ()Ljava/util/List;
- public final fun component5 ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/JavadocEntryNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocEntryNode;Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocEntryNode;
- public fun equals (Ljava/lang/Object;)Z
- public fun getBrief ()Ljava/util/List;
- public fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getName ()Ljava/lang/String;
- public final fun getSignature ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/DEnumEntry;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocFunctionNode : org/jetbrains/dokka/javadoc/pages/AnchorableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithBrief, org/jetbrains/dokka/javadoc/pages/WithJavadocExtra {
- public fun <init> (Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public final fun component2 ()Ljava/util/List;
- public final fun component3 ()Ljava/util/List;
- public final fun component4 ()Ljava/util/List;
- public final fun component5 ()Ljava/util/List;
- public final fun component6 ()Ljava/util/List;
- public final fun component7 ()Ljava/lang/String;
- public final fun component8 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component9 ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun copy (Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/JavadocFunctionNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocFunctionNode;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocFunctionNode;
- public fun equals (Ljava/lang/Object;)Z
- public fun getBrief ()Ljava/util/List;
- public final fun getDescription ()Ljava/util/List;
- public fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getName ()Ljava/lang/String;
- public final fun getParameters ()Ljava/util/List;
- public final fun getReturnTagContent ()Ljava/util/List;
- public final fun getSignature ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public final fun getSinceTagContent ()Ljava/util/List;
- public fun hashCode ()I
- public final fun isInherited ()Z
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/DFunction;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocIndexExtra : org/jetbrains/dokka/model/properties/ExtraProperty {
- public static final field Companion Lorg/jetbrains/dokka/javadoc/pages/JavadocIndexExtra$Companion;
- public fun <init> (Ljava/util/List;)V
- public final fun component1 ()Ljava/util/List;
- public final fun copy (Ljava/util/List;)Lorg/jetbrains/dokka/javadoc/pages/JavadocIndexExtra;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocIndexExtra;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocIndexExtra;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getIndex ()Ljava/util/List;
- public fun getKey ()Lorg/jetbrains/dokka/model/properties/ExtraProperty$Key;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocIndexExtra$Companion : org/jetbrains/dokka/model/properties/ExtraProperty$Key {
- public synthetic fun mergeStrategyFor (Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
- public fun mergeStrategyFor (Lorg/jetbrains/dokka/javadoc/pages/JavadocIndexExtra;Lorg/jetbrains/dokka/javadoc/pages/JavadocIndexExtra;)Lorg/jetbrains/dokka/model/properties/MergeStrategy;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/JavadocList {
- public abstract fun getChildren ()Ljava/util/List;
- public abstract fun getColTitle ()Ljava/lang/String;
- public abstract fun getTabTitle ()Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/JavadocListEntry {
- public abstract fun getStringTag ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocModulePageNode : org/jetbrains/dokka/pages/RootPageNode, org/jetbrains/dokka/javadoc/pages/JavadocPageNode, org/jetbrains/dokka/javadoc/pages/NavigableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithJavadocExtra, org/jetbrains/dokka/pages/ModulePage {
- public fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun getChildren ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;
- public synthetic fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDRI ()Lorg/jetbrains/dokka/links/DRI;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public fun getEmbeddedResources ()Ljava/util/List;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getId ()Ljava/lang/String;
- public fun getName ()Ljava/lang/String;
- public synthetic fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/RootPageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/DModule;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocPackagePageNode : org/jetbrains/dokka/javadoc/pages/JavadocPageNode, org/jetbrains/dokka/javadoc/pages/NavigableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithNavigable, org/jetbrains/dokka/pages/PackagePage {
- public fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V
- public synthetic fun <init> (Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun getAllNavigables ()Ljava/util/List;
- public fun getChildren ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/javadoc/pages/JavadocContentNode;
- public synthetic fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDRI ()Lorg/jetbrains/dokka/links/DRI;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public fun getEmbeddedResources ()Ljava/util/List;
- public fun getId ()Ljava/lang/String;
- public fun getName ()Ljava/lang/String;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/JavadocPageNode : org/jetbrains/dokka/pages/ContentPage, org/jetbrains/dokka/pages/WithDocumentables {
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocPageNode$DefaultImpls {
- public static fun getDocumentable (Lorg/jetbrains/dokka/javadoc/pages/JavadocPageNode;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocParameterNode : org/jetbrains/dokka/javadoc/pages/AnchorableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithJavadocExtra {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/Bound;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/Bound;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun component4 ()Ljava/util/List;
- public final fun component5 ()Lorg/jetbrains/dokka/model/Bound;
- public final fun component6 ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/Bound;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/JavadocParameterNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocParameterNode;Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/Bound;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocParameterNode;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDescription ()Ljava/util/List;
- public fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getName ()Ljava/lang/String;
- public final fun getType ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getTypeBound ()Lorg/jetbrains/dokka/model/Bound;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/DParameter;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocPropertyNode : org/jetbrains/dokka/javadoc/pages/AnchorableJavadocNode, org/jetbrains/dokka/javadoc/pages/WithBrief, org/jetbrains/dokka/javadoc/pages/WithJavadocExtra {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public final fun component4 ()Ljava/util/List;
- public final fun component5 ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/JavadocPropertyNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocPropertyNode;Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Ljava/util/List;Lorg/jetbrains/dokka/model/properties/PropertyContainer;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocPropertyNode;
- public fun equals (Ljava/lang/Object;)Z
- public fun getBrief ()Ljava/util/List;
- public fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public fun getExtra ()Lorg/jetbrains/dokka/model/properties/PropertyContainer;
- public fun getName ()Ljava/lang/String;
- public final fun getSignature ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/DProperty;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode : org/jetbrains/dokka/javadoc/pages/JavadocContentNode {
- public fun <init> (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;)V
- public synthetic fun <init> (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Lorg/jetbrains/dokka/links/DRI;
- public final fun component2 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun component3 ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun component4 ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun component5 ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun component6 ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun copy (Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;)Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/pages/Kind;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;Lorg/jetbrains/dokka/pages/ContentNode;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getAnnotations ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getDri ()Lorg/jetbrains/dokka/links/DRI;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun getModifiers ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getSignatureWithoutModifiers ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getSupertypes ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun hasAnyContent ()Z
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public synthetic fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/LeafListNode : org/jetbrains/dokka/javadoc/pages/JavadocContentNode {
- public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/lang/String;
- public final fun component3 ()Ljava/util/List;
- public final fun component4 ()Ljava/util/Set;
- public final fun component5 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun component6 ()Ljava/util/Set;
- public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/LeafListNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/LeafListNode;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/LeafListNode;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getColTitle ()Ljava/lang/String;
- public final fun getDri ()Ljava/util/Set;
- public final fun getEntries ()Ljava/util/List;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public fun getSourceSets ()Ljava/util/Set;
- public final fun getTabTitle ()Ljava/lang/String;
- public fun hasAnyContent ()Z
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/LeafListNode;
- public synthetic fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry : org/jetbrains/dokka/javadoc/pages/JavadocListEntry {
- public fun <init> (Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)V
- public synthetic fun <init> (Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun build (Lkotlin/jvm/functions/Function4;)V
- public final fun getDri ()Ljava/util/Set;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun getName ()Ljava/lang/String;
- public final fun getSourceSets ()Ljava/util/Set;
- public fun getStringTag ()Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/NavigableJavadocNode {
- public abstract fun getDRI ()Lorg/jetbrains/dokka/links/DRI;
- public abstract fun getId ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/ResourcesInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/javadoc/pages/ResourcesInstaller;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/RootListNode : org/jetbrains/dokka/javadoc/pages/JavadocContentNode {
- public fun <init> (Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)V
- public final fun component1 ()Ljava/util/List;
- public final fun component2 ()Ljava/util/Set;
- public final fun component3 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun component4 ()Ljava/util/Set;
- public final fun copy (Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/RootListNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/RootListNode;Ljava/util/List;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/RootListNode;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDri ()Ljava/util/Set;
- public final fun getEntries ()Ljava/util/List;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public fun getSourceSets ()Ljava/util/Set;
- public fun hasAnyContent ()Z
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/RootListNode;
- public synthetic fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/RowJavadocListEntry : org/jetbrains/dokka/javadoc/pages/JavadocListEntry {
- public fun <init> (Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;Ljava/util/List;)V
- public final fun component1 ()Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;
- public final fun component2 ()Ljava/util/List;
- public final fun copy (Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;Ljava/util/List;)Lorg/jetbrains/dokka/javadoc/pages/RowJavadocListEntry;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/RowJavadocListEntry;Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/RowJavadocListEntry;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDoc ()Ljava/util/List;
- public final fun getLink ()Lorg/jetbrains/dokka/javadoc/pages/LinkJavadocListEntry;
- public fun getStringTag ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/TitleNode : org/jetbrains/dokka/javadoc/pages/JavadocContentNode {
- public fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/util/List;
- public final fun component3 ()Ljava/lang/String;
- public final fun component4 ()Ljava/lang/String;
- public final fun component5 ()Ljava/util/Set;
- public final fun component6 ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun component7 ()Ljava/util/Set;
- public final fun copy (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/TitleNode;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/javadoc/pages/TitleNode;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Lorg/jetbrains/dokka/pages/Kind;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/dokka/javadoc/pages/TitleNode;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDri ()Ljava/util/Set;
- public final fun getKind ()Lorg/jetbrains/dokka/pages/Kind;
- public final fun getParent ()Ljava/lang/String;
- public fun getSourceSets ()Ljava/util/Set;
- public final fun getSubtitle ()Ljava/util/List;
- public final fun getTitle ()Ljava/lang/String;
- public final fun getVersion ()Ljava/lang/String;
- public fun hasAnyContent ()Z
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Ljava/lang/Object;
- public fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/javadoc/pages/TitleNode;
- public synthetic fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/pages/ContentNode;
- public fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/javadoc/pages/TitleNode;
- public synthetic fun withSourceSets (Ljava/util/Set;)Lorg/jetbrains/dokka/pages/ContentNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/TreeViewInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/TreeViewPage : org/jetbrains/dokka/javadoc/pages/JavadocPageNode {
- public fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/List;Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/analysis/kotlin/internal/InheritanceBuilder;)V
- public synthetic fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/List;Lorg/jetbrains/dokka/pages/PageNode;Lorg/jetbrains/dokka/analysis/kotlin/internal/InheritanceBuilder;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun getChildren ()Ljava/util/List;
- public final fun getClasses ()Ljava/util/List;
- public fun getContent ()Lorg/jetbrains/dokka/pages/ContentNode;
- public fun getDocumentable ()Lorg/jetbrains/dokka/model/Documentable;
- public fun getDocumentables ()Ljava/util/List;
- public fun getDri ()Ljava/util/Set;
- public fun getEmbeddedResources ()Ljava/util/List;
- public final fun getInheritanceBuilder ()Lorg/jetbrains/dokka/analysis/kotlin/internal/InheritanceBuilder;
- public final fun getKind ()Ljava/lang/String;
- public fun getName ()Ljava/lang/String;
- public final fun getPackages ()Ljava/util/List;
- public final fun getRoot ()Lorg/jetbrains/dokka/pages/PageNode;
- public final fun getTitle ()Ljava/lang/String;
- public fun modified (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/dokka/pages/PageNode;
- public fun modified (Ljava/lang/String;Lorg/jetbrains/dokka/pages/ContentNode;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/dokka/pages/ContentPage;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/WithBrief {
- public abstract fun getBrief ()Ljava/util/List;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/WithJavadocExtra : org/jetbrains/dokka/model/properties/WithExtraProperties {
- public abstract fun withNewExtras (Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public final class org/jetbrains/dokka/javadoc/pages/WithJavadocExtra$DefaultImpls {
- public static fun withNewExtras (Lorg/jetbrains/dokka/javadoc/pages/WithJavadocExtra;Lorg/jetbrains/dokka/model/properties/PropertyContainer;)Lorg/jetbrains/dokka/model/Documentable;
-}
-
-public abstract interface class org/jetbrains/dokka/javadoc/pages/WithNavigable {
- public abstract fun getAllNavigables ()Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/javadoc/renderer/KorteJavadocRenderer : org/jetbrains/dokka/renderers/Renderer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun render (Lorg/jetbrains/dokka/pages/RootPageNode;)V
-}
-
-public final class org/jetbrains/dokka/javadoc/renderer/SearchScriptsCreator {
- public fun <init> (Lorg/jetbrains/dokka/base/resolvers/local/LocationProvider;)V
- public final fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/javadoc/signatures/JavadocSignatureProvider : org/jetbrains/dokka/base/signatures/JvmSignatureUtils, org/jetbrains/dokka/base/signatures/SignatureProvider {
- public fun <init> (Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/utilities/DokkaLogger;)V
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun annotations (Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun annotationsBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun annotationsInline (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun modifiers (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun parametersBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public fun signature (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/List;
- public fun stylesIfDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public fun toSignatureString (Ljava/util/Collection;)Ljava/lang/String;
- public fun toSignatureString (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun uses (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilter : org/jetbrains/dokka/transformers/documentation/PreMergeDocumentableTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun invoke (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder : org/jetbrains/dokka/base/translators/documentables/PageContentBuilder {
- public fun <init> (Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/base/signatures/SignatureProvider;Lorg/jetbrains/dokka/utilities/DokkaLogger;)V
- public final fun javadocGroup (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;)V
- public static synthetic fun javadocGroup$default (Lorg/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder;Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/links/DRI;Ljava/util/Set;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
-}
-
-public class org/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder$JavadocContentBuilder {
- public fun <init> (Lorg/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder;Lorg/jetbrains/dokka/links/DRI;Lorg/jetbrains/dokka/model/properties/PropertyContainer;Ljava/util/Set;)V
- public final fun annotations (Lkotlin/jvm/functions/Function1;)V
- public final fun build ()Lorg/jetbrains/dokka/javadoc/pages/JavadocSignatureContentNode;
- public final fun getAnnotations ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getModifiers ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getSignatureWithoutModifiers ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun getSupertypes ()Lorg/jetbrains/dokka/pages/ContentNode;
- public final fun modifiers (Lkotlin/jvm/functions/Function1;)V
- public final fun setAnnotations (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public final fun setModifiers (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public final fun setSignatureWithoutModifiers (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public final fun setSupertypes (Lorg/jetbrains/dokka/pages/ContentNode;)V
- public final fun signatureWithoutModifiers (Lkotlin/jvm/functions/Function1;)V
- public final fun supertypes (Lkotlin/jvm/functions/Function1;)V
-}
-
-public final class org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker : org/jetbrains/dokka/validity/PreGenerationChecker {
- public static final field Companion Lorg/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker$Companion;
- public static final field errorMessage Ljava/lang/String;
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public synthetic fun invoke ()Ljava/lang/Object;
- public fun invoke ()Lorg/jetbrains/dokka/validity/PreGenerationCheckerOutput;
-}
-
-public final class org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker$Companion {
-}
-
diff --git a/plugins/javadoc/build.gradle.kts b/plugins/javadoc/build.gradle.kts
deleted file mode 100644
index ea882bb4..00000000
--- a/plugins/javadoc/build.gradle.kts
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
- id("org.jetbrains.conventions.base-unit-test")
-}
-
-dependencies {
- compileOnly(projects.core)
- compileOnly(projects.subprojects.analysisKotlinApi)
-
- implementation(projects.plugins.base)
- implementation(projects.plugins.kotlinAsJava)
-
- implementation(kotlin("reflect"))
- implementation(libs.korlibs.template)
- implementation(libs.kotlinx.html)
- implementation(libs.kotlinx.coroutines.core)
-
- testImplementation(kotlin("test"))
- symbolsTestConfiguration(project(path = ":subprojects:analysis-kotlin-symbols", configuration = "shadow"))
- descriptorsTestConfiguration(project(path = ":subprojects:analysis-kotlin-descriptors", configuration = "shadow"))
- testImplementation(projects.plugins.base.baseTestUtils) {
- exclude(module = "analysis-kotlin-descriptors")
- }
- testImplementation(projects.core.testApi)
- testImplementation(libs.jsoup)
-}
-
-registerDokkaArtifactPublication("javadocPlugin") {
- artifactId = "javadoc-plugin"
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocDocumentableToPageTranslator.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocDocumentableToPageTranslator.kt
deleted file mode 100644
index 595c307a..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocDocumentableToPageTranslator.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
-
-public class JavadocDocumentableToPageTranslator(
- private val context: DokkaContext
-) : DocumentableToPageTranslator {
- override fun invoke(module: DModule): RootPageNode = JavadocPageCreator(context).pageForModule(module)
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt
deleted file mode 100644
index cfdda649..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.firstSentenceBriefFromContentNodes
-import org.jetbrains.dokka.javadoc.pages.*
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.doc.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import kotlin.reflect.KClass
-
-public open class JavadocPageCreator(context: DokkaContext) {
- private val signatureProvider: SignatureProvider = context.plugin<DokkaBase>().querySingle { signatureProvider }
- private val documentationVersion = context.configuration.moduleVersion
-
- public fun pageForModule(m: DModule): JavadocModulePageNode {
- return JavadocModulePageNode(
- name = m.name.ifEmpty { "root" },
- content = contentForModule(m),
- children = m.packages.map { pageForPackage(it) },
- dri = setOf(m.dri),
- extra = ((m as? WithExtraProperties<DModule>)?.extra ?: PropertyContainer.empty())
- )
- }
-
- public fun pageForPackage(p: DPackage): JavadocPackagePageNode {
- return JavadocPackagePageNode(p.name, contentForPackage(p), setOf(p.dri), listOf(p),
- p.classlikes.mapNotNull { pageForClasslike(it) }
- )
- }
-
- public fun pageForClasslike(c: DClasslike): JavadocClasslikePageNode? {
- return c.highestJvmSourceSet?.let { jvm ->
- @Suppress("UNCHECKED_CAST")
- val extra = ((c as? WithExtraProperties<Documentable>)?.extra ?: PropertyContainer.empty())
- val children = c.classlikes.mapNotNull { pageForClasslike(it) }
-
- JavadocClasslikePageNode(
- name = c.dri.classNames.orEmpty(),
- content = contentForClasslike(c),
- dri = setOf(c.dri),
- brief = c.brief(),
- signature = signatureForNode(c, jvm),
- description = c.descriptionToContentNodes(),
- constructors = (c as? WithConstructors)?.constructors?.mapNotNull { it.toJavadocFunction() }.orEmpty(),
- methods = c.functions.mapNotNull { it.toJavadocFunction() },
- entries = (c as? DEnum)?.entries?.map {
- JavadocEntryNode(
- it.dri,
- it.name,
- signatureForNode(it, jvm),
- it.descriptionToContentNodes(jvm),
- PropertyContainer.withAll(it.indexesInDocumentation())
- )
- }.orEmpty(),
- classlikes = children,
- properties = c.properties.map {
- JavadocPropertyNode(
- it.dri,
- it.name,
- signatureForNode(it, jvm),
- it.descriptionToContentNodes(jvm),
- PropertyContainer.withAll(it.indexesInDocumentation()),
- )
- },
- sinceTagContent = c.sinceToContentNodes(jvm),
- authorTagContent = c.authorsToContentNodes(jvm),
- documentables = listOf(c),
- children = children,
- extra = extra + c.indexesInDocumentation()
- )
- }
- }
-
- private fun contentForModule(m: DModule): JavadocContentNode =
- JavadocContentGroup(
- setOf(m.dri),
- JavadocContentKind.OverviewSummary,
- m.sourceSets.toDisplaySourceSets()
- ) {
- title(m.name, m.descriptionToContentNodes(), documentationVersion, dri = setOf(m.dri), kind = ContentKind.Main)
- leafList(setOf(m.dri),
- ContentKind.Packages, JavadocList(
- "Packages", "Package",
- m.packages.sortedBy { it.packageName }.map { p ->
- RowJavadocListEntry(
- LinkJavadocListEntry(p.name, setOf(p.dri), JavadocContentKind.PackageSummary, sourceSets),
- p.brief()
- )
- }
- ))
- }
-
- private fun contentForPackage(p: DPackage): JavadocContentNode =
- JavadocContentGroup(
- setOf(p.dri),
- JavadocContentKind.PackageSummary,
- p.sourceSets.toDisplaySourceSets()
- ) {
- title("Package ${p.name}", p.descriptionToContentNodes(), dri = setOf(p.dri), kind = ContentKind.Packages)
- fun allClasslikes(c: DClasslike): List<DClasslike> = c.classlikes.flatMap { allClasslikes(it) } + c
- val rootList = p.classlikes.map { allClasslikes(it) }.flatten().groupBy { it::class }.map { (key, value) ->
- JavadocList(key.tabTitle, key.colTitle, value.map { c ->
- RowJavadocListEntry(
- LinkJavadocListEntry(c.name ?: "", setOf(c.dri), JavadocContentKind.Class, sourceSets),
- c.brief()
- )
- })
- }
- rootList(setOf(p.dri), JavadocContentKind.Class, rootList)
- }
-
- private val KClass<out DClasslike>.colTitle: String
- get() = when (this) {
- DClass::class -> "Class"
- DObject::class -> "Object"
- DAnnotation::class -> "Annotation"
- DEnum::class -> "Enum"
- DInterface::class -> "Interface"
- else -> ""
- }
-
- private val KClass<out DClasslike>.tabTitle: String
- get() = "$colTitle Summary"
-
- private fun contentForClasslike(c: DClasslike): JavadocContentNode =
- JavadocContentGroup(
- setOf(c.dri),
- JavadocContentKind.Class,
- c.sourceSets.toDisplaySourceSets()
- ) {
- title(
- c.name.orEmpty(),
- c.brief(),
- documentationVersion,
- parent = c.dri.packageName,
- dri = setOf(c.dri),
- kind = JavadocContentKind.Class
- )
- }
-
- private fun DFunction.toJavadocFunction() = highestJvmSourceSet?.let { jvm ->
- JavadocFunctionNode(
- name = name,
- dri = dri,
- signature = signatureForNode(this, jvm),
- brief = brief(jvm),
- description = descriptionToContentNodes(jvm),
- parameters = parameters.mapNotNull {
- val signature = signatureForNode(it, jvm)
- signature.modifiers?.let { type ->
- JavadocParameterNode(
- name = it.name.orEmpty(),
- type = type,
- description = it.brief(),
- typeBound = it.type,
- dri = it.dri,
- extra = PropertyContainer.withAll(it.indexesInDocumentation())
- )
- }
- },
- returnTagContent = returnToContentNodes(jvm),
- sinceTagContent = sinceToContentNodes(jvm),
- extra = extra + indexesInDocumentation()
- )
- }
-
- private val Documentable.highestJvmSourceSet
- get() = sourceSets.let { sources ->
- sources.firstOrNull { it != expectPresentInSet } ?: sources.firstOrNull()
- }
-
- private inline fun <reified T : TagWrapper> Documentable.findNodeInDocumentation(sourceSetData: DokkaSourceSet?): T? =
- documentation[sourceSetData]?.firstChildOfTypeOrNull<T>()
-
- private inline fun <reified T : TagWrapper> Documentable.findAllNodesInDocumentation(sourceSetData: DokkaSourceSet?): List<T> =
- documentation[sourceSetData]?.childrenOfType<T>() ?: emptyList()
-
- private fun Documentable.descriptionToContentNodes(sourceSet: DokkaSourceSet? = highestJvmSourceSet) =
- contentNodesFromType<Description>(sourceSet)
-
- private fun DParameter.paramsToContentNodes(sourceSet: DokkaSourceSet? = highestJvmSourceSet) =
- contentNodesFromType<Param>(sourceSet)
-
- private inline fun <reified T : TagWrapper> Documentable.contentNodesFromType(sourceSet: DokkaSourceSet?) =
- findNodeInDocumentation<T>(sourceSet)?.let {
- DocTagToContentConverter().buildContent(
- it.root,
- DCI(setOf(dri), JavadocContentKind.OverviewSummary),
- sourceSets.toSet()
- )
- }.orEmpty()
-
- private inline fun <reified T : TagWrapper> Documentable.allContentNodesFromType(sourceSet: DokkaSourceSet?) =
- findAllNodesInDocumentation<T>(sourceSet).map {
- DocTagToContentConverter().buildContent(
- it.root,
- DCI(setOf(dri), JavadocContentKind.OverviewSummary),
- sourceSets.toSet()
- )
- }
-
- public fun List<ContentNode>.nodeForJvm(jvm: DokkaSourceSet): ContentNode {
- return firstOrNull { jvm.sourceSetID in it.sourceSets.computeSourceSetIds() }
- ?: throw IllegalStateException("No source set found for ${jvm.sourceSetID} ")
- }
-
- private fun Documentable.brief(sourceSet: DokkaSourceSet? = highestJvmSourceSet): List<ContentNode> =
- firstSentenceBriefFromContentNodes(descriptionToContentNodes(sourceSet))
-
- private fun DParameter.brief(sourceSet: DokkaSourceSet? = highestJvmSourceSet): List<ContentNode> =
- firstSentenceBriefFromContentNodes(paramsToContentNodes(sourceSet).dropWhile { it is ContentDRILink })
-
- private fun ContentNode.asJavadocNode(): JavadocSignatureContentNode =
- (this as ContentGroup).firstChildOfTypeOrNull<JavadocSignatureContentNode>()
- ?: throw IllegalStateException("No content for javadoc signature found")
-
- private fun signatureForNode(documentable: Documentable, sourceSet: DokkaSourceSet): JavadocSignatureContentNode =
- signatureProvider.signature(documentable).nodeForJvm(sourceSet).asJavadocNode()
-
- private fun Documentable.indexesInDocumentation(): JavadocIndexExtra {
- val indexes =
- documentation[highestJvmSourceSet]?.withDescendants()?.filterIsInstance<Index>()?.toList().orEmpty()
- return JavadocIndexExtra(
- indexes.map {
- ContentGroup(
- children = DocTagToContentConverter().buildContent(
- it,
- DCI(setOf(dri), JavadocContentKind.OverviewSummary),
- sourceSets.toSet()
- ),
- dci = DCI(setOf(dri), JavadocContentKind.OverviewSummary),
- sourceSets = sourceSets.toDisplaySourceSets(),
- style = emptySet(),
- extra = PropertyContainer.empty()
- )
- }
- )
- }
-
- private fun Documentable.authorsToContentNodes(sourceSet: DokkaSourceSet? = highestJvmSourceSet) =
- allContentNodesFromType<Author>(sourceSet)
-
- private fun Documentable.sinceToContentNodes(sourceSet: DokkaSourceSet? = highestJvmSourceSet) =
- allContentNodesFromType<Since>(sourceSet)
-
- private fun Documentable.returnToContentNodes(sourceSet: DokkaSourceSet? = highestJvmSourceSet) =
- contentNodesFromType<Return>(sourceSet)
-}
-
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPlugin.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPlugin.kt
deleted file mode 100644
index 6a5749ab..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPlugin.kt
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.PackageListCreator
-import org.jetbrains.dokka.base.renderers.RootCreator
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.shared.PackageList.Companion.PACKAGE_LIST_NAME
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.javadoc.location.JavadocLocationProviderFactory
-import org.jetbrains.dokka.javadoc.pages.*
-import org.jetbrains.dokka.javadoc.renderer.KorteJavadocRenderer
-import org.jetbrains.dokka.javadoc.signatures.JavadocSignatureProvider
-import org.jetbrains.dokka.javadoc.transformers.documentables.JavadocDocumentableJVMSourceSetFilter
-import org.jetbrains.dokka.javadoc.validity.MultiplatformConfiguredChecker
-import org.jetbrains.dokka.kotlinAsJava.KotlinAsJavaPlugin
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.renderers.PostAction
-import org.jetbrains.dokka.renderers.Renderer
-import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jetbrains.dokka.validity.PreGenerationChecker
-
-public class JavadocPlugin : DokkaPlugin() {
-
- private val dokkaBasePlugin: DokkaBase by lazy { plugin<DokkaBase>() }
- private val kotinAsJavaPlugin: KotlinAsJavaPlugin by lazy { plugin<KotlinAsJavaPlugin>() }
-
- public val locationProviderFactory: ExtensionPoint<LocationProviderFactory> by lazy { dokkaBasePlugin.locationProviderFactory }
- public val javadocPreprocessors: ExtensionPoint<PageTransformer> by extensionPoint<PageTransformer>()
-
- public val dokkaJavadocPlugin: Extension<Renderer, *, *> by extending {
- CoreExtensions.renderer providing { ctx -> KorteJavadocRenderer(ctx, "views") } override dokkaBasePlugin.htmlRenderer
- }
-
- public val javadocMultiplatformCheck: Extension<PreGenerationChecker, *, *> by extending {
- CoreExtensions.preGenerationCheck providing ::MultiplatformConfiguredChecker
- }
-
- public val pageTranslator: Extension<DocumentableToPageTranslator, *, *> by extending {
- CoreExtensions.documentableToPageTranslator providing ::JavadocDocumentableToPageTranslator override
- kotinAsJavaPlugin.kotlinAsJavaDocumentableToPageTranslator
- }
-
- public val documentableSourceSetFilter: Extension<PreMergeDocumentableTransformer, *, *> by extending {
- dokkaBasePlugin.preMergeDocumentableTransformer providing ::JavadocDocumentableJVMSourceSetFilter
- }
-
- public val javadocLocationProviderFactory: Extension<LocationProviderFactory, *, *> by extending {
- dokkaBasePlugin.locationProviderFactory providing ::JavadocLocationProviderFactory override dokkaBasePlugin.locationProvider
- }
-
- public val javadocSignatureProvider: Extension<SignatureProvider, *, *> by extending {
- dokkaBasePlugin.signatureProvider providing ::JavadocSignatureProvider override kotinAsJavaPlugin.javaSignatureProvider
- }
-
- public val rootCreator: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors with RootCreator
- }
-
- public val packageListCreator: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors providing {
- PackageListCreator(
- context = it,
- format = RecognizedLinkFormat.DokkaJavadoc,
- outputFilesNames = listOf(PACKAGE_LIST_NAME, "element-list")
- )
- } order { after(rootCreator) }
- }
-
- public val resourcesInstaller: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors with ResourcesInstaller order { after(rootCreator) }
- }
-
- public val treeViewInstaller: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors providing ::TreeViewInstaller order { after(rootCreator) }
- }
-
- public val allClassessPageInstaller: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors with AllClassesPageInstaller order { before(rootCreator) }
- }
-
- public val indexGenerator: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors with IndexGenerator order { before(rootCreator) }
- }
-
- public val deprecatedPageCreator: Extension<PageTransformer, *, *> by extending {
- javadocPreprocessors with DeprecatedPageCreator order { before(rootCreator) }
- }
-
- internal val alphaVersionNotifier by extending {
- CoreExtensions.postActions providing { ctx ->
- PostAction {
- ctx.logger.info(
- "The Javadoc output format is still in Alpha so you may find bugs and experience migration " +
- "issues when using it. Successful integration with tools that accept Java's Javadoc " +
- "HTML as input is not guaranteed. You use it at your own risk."
- )
- }
- }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
-
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProvider.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProvider.kt
deleted file mode 100644
index 6de4c808..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProvider.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.location
-
-import org.jetbrains.dokka.base.resolvers.local.DefaultLocationProvider
-import org.jetbrains.dokka.javadoc.pages.*
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.Nullable
-import org.jetbrains.dokka.links.PointingToDeclaration
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.util.*
-
-public class JavadocLocationProvider(
- pageRoot: RootPageNode,
- dokkaContext: DokkaContext
-) : DefaultLocationProvider(pageRoot, dokkaContext) {
-
- private val pathIndex = IdentityHashMap<PageNode, List<String>>().apply {
- fun registerPath(page: PageNode, prefix: List<String> = emptyList()) {
- val packagePath = page.takeIf { it is JavadocPackagePageNode }?.name.orEmpty()
- .replace(".", "/")
- val newPathPrefix = prefix + packagePath
-
- val path = (prefix + when (page) {
- is AllClassesPage -> listOf("allclasses")
- is TreeViewPage -> if (page.classes == null)
- listOf("overview-tree")
- else
- listOf("package-tree")
- is ContentPage -> if (page.dri.isNotEmpty() && page.dri.first().classNames != null)
- listOfNotNull(page.dri.first().classNames)
- else if (page is JavadocPackagePageNode)
- listOf(packagePath, "package-summary")
- else if (page is IndexPage)
- listOf("index-files", page.name)
- else if (page is DeprecatedPage)
- listOf("deprecated")
- else
- listOf("index")
- else -> emptyList()
- }).filterNot { it.isEmpty() }
-
- put(page, path)
- page.children.forEach { registerPath(it, newPathPrefix) }
-
- }
- put(pageRoot, listOf("index"))
- pageRoot.children.forEach { registerPath(it) }
- }
-
- private val parentPageIndex = HashMap<DRI, PageNode>()
- private val nodeIndex = HashMap<DRI, PageNode>().apply {
- fun registerNode(node: PageNode) {
- if (node is ContentPage) put(node.dri.first(), node)
- (node as? JavadocClasslikePageNode)?.getAnchorables()?.forEach { navigableNode ->
- parentPageIndex[navigableNode.getDRI()] = node
- }
- node.children.forEach(::registerNode)
- }
- registerNode(pageRoot)
- }
-
- private operator fun IdentityHashMap<PageNode, List<String>>.get(dri: DRI) = this[nodeIndex[dri]]
-
- private fun List<String>.relativeTo(context: List<String>): String {
- val contextPath = context.dropLast(1).flatMap { it.split("/") }
- val commonPathElements = flatMap { it.split("/") }.zip(contextPath).takeWhile { (a, b) -> a == b }.count()
- return (List(contextPath.size - commonPathElements) { ".." } + this.flatMap { it.split("/") }.drop(commonPathElements)).joinToString("/")
- }
-
- private fun JavadocClasslikePageNode.findAnchorableByDRI(dri: DRI): AnchorableJavadocNode? =
- (constructors + methods + entries + properties).firstOrNull { it.dri == dri }
-
- override fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode?): String? =
- getLocalLocation(dri, context)
- ?: getLocalLocation(dri.copy(target = PointingToDeclaration), context)
- // Not found in PageGraph, that means it's an external link
- ?: getExternalLocation(dri, sourceSets)
- ?: getExternalLocation(dri.copy(target = PointingToDeclaration), sourceSets)
-
- private fun getLocalLocation(dri: DRI, context: PageNode?): String? =
- nodeIndex[dri]?.let { resolve(it, context) }
- ?: parentPageIndex[dri]?.let {
- val anchor = when (val anchorElement = (it as? JavadocClasslikePageNode)?.findAnchorableByDRI(dri)) {
- is JavadocFunctionNode -> anchorElement.getAnchor()
- is JavadocEntryNode -> anchorElement.name
- is JavadocPropertyNode -> anchorElement.name
- else -> anchorForDri(dri)
- }
- "${resolve(it, context, skipExtension = true)}.html#$anchor"
- }
-
- private fun anchorForDri(dri: DRI): String =
- dri.callable?.let { callable ->
- "${callable.name}(${
- callable.params.joinToString(",") {
- ((it as? Nullable)?.wrapped ?: it).toString()
- }
- })"
- } ?: dri.classNames.orEmpty()
-
- override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean): String {
- return pathIndex[node]?.relativeTo(pathIndex[context].orEmpty())?.let {
- if (skipExtension) it.removeSuffix(".html") else it
- } ?: run {
- throw IllegalStateException("Path for ${node::class.java.canonicalName}:${node.name} not found")
- }
- }
-
- public fun resolve(link: LinkJavadocListEntry, contextRoot: PageNode? = null, skipExtension: Boolean = true): String {
- return pathIndex[link.dri.first()]?.let {
- when (link.kind) {
- JavadocContentKind.Class -> it
- JavadocContentKind.OverviewSummary -> it.dropLast(1) + "index"
- JavadocContentKind.PackageSummary -> it.dropLast(1) + "package-summary"
- JavadocContentKind.AllClasses -> it.dropLast(1) + "allclasses"
- JavadocContentKind.OverviewTree -> it.dropLast(1) + "overview-tree"
- JavadocContentKind.PackageTree -> it.dropLast(1) + "package-tree"
- JavadocContentKind.IndexPage -> it.dropLast(1) + "index-1"
- else -> it
- }
- }?.relativeTo(pathIndex[contextRoot].orEmpty())?.let { if (skipExtension) "$it.html" else it }.orEmpty()
- }
-
- override fun pathToRoot(from: PageNode): String {
- TODO("Not yet implemented")
- }
-
- override fun ancestors(node: PageNode): List<PageNode> {
- TODO("Not yet implemented")
- }
-
- override fun expectedLocationForDri(dri: DRI): String {
- if (dri.packageName?.isNotEmpty() == true && dri.classNames == null)
- return (dri.packageName?.split(".").orEmpty() + "package-summary").joinToString("/")
-
- return (dri.packageName?.split(".").orEmpty() +
- dri.classNames?.split(".").orEmpty() // Top-level methods will always be relocated which is fine
- ).joinToString("/")
- }
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProviderFactory.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProviderFactory.kt
deleted file mode 100644
index 10e7d416..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationProviderFactory.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.location
-
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-
-public class JavadocLocationProviderFactory(
- private val context: DokkaContext
-) : LocationProviderFactory {
- override fun getLocationProvider(pageNode: RootPageNode): LocationProvider =
- JavadocLocationProvider(pageNode, context)
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt
deleted file mode 100644
index 427ad98e..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.pages
-
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.*
-
-public enum class JavadocContentKind : Kind {
- AllClasses, OverviewSummary, PackageSummary, Class, OverviewTree, PackageTree, IndexPage
-}
-
-public abstract class JavadocContentNode(
- dri: Set<DRI>,
- kind: Kind,
- override val sourceSets: Set<DisplaySourceSet>
-) : ContentNode {
- override val dci: DCI = DCI(dri, kind)
- override val style: Set<Style> = emptySet()
- override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
- override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode = this
-}
-
-public interface JavadocList {
- public val tabTitle: String
- public val colTitle: String
- public val children: List<JavadocListEntry>
-}
-
-public interface JavadocListEntry {
- public val stringTag: String
-}
-
-public data class EmptyNode(
- val dri: DRI,
- val kind: Kind,
- override val sourceSets: Set<DisplaySourceSet>,
- override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
-) : ContentNode {
- override val dci: DCI = DCI(setOf(dri), kind)
- override val style: Set<Style> = emptySet()
-
- override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): EmptyNode = copy(extra = newExtras)
-
- override fun withSourceSets(sourceSets: Set<DisplaySourceSet>): EmptyNode =
- copy(sourceSets = sourceSets)
-
- override fun hasAnyContent(): Boolean = false
-}
-
-public data class JavadocContentGroup(
- val dri: Set<DRI>,
- val kind: Kind,
- override val sourceSets: Set<DisplaySourceSet>,
- override val children: List<JavadocContentNode>
-) : JavadocContentNode(dri, kind, sourceSets) {
-
- public companion object {
- public operator fun invoke(
- dri: Set<DRI>,
- kind: Kind,
- sourceSets: Set<DisplaySourceSet>,
- block: JavaContentGroupBuilder.() -> Unit
- ): JavadocContentGroup =
- JavadocContentGroup(dri, kind, sourceSets, JavaContentGroupBuilder(sourceSets).apply(block).list)
- }
-
- override fun hasAnyContent(): Boolean = children.isNotEmpty()
-
- override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): JavadocContentGroup = this
-
- override fun withSourceSets(sourceSets: Set<DisplaySourceSet>): JavadocContentGroup =
- copy(sourceSets = sourceSets)
-}
-
-public class JavaContentGroupBuilder(
- public val sourceSets: Set<DisplaySourceSet>
-) {
- public val list: MutableList<JavadocContentNode> = mutableListOf<JavadocContentNode>()
-}
-
-public data class TitleNode(
- val title: String,
- val subtitle: List<ContentNode>,
- val version: String?,
- val parent: String?,
- val dri: Set<DRI>,
- val kind: Kind,
- override val sourceSets: Set<DisplaySourceSet>
-) : JavadocContentNode(dri, kind, sourceSets) {
- override fun hasAnyContent(): Boolean = title.isNotBlank() || !version.isNullOrBlank() || subtitle.isNotEmpty()
-
- override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): TitleNode = this
-
- override fun withSourceSets(sourceSets: Set<DisplaySourceSet>): TitleNode =
- copy(sourceSets = sourceSets)
-}
-
-public fun JavaContentGroupBuilder.title(
- title: String,
- subtitle: List<ContentNode>,
- version: String? = null,
- parent: String? = null,
- dri: Set<DRI>,
- kind: Kind
-) {
- list.add(TitleNode(title, subtitle, version, parent, dri, kind, sourceSets))
-}
-
-public data class RootListNode(
- val entries: List<LeafListNode>,
- val dri: Set<DRI>,
- val kind: Kind,
- override val sourceSets: Set<DisplaySourceSet>,
-) : JavadocContentNode(dri, kind, sourceSets) {
- override fun hasAnyContent(): Boolean = children.isNotEmpty()
-
-
- override fun withSourceSets(sourceSets: Set<DisplaySourceSet>): RootListNode =
- copy(sourceSets = sourceSets)
-}
-
-public data class LeafListNode(
- val tabTitle: String,
- val colTitle: String,
- val entries: List<JavadocListEntry>,
- val dri: Set<DRI>,
- val kind: Kind,
- override val sourceSets: Set<DisplaySourceSet>
-) : JavadocContentNode(dri, kind, sourceSets) {
- override fun hasAnyContent(): Boolean = children.isNotEmpty()
-
- override fun withSourceSets(sourceSets: Set<DisplaySourceSet>): LeafListNode = copy(sourceSets = sourceSets)
-}
-
-
-public fun JavaContentGroupBuilder.rootList(
- dri: Set<DRI>,
- kind: Kind,
- rootList: List<JavadocList>
-) {
- val children = rootList.map {
- LeafListNode(it.tabTitle, it.colTitle, it.children, dri, kind, sourceSets)
- }
- list.add(RootListNode(children, dri, kind, sourceSets))
-}
-
-public fun JavaContentGroupBuilder.leafList(
- dri: Set<DRI>,
- kind: Kind,
- leafList: JavadocList
-) {
- list.add(LeafListNode(leafList.tabTitle, leafList.colTitle, leafList.children, dri, kind, sourceSets))
-}
-
-public fun JavadocList(tabTitle: String, colTitle: String, children: List<JavadocListEntry>): JavadocList {
- return object : JavadocList {
- override val tabTitle = tabTitle
- override val colTitle = colTitle
- override val children = children
- }
-}
-
-public class LinkJavadocListEntry(
- public val name: String,
- public val dri: Set<DRI>,
- public val kind: Kind = ContentKind.Symbol,
- public val sourceSets: Set<DisplaySourceSet>
-) : JavadocListEntry {
- override val stringTag: String
- get() {
- return if (builtString == null) {
- throw IllegalStateException("stringTag for LinkJavadocListEntry accessed before build() call")
- } else {
- builtString!!
- }
- }
-
- private var builtString: String? = null
-
- public fun build(body: (String, Set<DRI>, Kind, List<DisplaySourceSet>) -> String) {
- builtString = body(name, dri, kind, sourceSets.toList())
- }
-}
-
-public data class RowJavadocListEntry(val link: LinkJavadocListEntry, val doc: List<ContentNode>) : JavadocListEntry {
- override val stringTag: String = ""
-}
-
-public data class JavadocSignatureContentNode(
- val dri: DRI,
- val kind: Kind = ContentKind.Symbol,
- val annotations: ContentNode?,
- val modifiers: ContentNode?,
- val signatureWithoutModifiers: ContentNode,
- val supertypes: ContentNode?
-) : JavadocContentNode(setOf(dri), kind, signatureWithoutModifiers.sourceSets) {
- override fun hasAnyContent(): Boolean = true
-
- override fun withSourceSets(sourceSets: Set<DisplaySourceSet>): JavadocSignatureContentNode {
- return copy(signatureWithoutModifiers = signatureWithoutModifiers.withSourceSets(sourceSets))
- }
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocIndexExtra.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocIndexExtra.kt
deleted file mode 100644
index 4ed0864a..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocIndexExtra.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.pages
-
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.ExtraProperty
-import org.jetbrains.dokka.pages.ContentNode
-
-public data class JavadocIndexExtra(val index: List<ContentNode>) : ExtraProperty<Documentable> {
- override val key: ExtraProperty.Key<Documentable, *> = JavadocIndexExtra
- public companion object : ExtraProperty.Key<Documentable, JavadocIndexExtra>
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocPageNodes.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocPageNodes.kt
deleted file mode 100644
index 3b5b63cc..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocPageNodes.kt
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.pages
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.analysis.kotlin.internal.InheritanceBuilder
-import org.jetbrains.dokka.analysis.kotlin.internal.InheritanceNode
-
-public interface JavadocPageNode : ContentPage, WithDocumentables
-
-public interface WithJavadocExtra<T : Documentable> : WithExtraProperties<T> {
- override fun withNewExtras(newExtras: PropertyContainer<T>): T =
- throw IllegalStateException("Merging extras is not applicable for javadoc")
-}
-
-public fun interface WithNavigable {
- public fun getAllNavigables(): List<NavigableJavadocNode>
-}
-
-public interface WithBrief {
- public val brief: List<ContentNode>
-}
-
-public class JavadocModulePageNode(
- override val name: String,
- override val content: JavadocContentNode,
- override val children: List<PageNode>,
- override val dri: Set<DRI>,
- override val extra: PropertyContainer<DModule> = PropertyContainer.empty()
-) :
- RootPageNode(),
- WithJavadocExtra<DModule>,
- NavigableJavadocNode,
- JavadocPageNode,
- ModulePage {
-
- override val documentables: List<Documentable> = emptyList()
- override val embeddedResources: List<String> = emptyList()
- override fun modified(name: String, children: List<PageNode>): RootPageNode =
- JavadocModulePageNode(name, content, children, dri, extra)
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage = JavadocModulePageNode(name, content as JavadocContentNode, children, dri, extra)
-
- override fun getId(): String = name
-
- override fun getDRI(): DRI = dri.first()
-}
-
-public class JavadocPackagePageNode(
- override val name: String,
- override val content: JavadocContentNode,
- override val dri: Set<DRI>,
-
- override val documentables: List<Documentable> = emptyList(),
- override val children: List<PageNode> = emptyList(),
- override val embeddedResources: List<String> = listOf()
-) : JavadocPageNode,
- WithNavigable,
- NavigableJavadocNode,
- PackagePage {
-
- init {
- require(name.isNotBlank()) { "Empty name is not supported " }
- }
-
- override fun getAllNavigables(): List<NavigableJavadocNode> =
- children.filterIsInstance<NavigableJavadocNode>().flatMap {
- if (it is WithNavigable) it.getAllNavigables()
- else listOf(it)
- }
-
- override fun modified(
- name: String,
- children: List<PageNode>
- ): PageNode = JavadocPackagePageNode(
- name,
- content,
- dri,
- documentables,
- children,
- embeddedResources
- )
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage =
- JavadocPackagePageNode(
- name,
- content as JavadocContentNode,
- dri,
- documentables,
- children,
- embeddedResources
- )
-
- override fun getId(): String = name
-
- override fun getDRI(): DRI = dri.first()
-}
-
-public interface NavigableJavadocNode {
- public fun getId(): String
- public fun getDRI(): DRI
-}
-
-public sealed class AnchorableJavadocNode(
- public open val name: String,
- public open val dri: DRI
-) : NavigableJavadocNode {
- override fun getId(): String = name
- override fun getDRI(): DRI = dri
-}
-
-public data class JavadocEntryNode(
- override val dri: DRI,
- override val name: String,
- val signature: JavadocSignatureContentNode,
- override val brief: List<ContentNode>,
- override val extra: PropertyContainer<DEnumEntry> = PropertyContainer.empty()
-) : AnchorableJavadocNode(name, dri), WithJavadocExtra<DEnumEntry>, WithBrief
-
-public data class JavadocParameterNode(
- override val dri: DRI,
- override val name: String,
- val type: ContentNode,
- val description: List<ContentNode>,
- val typeBound: Bound,
- override val extra: PropertyContainer<DParameter> = PropertyContainer.empty()
-) : AnchorableJavadocNode(name, dri), WithJavadocExtra<DParameter>
-
-public data class JavadocPropertyNode(
- override val dri: DRI,
- override val name: String,
- val signature: JavadocSignatureContentNode,
- override val brief: List<ContentNode>,
-
- override val extra: PropertyContainer<DProperty> = PropertyContainer.empty()
-) : AnchorableJavadocNode(name, dri), WithJavadocExtra<DProperty>, WithBrief
-
-public data class JavadocFunctionNode(
- val signature: JavadocSignatureContentNode,
- override val brief: List<ContentNode>,
- val description: List<ContentNode>,
- val parameters: List<JavadocParameterNode>,
-
- val returnTagContent: List<ContentNode>,
- val sinceTagContent: List<List<ContentNode>>,
-
- override val name: String,
- override val dri: DRI,
- override val extra: PropertyContainer<DFunction> = PropertyContainer.empty()
-) : AnchorableJavadocNode(name, dri), WithJavadocExtra<DFunction>, WithBrief {
- val isInherited: Boolean
- get() {
- val extra = extra[InheritedMember]
- return extra?.inheritedFrom?.keys?.firstOrNull { it.analysisPlatform == Platform.jvm }?.let { jvm ->
- extra.isInherited(jvm)
- } ?: false
- }
-}
-
-public class JavadocClasslikePageNode(
- override val name: String,
- override val content: JavadocContentNode,
- override val dri: Set<DRI>,
- public val signature: JavadocSignatureContentNode,
- public val description: List<ContentNode>,
- public val constructors: List<JavadocFunctionNode>,
- public val methods: List<JavadocFunctionNode>,
- public val entries: List<JavadocEntryNode>,
- public val classlikes: List<JavadocClasslikePageNode>,
- public val properties: List<JavadocPropertyNode>,
- override val brief: List<ContentNode>,
-
- public val sinceTagContent: List<List<ContentNode>>,
- public val authorTagContent: List<List<ContentNode>>,
-
- override val documentables: List<Documentable> = emptyList(),
- override val children: List<PageNode> = emptyList(),
- override val embeddedResources: List<String> = listOf(),
- override val extra: PropertyContainer<DClasslike> = PropertyContainer.empty(),
-) : JavadocPageNode, WithJavadocExtra<DClasslike>, NavigableJavadocNode, WithNavigable, WithBrief, ClasslikePage {
-
- override fun getAllNavigables(): List<NavigableJavadocNode> =
- methods + entries + classlikes.map { it.getAllNavigables() }.flatten() + this
-
- public fun getAnchorables(): List<AnchorableJavadocNode> =
- constructors + methods + entries + properties
-
- public val kind: String? = documentables.firstOrNull()?.kind()
- public val packageName: String? = dri.first().packageName
-
- override fun getId(): String = name
- override fun getDRI(): DRI = dri.first()
-
- override fun modified(
- name: String,
- children: List<PageNode>
- ): PageNode = JavadocClasslikePageNode(
- name,
- content,
- dri,
- signature,
- description,
- constructors,
- methods,
- entries,
- classlikes,
- properties,
- brief,
- sinceTagContent,
- authorTagContent,
- documentables,
- children,
- embeddedResources,
- extra
- )
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage =
- JavadocClasslikePageNode(
- name,
- content as JavadocContentNode,
- dri,
- signature,
- description,
- constructors,
- methods,
- entries,
- classlikes,
- properties,
- brief,
- sinceTagContent,
- authorTagContent,
- documentables,
- children,
- embeddedResources,
- extra
- )
-}
-
-public class AllClassesPage(
- public val classes: List<JavadocClasslikePageNode>
-) : JavadocPageNode {
- public val classEntries: List<LinkJavadocListEntry> =
- classes.map { LinkJavadocListEntry(it.name, it.dri, ContentKind.Classlikes, it.sourceSets().toSet()) }
-
- override val name: String = "All Classes"
- override val dri: Set<DRI> = setOf(DRI.topLevel)
-
- override val documentables: List<Documentable> = emptyList()
- override val embeddedResources: List<String> = emptyList()
-
- override val content: ContentNode =
- EmptyNode(
- DRI.topLevel,
- ContentKind.Classlikes,
- classes.flatMap { it.sourceSets() }.toSet()
- )
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage = this
-
- override fun modified(name: String, children: List<PageNode>): PageNode =
- this
-
- override val children: List<PageNode> = emptyList()
-
-}
-
-public class DeprecatedPage(
- public val elements: Map<DeprecatedPageSection, Set<DeprecatedNode>>,
- sourceSet: Set<DisplaySourceSet>
-) : JavadocPageNode {
- override val name: String = "deprecated"
- override val dri: Set<DRI> = setOf(DRI.topLevel)
- override val documentables: List<Documentable> = emptyList()
- override val children: List<PageNode> = emptyList()
- override val embeddedResources: List<String> = listOf()
-
- override val content: ContentNode = EmptyNode(
- DRI.topLevel,
- ContentKind.Main,
- sourceSet
- )
-
- override fun modified(
- name: String,
- children: List<PageNode>
- ): PageNode = this
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage = this
-
-}
-
-public class DeprecatedNode(
- public val name: String,
- public val address: DRI,
- public val description: List<ContentNode>
-) {
- override fun equals(other: Any?): Boolean =
- (other as? DeprecatedNode)?.address == address
-
- override fun hashCode(): Int = address.hashCode()
-}
-
-public enum class DeprecatedPageSection(
- public val id: String,
- public val caption: String,
- public val header: String,
-) {
- DeprecatedModules("module", "Modules", "Module"),
- DeprecatedInterfaces("interface", "Interfaces", "Interface"),
- DeprecatedClasses("class", "Classes", "Class"),
- DeprecatedExceptions("exception", "Exceptions", "Exceptions"),
- DeprecatedFields("field", "Fields", "Field"),
- DeprecatedMethods("method", "Methods", "Method"),
- DeprecatedConstructors("constructor", "Constructors", "Constructor"),
- DeprecatedEnums("enum", "Enums", "Enum"),
- DeprecatedEnumConstants("enum.constant", "Enum Constants", "Enum Constant"),
- DeprecatedForRemoval("forRemoval", "For Removal", "Element");
-
- internal fun getPosition() = ordinal
-}
-
-public class IndexPage(
- public val id: Int,
- public val elements: List<NavigableJavadocNode>,
- public val keys: List<Char>,
-
- sourceSet: Set<DisplaySourceSet>
-
-) : JavadocPageNode {
- override val name: String = "index-$id"
- override val dri: Set<DRI> = setOf(DRI.topLevel)
- override val documentables: List<Documentable> = emptyList()
- override val children: List<PageNode> = emptyList()
- override val embeddedResources: List<String> = listOf()
- public val title: String = "${keys[id - 1]}-index"
-
- override val content: ContentNode = EmptyNode(
- DRI.topLevel,
- ContentKind.Classlikes,
- sourceSet
- )
-
- override fun modified(
- name: String,
- children: List<PageNode>
- ): PageNode = this
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage = this
-
-}
-
-public class TreeViewPage(
- override val name: String,
- public val packages: List<JavadocPackagePageNode>?,
- public val classes: List<JavadocClasslikePageNode>?,
- override val dri: Set<DRI>,
- override val documentables: List<Documentable> = emptyList(),
- public val root: PageNode,
- public val inheritanceBuilder: InheritanceBuilder
-) : JavadocPageNode {
- init {
- assert(packages == null || classes == null)
- assert(packages != null || classes != null)
- }
-
- private val childrenDocumentables = root.children.filterIsInstance<WithDocumentables>().flatMap { node ->
- getDocumentableEntries(node)
- }.groupBy({ it.first }) { it.second }.map { (l, r) -> l to r.first() }.toMap()
-
- private val inheritanceTuple = generateInheritanceTree()
- internal val classGraph = inheritanceTuple.first
- internal val interfaceGraph = inheritanceTuple.second
-
- override val children: List<PageNode> = emptyList()
-
- public val title: String = when (documentables.firstOrNull()) {
- is DPackage -> "$name Class Hierarchy"
- else -> "All packages"
- }
-
- public val kind: String = when (documentables.firstOrNull()) {
- is DPackage -> "package"
- else -> "main"
- }
-
- override fun modified(
- name: String,
- content: ContentNode,
- dri: Set<DRI>,
- embeddedResources: List<String>,
- children: List<PageNode>
- ): ContentPage =
- TreeViewPage(
- name,
- packages = children.filterIsInstance<JavadocPackagePageNode>().takeIf { it.isNotEmpty() },
- classes = children.filterIsInstance<JavadocClasslikePageNode>().takeIf { it.isNotEmpty() },
- dri = dri,
- documentables,
- root = root,
- inheritanceBuilder
- )
-
- override fun modified(name: String, children: List<PageNode>): PageNode =
- TreeViewPage(
- name,
- packages = children.filterIsInstance<JavadocPackagePageNode>().takeIf { it.isNotEmpty() },
- classes = children.filterIsInstance<JavadocClasslikePageNode>().takeIf { it.isNotEmpty() },
- dri = dri,
- documentables,
- root = root,
- inheritanceBuilder
- )
-
- override val embeddedResources: List<String> = emptyList()
-
- override val content: ContentNode = EmptyNode(
- DRI.topLevel,
- ContentKind.Classlikes,
- emptySet()
- )
-
- private fun generateInheritanceTree(): Pair<List<InheritanceNode>, List<InheritanceNode>> {
- val mergeMap = mutableMapOf<DRI, InheritanceNode>()
-
- fun addToMap(info: InheritanceNode, map: MutableMap<DRI, InheritanceNode>) {
- if (map.containsKey(info.dri))
- map.computeIfPresent(info.dri) { _, info2 ->
- info.copy(children = (info.children + info2.children).distinct())
- }!!.children.forEach { addToMap(it, map) }
- else
- map[info.dri] = info
- }
-
- fun collect(dri: DRI): InheritanceNode =
- InheritanceNode(
- dri,
- mergeMap[dri]?.children.orEmpty().map { collect(it.dri) },
- mergeMap[dri]?.interfaces.orEmpty(),
- mergeMap[dri]?.isInterface ?: false
- )
-
- fun classTreeRec(node: InheritanceNode): List<InheritanceNode> = if (node.isInterface) {
- node.children.flatMap(::classTreeRec)
- } else {
- listOf(node.copy(children = node.children.flatMap(::classTreeRec)))
- }
-
- fun classTree(node: InheritanceNode) = classTreeRec(node).singleOrNull()
-
- fun interfaceTreeRec(node: InheritanceNode): List<InheritanceNode> = if (node.isInterface) {
- listOf(node.copy(children = node.children.filter { it.isInterface }))
- } else {
- node.children.flatMap(::interfaceTreeRec)
- }
-
- fun interfaceTree(node: InheritanceNode) = interfaceTreeRec(node).firstOrNull() // TODO.single()
-
- val inheritanceNodes = inheritanceBuilder.build(childrenDocumentables)
- inheritanceNodes.forEach { addToMap(it, mergeMap) }
-
- val rootNodes = mergeMap.entries.filter {
- it.key.classNames in setOf("Any", "Object") //TODO: Probably should be matched by DRI, not just className
- }.map {
- collect(it.value.dri)
- }
-
- return rootNodes.let { Pair(it.mapNotNull(::classTree), it.mapNotNull(::interfaceTree)) }
- }
-
- private fun getDocumentableEntries(node: WithDocumentables): List<Pair<DRI, Documentable>> =
- node.documentables.map { it.dri to it } +
- (node as? ContentPage)?.children?.filterIsInstance<WithDocumentables>()
- ?.flatMap(::getDocumentableEntries).orEmpty()
-
-}
-
-private fun Documentable.kind(): String? =
- when (this) {
- is DClass -> "class"
- is DEnum -> "enum"
- is DAnnotation -> "annotation"
- is DObject -> "object"
- is DInterface -> "interface"
- else -> null
- }
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/htmlPreprocessors.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/htmlPreprocessors.kt
deleted file mode 100644
index f54c41fd..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/htmlPreprocessors.kt
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.pages
-
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.base.transformers.documentables.deprecatedAnnotation
-import org.jetbrains.dokka.base.transformers.documentables.isDeprecated
-import org.jetbrains.dokka.base.transformers.documentables.isException
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.BooleanValue
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-public object ResourcesInstaller : PageTransformer {
-
- override fun invoke(input: RootPageNode): RootPageNode = input.modified(
- children = input.children +
- RendererSpecificResourcePage(
- "resourcePack",
- emptyList(),
- RenderingStrategy.Copy("/static_res")
- )
- )
-}
-
-public class TreeViewInstaller(
- private val context: DokkaContext
-) : PageTransformer {
-
- override fun invoke(input: RootPageNode): RootPageNode = install(input, input) as RootPageNode
-
- private fun install(node: PageNode, root: RootPageNode): PageNode = when (node) {
- is JavadocModulePageNode -> installOverviewTreeNode(node, root)
- is JavadocPackagePageNode -> installPackageTreeNode(node, root)
- else -> node
- }
-
- private fun installOverviewTreeNode(node: JavadocModulePageNode, root: RootPageNode): JavadocModulePageNode {
- val overviewTree = TreeViewPage(
- name = "Class Hierarchy",
- packages = node.children<JavadocPackagePageNode>().map { installPackageTreeNode(it, root) },
- classes = null,
- dri = node.dri,
- documentables = node.documentables,
- root = root,
- inheritanceBuilder = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { inheritanceBuilder }
- )
-
- val nodeChildren = node.children.map { childNode ->
- install(
- childNode,
- root
- )
- }
- return node.modified(children = nodeChildren + overviewTree) as JavadocModulePageNode
- }
-
- private fun installPackageTreeNode(node: JavadocPackagePageNode, root: RootPageNode): JavadocPackagePageNode {
- val packageTree = TreeViewPage(
- name = node.name,
- packages = null,
- classes = node.children.filterIsInstance<JavadocClasslikePageNode>(),
- dri = node.dri,
- documentables = node.documentables,
- root = root,
- inheritanceBuilder = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { inheritanceBuilder }
- )
-
- return node.modified(children = node.children + packageTree) as JavadocPackagePageNode
- }
-}
-
-public object AllClassesPageInstaller : PageTransformer {
-
- override fun invoke(input: RootPageNode): RootPageNode {
- val classes = (input as JavadocModulePageNode).children.filterIsInstance<JavadocPackagePageNode>().flatMap {
- it.children.filterIsInstance<JavadocClasslikePageNode>()
- }
-
- return input.modified(children = input.children + AllClassesPage(classes))
- }
-}
-
-public object IndexGenerator : PageTransformer {
-
- override fun invoke(input: RootPageNode): RootPageNode {
- val elements = HashMap<Char, MutableSet<NavigableJavadocNode>>()
- (input as JavadocModulePageNode).children.filterIsInstance<JavadocPackagePageNode>().forEach {
- it.getAllNavigables().forEach { d ->
- val name = when (d) {
- is JavadocPageNode -> d.name
- is AnchorableJavadocNode -> d.name
- else -> null
- }
- if (name != null && name.isNotBlank()) {
- elements.getOrPut(name[0].toUpperCase(), ::mutableSetOf).add(d)
- }
- }
- elements.getOrPut(it.name[0].toUpperCase(), ::mutableSetOf).add(it)
- }
- val keys = elements.keys.sortedBy { it }
- val sortedElements = elements.entries.sortedBy { (a, _) -> a }
-
- val indexNodeComparator = getIndexNodeComparator()
- val indexPages = sortedElements.mapIndexed { idx, (_, set) ->
- IndexPage(
- id = idx + 1,
- elements = set.sortedWith(indexNodeComparator),
- keys = keys,
- sourceSet = input.sourceSets()
- )
- }
- return input.modified(children = input.children + indexPages)
- }
-
- private fun getIndexNodeComparator(): Comparator<NavigableJavadocNode> {
- val driComparator = compareBy<DRI> { it.packageName }
- .thenBy { it.classNames }
- .thenBy { it.callable?.name.orEmpty() }
- .thenBy { it.callable?.signature().orEmpty() }
-
- return compareBy<NavigableJavadocNode> { it.getId().toLowerCase() }
- .thenBy(driComparator) { it.getDRI() }
- }
-}
-
-public object DeprecatedPageCreator : PageTransformer {
-
- override fun invoke(input: RootPageNode): RootPageNode {
- val elements = HashMap<DeprecatedPageSection, MutableSet<DeprecatedNode>>().apply {
-
- fun <T, V> T.putAs(deprecatedPageSection: DeprecatedPageSection) where
- T : NavigableJavadocNode,
- V : Documentable,
- T : WithJavadocExtra<V> {
- val deprecatedNode = DeprecatedNode(
- listOfNotNull(
- getDRI().packageName?.takeUnless { it.isBlank() },
- if (this is JavadocFunctionNode) getAnchor() else getId()
- ).joinToString("."),
- getDRI(),
- (this as? WithBrief)?.brief.orEmpty()
- )
- getOrPut(deprecatedPageSection) { mutableSetOf() }.add(deprecatedNode)
- if (deprecatedAnnotation?.params?.get("forRemoval") == BooleanValue(true)) {
- getOrPut(DeprecatedPageSection.DeprecatedForRemoval) { mutableSetOf() }.add(deprecatedNode)
- }
- }
-
- fun verifyDeprecation(node: NavigableJavadocNode) {
- when (node) {
- is JavadocModulePageNode -> {
- node.children.filterIsInstance<JavadocPackagePageNode>().forEach(::verifyDeprecation)
- node.takeIf { it.isDeprecated() }?.putAs(DeprecatedPageSection.DeprecatedModules)
- }
- is JavadocPackagePageNode ->
- node.children.filterIsInstance<NavigableJavadocNode>().forEach(::verifyDeprecation)
- is JavadocClasslikePageNode -> {
- node.classlikes.forEach(::verifyDeprecation)
- node.methods.forEach {
- it.takeIf { it.isDeprecated() }?.putAs(DeprecatedPageSection.DeprecatedMethods)
- }
- node.constructors.forEach {
- it.takeIf { it.isDeprecated() }?.putAs(DeprecatedPageSection.DeprecatedConstructors)
- }
- node.properties.forEach {
- it.takeIf { it.isDeprecated() }?.putAs(DeprecatedPageSection.DeprecatedFields)
- }
- node.entries.forEach {
- it.takeIf { it.isDeprecated() }?.putAs(DeprecatedPageSection.DeprecatedEnumConstants)
- }
- node.takeIf { it.isDeprecated() }?.putAs(
- if ((node as? WithJavadocExtra<*>)?.isException == true) DeprecatedPageSection.DeprecatedExceptions
- else when (node.kind) {
- "enum" -> DeprecatedPageSection.DeprecatedEnums
- "interface" -> DeprecatedPageSection.DeprecatedInterfaces
- else -> DeprecatedPageSection.DeprecatedClasses
- }
- )
- }
- }
- }
-
- verifyDeprecation(input as JavadocModulePageNode)
- }
- return input.modified(
- children = input.children + DeprecatedPage(
- elements,
- (input as JavadocModulePageNode).sourceSets()
- )
- )
- }
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt
deleted file mode 100644
index 70f71fab..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.pages
-
-import org.jetbrains.dokka.model.*
-
-/**
- * Returns an unencoded, unescaped function anchor.
- *
- * Should be URL encoded / HTML escaped at call site,
- * depending on usage.
- */
-// see the discussion in #2813 related to encoding/escaping this value for ids/hrefs
-internal fun JavadocFunctionNode.getAnchor(): String {
- val parameters = parameters.joinToString(",") { it.typeBound.asString() }
- return "$name($parameters)"
-}
-
-private fun Bound.asString(): String = when (this) {
- is Nullable -> this.inner.asString()
- is DefinitelyNonNullable -> this.inner.asString()
- is TypeConstructor -> listOf(this.dri.packageName, this.dri.classNames).joinToString(".")
- is TypeParameter -> this.name
- is PrimitiveJavaType -> this.name
- is UnresolvedBound -> this.name
- is TypeAliased -> this.typeAlias.asString()
- is JavaObject -> "Object"
-
- // Void bound is currently used for return type only,
- // which is not used in the anchor generation, but
- // the handling for it is added regardless, just in case.
- // Note: if you accept `Void` as a param, it'll be a TypeConstructor
- Void -> "void"
-
- // Javadoc format currently does not support multiplatform projects,
- // so in an ideal world we should not see Dynamic here, but someone
- // might disable the checker or the support for it might be added
- // by Dokka or another plugin, so the handling is added just in case.
- Dynamic -> "dynamic"
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToHtmlTranslator.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToHtmlTranslator.kt
deleted file mode 100644
index 7b54488a..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToHtmlTranslator.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.renderer
-
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.javadoc.pages.JavadocSignatureContentNode
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.utilities.formatToEndWithHtml
-import org.jetbrains.dokka.utilities.htmlEscape
-
-internal class JavadocContentToHtmlTranslator(
- private val locationProvider: LocationProvider,
- private val context: DokkaContext
-) {
-
- fun htmlForContentNode(node: ContentNode, relative: PageNode?): String =
- when (node) {
- is ContentGroup ->
- if (node.style.contains(TextStyle.Paragraph)) htmlForParagraph(node.children, relative)
- else htmlForContentNodes(node.children, relative)
- is ContentText -> htmlForText(node)
- is ContentDRILink -> buildLinkFromNode(node, relative)
- is ContentResolvedLink -> buildLinkFromNode(node, relative)
- is ContentCode -> htmlForCode(node, relative)
- is ContentList -> htmlForList(node.children, relative)
- is JavadocSignatureContentNode -> htmlForSignature(node, relative)
- is ContentBreakLine -> "<br>"
- else -> ""
- }
-
- private fun htmlForText(node: ContentText): String {
- val escapedText = node.text.htmlEscape()
- return when {
- node.style.contains(ContentStyle.InDocumentationAnchor) -> """<em><a id="$escapedText" class="searchTagResult">${escapedText}</a></em>"""
- node.style.contains(TextStyle.Bold) -> "<b>$escapedText</b>"
- node.style.contains(TextStyle.Italic) -> "<i>$escapedText</i>"
- node.style.contains(TextStyle.Strikethrough) -> "<del>$escapedText</del>"
- else -> node.text.htmlEscape()
- }
- }
-
- fun htmlForContentNodes(list: List<ContentNode>, relative: PageNode?) =
- list.joinToString(separator = "") { htmlForContentNode(it, relative) }
-
- private fun htmlForParagraph(nodes: List<ContentNode>, relative: PageNode?) =
- "<p>${htmlForContentNodes(nodes, relative)}</p>"
-
- private fun htmlForCode(code: ContentCode, relative: PageNode?): String {
- fun nodeToText(node: ContentNode, insidePre: Boolean = false): String = when (node) {
- is ContentText -> node.text.htmlEscape()
- is ContentBreakLine -> if(insidePre) "\n" else "<br>"
- is ContentDRILink -> buildLinkFromNode(node, relative)
- is ContentResolvedLink -> buildLinkFromNode(node, relative)
- is ContentCodeBlock -> "<pre><code>${node.children.joinToString("") { nodeToText(it, insidePre = true) }}</code></pre>"
- is ContentCodeInline -> "<code>${node.children.joinToString("") { nodeToText(it) }}</code>"
- else -> run { context.logger.error("Cannot cast $node as ContentText!"); "" }
- }
- return nodeToText(code)
- }
-
- private fun htmlForList(elements: List<ContentNode>, relative: PageNode?) =
- elements.filterIsInstance<ContentGroup>()
- .joinToString("", "<ul>", "</ul>") { "<li>${htmlForContentNode(it, relative)}</li>" }
-
- private fun htmlForSignature(node: JavadocSignatureContentNode, relative: PageNode?): String =
- listOfNotNull(
- node.annotations,
- node.modifiers,
- node.signatureWithoutModifiers,
- node.supertypes
- ).joinToString(separator = " ") { htmlForContentNode(it, relative) }
-
- private fun buildLinkFromNode(node: ContentDRILink, relative: PageNode?) =
- locationProvider.resolve(node.address, node.sourceSets, relative)?.let {
- buildLink(it, htmlForContentNodes(node.children, relative))
- } ?: htmlForContentNodes(node.children, relative)
-
- private fun buildLinkFromNode(node: ContentResolvedLink, relative: PageNode?) =
- buildLink(node.address, htmlForContentNodes(node.children, relative))
-
- companion object {
-
- fun buildLink(address: String, content: String) =
- """<a href=${address.formatToEndWithHtml()}>$content</a>"""
-
- }
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt
deleted file mode 100644
index 445a7708..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/JavadocContentToTemplateMapTranslator.kt
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.renderer
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.javadoc.location.JavadocLocationProvider
-import org.jetbrains.dokka.javadoc.pages.*
-import org.jetbrains.dokka.javadoc.toNormalized
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.parent
-import org.jetbrains.dokka.links.sureClassNames
-import org.jetbrains.dokka.model.ImplementedInterfaces
-import org.jetbrains.dokka.model.InheritedMember
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.utilities.formatToEndWithHtml
-import java.io.File
-import java.nio.file.Paths
-
-internal class JavadocContentToTemplateMapTranslator(
- private val locationProvider: JavadocLocationProvider,
- private val context: DokkaContext,
-) {
-
- fun templateMapForPageNode(node: JavadocPageNode): TemplateMap =
- mapOf(
- "docName" to "docName", // todo docname
- "pathToRoot" to pathToRoot(node),
- "contextRoot" to node,
- "kind" to "main",
- ) + templateMapForNode(node)
-
-
- private fun templateMapForNode(node: JavadocPageNode): TemplateMap =
- when (node) {
- is JavadocModulePageNode -> InnerTranslator(node).templateMapForJavadocContentNode(node.content)
- is JavadocClasslikePageNode -> InnerTranslator(node).templateMapForClasslikeNode(node)
- is JavadocPackagePageNode -> InnerTranslator(node).templateMapForPackagePageNode(node)
- is TreeViewPage -> InnerTranslator(node).templateMapForTreeViewPage(node)
- is AllClassesPage -> InnerTranslator(node).templateMapForAllClassesPage(node)
- is IndexPage -> InnerTranslator(node).templateMapForIndexPage(node)
- is DeprecatedPage -> InnerTranslator(node).templateMapForDeprecatedPage(node)
- else -> emptyMap()
- }
-
- private fun pathToRoot(node: JavadocPageNode): String {
- return when (node) {
- is JavadocModulePageNode -> ""
- else -> run {
- val link = locationProvider.resolve(node, skipExtension = true)
- val dir = Paths.get(link).parent?.toNormalized().orEmpty()
- return dir.split(File.separator).filter { it.isNotEmpty() }.joinToString("/") { ".." }.let {
- if (it.isNotEmpty()) "$it/" else it
- }
- }
- }
- }
-
- private inner class InnerTranslator(val contextNode: JavadocPageNode) {
-
- private val htmlTranslator = JavadocContentToHtmlTranslator(locationProvider, context)
-
- fun templateMapForAllClassesPage(node: AllClassesPage): TemplateMap =
- mapOf(
- "title" to "All Classes",
- "list" to node.classEntries
- )
-
- fun templateMapForIndexPage(node: IndexPage): TemplateMap =
- mapOf(
- "id" to node.id,
- "title" to node.title,
- "kind" to "indexPage",
- "prevLetter" to if (node.id > 1) "index-${node.id - 1}" else "",
- "nextLetter" to if (node.id < node.keys.size) "index-${node.id + 1}" else "",
- "dictionary" to node.keys,
- "elements" to node.elements.map { templateMapForIndexableNode(it) }
- )
-
- fun templateMapForDeprecatedPage(node: DeprecatedPage): TemplateMap =
- mapOf(
- "id" to node.name,
- "title" to "Deprecated",
- "kind" to "deprecated",
- "sections" to node.elements.toList().sortedBy { (section, _) -> section.getPosition() }
- .map { (s, e) -> templateMapForDeprecatedPageSection(s, e) }
- )
-
- fun templateMapForDeprecatedPageSection(
- section: DeprecatedPageSection,
- elements: Set<DeprecatedNode>
- ): TemplateMap =
- mapOf(
- "id" to section.id,
- "header" to section.header,
- "caption" to section.caption,
- "elements" to elements.map { node ->
- mapOf(
- "name" to node.name,
- "address" to locationProvider.resolve(node.address, contextNode.sourceSets(), contextNode)
- ?.formatToEndWithHtml().orEmpty(),
- "description" to htmlForContentNodes(node.description, contextNode)
- )
- }
- )
-
- fun templateMapForTreeViewPage(node: TreeViewPage): TemplateMap =
- mapOf(
- "title" to node.title,
- "name" to node.name,
- "kind" to node.kind,
- "list" to node.packages.orEmpty() + node.classes.orEmpty(),
- "classGraph" to node.classGraph,
- "interfaceGraph" to node.interfaceGraph
- )
-
- fun templateMapForPackagePageNode(node: JavadocPackagePageNode): TemplateMap = mapOf(
- "kind" to "package"
- ) + templateMapForJavadocContentNode(node.content)
-
- fun templateMapForFunctionNode(node: JavadocFunctionNode): TemplateMap = mapOf(
- "brief" to htmlForContentNodes(node.brief, contextNode),
- "description" to htmlForContentNodes(node.description,contextNode),
- "parameters" to node.parameters.map { templateMapForParameterNode(it) },
- "inlineParameters" to node.parameters.joinToString { renderInlineParameter(it) },
- "returnTagContent" to htmlForContentNodes(node.returnTagContent, contextNode),
- "sinceTagContent" to node.sinceTagContent.map { htmlForContentNodes(it, contextNode) },
- "anchorLink" to node.getAnchor(),
- "signature" to templateMapForSignatureNode(node.signature),
- "name" to node.name
- )
-
- fun templateMapForClasslikeNode(node: JavadocClasslikePageNode): TemplateMap =
- mapOf(
- "constructors" to node.constructors.map { templateMapForFunctionNode(it) },
- "signature" to templateMapForSignatureNode(node.signature),
- "methods" to templateMapForClasslikeMethods(node.methods),
- "classlikeDocumentation" to htmlForContentNodes(node.description, node),
- "entries" to node.entries.map { templateMapForEntryNode(it) },
- "properties" to node.properties.map { templateMapForPropertyNode(it) },
- "classlikes" to node.classlikes.map { templateMapForNestedClasslikeNode(it) },
- "implementedInterfaces" to templateMapForImplementedInterfaces(node).sorted(),
- "sinceTagContent" to node.sinceTagContent.map { htmlForContentNodes(it, contextNode) },
- "authorTagContent" to node.authorTagContent.map { htmlForContentNodes(it, contextNode) },
- "kind" to node.kind,
- "packageName" to node.packageName,
- "name" to node.name
- ) + templateMapForJavadocContentNode(node.content)
-
- fun templateMapForSignatureNode(node: JavadocSignatureContentNode): TemplateMap =
- mapOf(
- "annotations" to node.annotations?.let { htmlForContentNode(it, contextNode) },
- "signatureWithoutModifiers" to htmlForContentNode(node.signatureWithoutModifiers, contextNode),
- "modifiers" to node.modifiers?.let { htmlForContentNode(it, contextNode) },
- "supertypes" to node.supertypes?.let { htmlForContentNode(it, contextNode) }
- )
-
- private fun NavigableJavadocNode.typeForIndexable() = when (this) {
- is JavadocClasslikePageNode -> "class"
- is JavadocFunctionNode -> "function"
- is JavadocEntryNode -> "enum entry"
- is JavadocParameterNode -> "parameter"
- is JavadocPropertyNode -> "property"
- is JavadocPackagePageNode -> "package"
- else -> ""
- }
-
- fun templateMapForIndexableNode(node: NavigableJavadocNode): TemplateMap {
- val origin = node.getDRI().parent
- return mapOf(
- "address" to locationProvider.resolve(node.getDRI(), contextNode.sourceSets(), contextNode)
- ?.formatToEndWithHtml().orEmpty(),
- "type" to node.typeForIndexable(),
- "isMember" to (node !is JavadocPackagePageNode),
- "name" to if (node is JavadocFunctionNode) node.getAnchor() else node.getId(),
- "description" to ((node as? WithBrief)?.let {
- htmlForContentNodes(
- it.brief,
- contextNode
- ).takeIf { desc -> desc.isNotBlank() }
- } ?: "&nbsp;"),
- "origin" to origin.indexableOriginSignature(),
- )
- }
-
- private fun DRI.indexableOriginSignature(): String {
- val packageName = packageName?.takeIf { it.isNotBlank() }
- val className = classNames?.let {
- "<a href=${locationProvider.resolve(this, contextNode.sourceSets(), contextNode)
- ?.formatToEndWithHtml().orEmpty()}>$it</a>"
- }
- return listOfNotNull(packageName, className).joinToString(".")
- }
-
- fun templateMapForJavadocContentNode(node: JavadocContentNode): TemplateMap =
- when (node) {
- is TitleNode -> templateMapForTitleNode(node)
- is JavadocContentGroup -> templateMapForJavadocContentGroup(node)
- is LeafListNode -> templateMapForLeafListNode(node)
- is RootListNode -> templateMapForRootListNode(node)
- else -> emptyMap()
- }
-
- fun templateMapForJavadocContentNode(node: ContentNode): TemplateMap = (node as? JavadocContentNode)?.let { templateMapForJavadocContentNode(it) } ?: emptyMap()
-
- private fun templateMapForParameterNode(node: JavadocParameterNode): TemplateMap =
- mapOf(
- "description" to htmlForContentNodes(node.description, contextNode),
- "name" to node.name,
- "type" to htmlForContentNode(node.type, contextNode)
- )
-
- private fun templateMapForImplementedInterfaces(node: JavadocClasslikePageNode) =
- node.extra[ImplementedInterfaces]?.interfaces?.entries?.firstOrNull { it.key.analysisPlatform == Platform.jvm }?.value?.map { it.dri.displayable() } // TODO: REMOVE HARDCODED JVM DEPENDENCY
- .orEmpty()
-
- private fun templateMapForClasslikeMethods(nodes: List<JavadocFunctionNode>): TemplateMap {
- val (inherited, own) = nodes.partition { it.isInherited }
- return mapOf(
- "own" to own.map { templateMapForFunctionNode(it) },
- "inherited" to inherited.map { templateMapForInheritedMethod(it) }
- .groupBy { it["inheritedFrom"] as String }.entries.map {
- mapOf(
- "inheritedFrom" to it.key,
- "names" to it.value.map { it["name"] as String }.sorted().joinToString()
- )
- }
- )
- }
-
- private fun templateMapForInheritedMethod(node: JavadocFunctionNode): TemplateMap {
- val inheritedFrom = node.extra[InheritedMember]?.inheritedFrom
- return mapOf(
- "inheritedFrom" to inheritedFrom?.entries?.firstOrNull { it.key.analysisPlatform == Platform.jvm }?.value?.displayable() // TODO: REMOVE HARDCODED JVM DEPENDENCY
- .orEmpty(),
- "name" to node.name
- )
- }
-
- private fun templateMapForNestedClasslikeNode(node: JavadocClasslikePageNode): TemplateMap {
- return mapOf(
- "modifiers" to node.signature.modifiers?.let { htmlForContentNode(it, contextNode) },
- "signature" to node.name,
- "address" to locationProvider.resolve(
- contextNode.children.first { (it as? JavadocClasslikePageNode)?.dri?.first() == node.dri.first() },
- contextNode
- ).formatToEndWithHtml(),
- "description" to htmlForContentNodes(node.description, node)
- )
- }
-
- private fun templateMapForPropertyNode(node: JavadocPropertyNode): TemplateMap {
- return mapOf(
- "modifiers" to node.signature.modifiers?.let { htmlForContentNode(it, contextNode) },
- "signature" to htmlForContentNode(node.signature.signatureWithoutModifiers, contextNode),
- "description" to htmlForContentNodes(node.brief, contextNode)
- )
- }
-
- private fun templateMapForEntryNode(node: JavadocEntryNode): TemplateMap {
- return mapOf(
- "signature" to templateMapForSignatureNode(node.signature),
- "brief" to htmlForContentNodes(node.brief, contextNode)
- )
- }
-
- private fun templateMapForTitleNode(node: TitleNode): TemplateMap {
- return mapOf(
- "title" to node.title,
- "subtitle" to htmlForContentNodes(node.subtitle, contextNode),
- "version" to node.version,
- "packageName" to node.parent
- )
- }
-
- private fun templateMapForJavadocContentGroup(note: JavadocContentGroup): TemplateMap {
- return note.children.fold(emptyMap()) { map, child ->
- map + templateMapForJavadocContentNode(child)
- }
- }
-
- private fun templateMapForLeafListNode(node: LeafListNode): TemplateMap {
- return mapOf(
- "tabTitle" to node.tabTitle,
- "colTitle" to node.colTitle,
- "list" to node.entries
- )
- }
-
- private fun templateMapForRootListNode(node: RootListNode): TemplateMap {
- return mapOf(
- "lists" to node.entries.map { templateMapForLeafListNode(it) }
- )
- }
-
- private fun renderInlineParameter(parameter: JavadocParameterNode): String =
- htmlForContentNode(parameter.type, contextNode) + " ${parameter.name}"
-
- private fun htmlForContentNode(node: ContentNode, relativeNode: PageNode) =
- htmlTranslator.htmlForContentNode(node, relativeNode)
-
- private fun htmlForContentNodes(nodes: List<ContentNode>, relativeNode: PageNode) =
- htmlTranslator.htmlForContentNodes(nodes, relativeNode)
- }
-
- private fun DRI.displayable(): String = "${packageName}.${sureClassNames}"
-}
-
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/KorteJavadocRenderer.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/KorteJavadocRenderer.kt
deleted file mode 100644
index cfc4bb2a..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/KorteJavadocRenderer.kt
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.renderer
-
-import korlibs.template.*
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.OutputWriter
-import org.jetbrains.dokka.javadoc.JavadocPlugin
-import org.jetbrains.dokka.javadoc.location.JavadocLocationProvider
-import org.jetbrains.dokka.javadoc.pages.*
-import org.jetbrains.dokka.javadoc.renderer.JavadocContentToHtmlTranslator.Companion.buildLink
-import org.jetbrains.dokka.javadoc.toNormalized
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.pages.RendererSpecificPage
-import org.jetbrains.dokka.pages.RenderingStrategy
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.renderers.Renderer
-import org.jetbrains.dokka.analysis.kotlin.internal.InheritanceNode
-import java.time.LocalDate
-
-public typealias TemplateMap = Map<String, Any?>
-
-public class KorteJavadocRenderer(
- public val context: DokkaContext, resourceDir: String
-) : Renderer {
- private val outputWriter: OutputWriter = context.plugin<DokkaBase>().querySingle { outputWriter }
- private lateinit var locationProvider: JavadocLocationProvider
- private val registeredPreprocessors = context.plugin<JavadocPlugin>().query { javadocPreprocessors }
-
- private val contentToHtmlTranslator by lazy {
- JavadocContentToHtmlTranslator(locationProvider, context)
- }
-
- private val contentToTemplateMapTranslator by lazy {
- JavadocContentToTemplateMapTranslator(locationProvider, context)
- }
-
- override fun render(root: RootPageNode) {
- root.let { registeredPreprocessors.fold(root) { r, t -> t.invoke(r) } }.let { newRoot ->
- locationProvider = context.plugin<JavadocPlugin>().querySingle { locationProviderFactory }.getLocationProvider(newRoot) as JavadocLocationProvider
- runBlocking(Dispatchers.IO) {
- renderPage(newRoot)
- SearchScriptsCreator(locationProvider).invoke(newRoot).forEach { renderSpecificPage(it, "") }
- }
- }
- }
-
- private fun templateForNode(node: JavadocPageNode) = when (node) {
- is JavadocModulePageNode,
- is JavadocPackagePageNode -> "tabPage.korte"
- is JavadocClasslikePageNode -> "class.korte"
- is AllClassesPage -> "listPage.korte"
- is TreeViewPage -> "treePage.korte"
- is IndexPage -> "indexPage.korte"
- is DeprecatedPage -> "deprecated.korte"
- else -> ""
- }
-
- private fun CoroutineScope.renderPage(node: PageNode, path: String = "") {
- when(node){
- is JavadocModulePageNode -> renderModulePageNode(node)
- is JavadocPageNode -> renderJavadocPageNode(node)
- is RendererSpecificPage -> renderSpecificPage(node, path)
- }
- }
-
- private fun CoroutineScope.renderModulePageNode(node: JavadocModulePageNode) {
- val link = "."
- val name = "index"
-
- val contentMap = contentToTemplateMapTranslator.templateMapForPageNode(node)
-
- writeFromTemplate(outputWriter, "$link/$name".toNormalized(), "tabPage.korte", contentMap.toList())
- node.children.forEach { renderPage(it, link) }
- }
-
- private fun CoroutineScope.renderJavadocPageNode(node: JavadocPageNode) {
- val link = locationProvider.resolve(node, skipExtension = true)
- val contentMap = contentToTemplateMapTranslator.templateMapForPageNode(node)
- writeFromTemplate(outputWriter, link, templateForNode(node), contentMap.toList())
- node.children.forEach { renderPage(it, link.toNormalized()) }
- }
-
- private fun CoroutineScope.renderSpecificPage(node: RendererSpecificPage, path: String) = launch {
- when (val strategy = node.strategy) {
- is RenderingStrategy.Copy -> outputWriter.writeResources(strategy.from, "")
- is RenderingStrategy.Write -> outputWriter.writeHtml(node.name, strategy.text)
- is RenderingStrategy.Callback -> outputWriter.writeResources(
- path,
- strategy.instructions(this@KorteJavadocRenderer, node)
- )
- RenderingStrategy.DoNothing -> Unit
- }
- node.children.forEach { renderPage(it, locationProvider.resolve(node, skipExtension = true).toNormalized()) }
- }
-
- private fun Pair<String, String>.pairToTag() =
- """<th class="colFirst" scope="row">${first}</th><td class="colLast">${second}</td>"""
-
- private fun DRI.toLink(context: PageNode? = null) = locationProvider.resolve(this, emptySet(), context)
-
- private suspend fun OutputWriter.writeHtml(path: String, text: String) = write(path, text, "")
- private fun CoroutineScope.writeFromTemplate(
- writer: OutputWriter,
- path: String,
- template: String,
- args: List<Pair<String, *>>
- ) = launch {
- val tmp = templateRenderer.render(template, *(args.toTypedArray()))
- writer.writeHtml("$path.html", tmp)
- }
-
- private fun getTemplateConfig() = TemplateConfig().also { config ->
- listOf(
- TeFunction("curDate") { LocalDate.now() },
- TeFunction("jQueryVersion") { "3.6.0" },
- TeFunction("jQueryMigrateVersion") { "3.4.0" },
- TeFunction("rowColor") { args -> if ((args.first() as Int) % 2 == 0) "altColor" else "rowColor" },
- TeFunction("h1Title") { args -> if ((args.first() as? String) == "package") "title=\"Package\" " else "" },
- TeFunction("createTabRow") { args ->
- val (link, doc) = args.first() as RowJavadocListEntry
- val contextRoot = args[1] as PageNode?
- (buildLink(
- locationProvider.resolve(link, contextRoot),
- link.name
- ) to contentToHtmlTranslator.htmlForContentNodes(doc, contextRoot)).pairToTag().trim()
- },
- TeFunction("createListRow") { args ->
- val link = args.first() as LinkJavadocListEntry
- val contextRoot = args[1] as PageNode?
- buildLink(
- locationProvider.resolve(link, contextRoot),
- link.name
- )
- },
- TeFunction("createPackageHierarchy") { args ->
- @Suppress("UNCHECKED_CAST")
- val list = args.first() as List<JavadocPackagePageNode>
-
- list.mapIndexed { i, p ->
- val content = if (i + 1 == list.size) "" else ", "
- val name = p.name
- "<li><a href=\"$name/package-tree.html\">$name</a>$content</li>"
- }.joinToString("\n")
- },
- TeFunction("renderInheritanceGraph") { args ->
- @Suppress("UNCHECKED_CAST")
- val rootNodes = args.first() as List<InheritanceNode>
-
- fun drawRec(node: InheritanceNode): String =
- "<li class=\"circle\">" + node.dri.let { dri ->
- listOfNotNull(
- dri.packageName,
- dri.classNames
- ).joinToString(".") + node.interfaces.takeUnless { node.isInterface || it.isEmpty() }
- ?.let {
- " implements " + it.joinToString(", ") { n ->
- listOfNotNull(
- n.packageName,
- n.toLink()?.let{ buildLink(it, n.classNames.orEmpty()) } ?: n
- ).joinToString(".")
- }
- }.orEmpty()
- } + node.children.filterNot { it.isInterface }.takeUnless { it.isEmpty() }?.let {
- "<ul>" + it.joinToString("\n", transform = ::drawRec) + "</ul>"
- }.orEmpty() + "</li>"
-
- rootNodes.joinToString { drawRec(it) }
- },
- Filter("length") { subject.dynamicLength() },
- TeFunction("hasAnyDescription") { args ->
- @Suppress("UNCHECKED_CAST")
- val map = args.first() as? List<HashMap<String, String>>
- map?.any { it["description"]?.trim()?.isNotEmpty() ?: false }
- }
- ).forEach {
- when (it) {
- is TeFunction -> config.register(it)
- is Filter -> config.register(it)
- is Tag -> config.register(it)
- }
- }
- }
-
- private val config = getTemplateConfig()
- private val templateRenderer = Templates(
- ResourceTemplateProvider(
- resourceDir
- ), config = config, cache = true
- )
-
- private class ResourceTemplateProvider(val basePath: String) : TemplateProvider {
- override suspend fun get(template: String): String =
- javaClass.classLoader.getResourceAsStream("$basePath/$template")?.use { stream ->
- stream.bufferedReader()
- .lines()
- .toArray()
- .joinToString("\n")
- } ?: throw IllegalStateException("Template not found: $basePath/$template")
- }
-
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/SearchScriptsCreator.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/SearchScriptsCreator.kt
deleted file mode 100644
index af91a01d..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/renderer/SearchScriptsCreator.kt
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.renderer
-
-import org.jetbrains.dokka.base.renderers.sourceSets
-import org.jetbrains.dokka.base.resolvers.local.LocationProvider
-import org.jetbrains.dokka.base.resolvers.local.resolveOrThrow
-import org.jetbrains.dokka.javadoc.pages.*
-import org.jetbrains.dokka.javadoc.renderer.SearchRecord.Companion.allTypes
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.pages.*
-import org.jetbrains.dokka.utilities.formatToEndWithHtml
-
-public class SearchScriptsCreator(
- private val locationProvider: LocationProvider
-) {
-
- public fun invoke(input: RootPageNode): List<RendererSpecificPage> {
- val data = when (input) {
- is JavadocModulePageNode -> processModules(listOf(input))
- else -> processModules(input.children.filterIsInstance<JavadocModulePageNode>())
- }
- val serializer = SearchRecordJsonSerializer()
-
- val modules = RendererSpecificResourcePage(
- name = "module-search-index.js",
- children = emptyList(),
- strategy = RenderingStrategy.Write(serializer.serialize(data.moduleRecords, "moduleSearchIndex"))
- )
-
- val packages = RendererSpecificResourcePage(
- name = "package-search-index.js",
- children = emptyList(),
- strategy = RenderingStrategy.Write(serializer.serialize(data.packageRecords, "packageSearchIndex"))
- )
-
- val types = RendererSpecificResourcePage(
- name = "type-search-index.js",
- children = emptyList(),
- strategy = RenderingStrategy.Write(serializer.serialize(data.typeRecords, "typeSearchIndex"))
- )
-
- val members = RendererSpecificResourcePage(
- name = "member-search-index.js",
- children = emptyList(),
- strategy = RenderingStrategy.Write(serializer.serialize(data.memberRecords, "memberSearchIndex"))
- )
-
- val indexes = RendererSpecificResourcePage(
- name = "tag-search-index.js",
- children = emptyList(),
- strategy = RenderingStrategy.Write(serializer.serialize(data.searchIndexes, "tagSearchIndex"))
- )
-
- return listOf(modules, packages, types, members, indexes)
- }
-
- private fun processModules(input: List<JavadocModulePageNode>): SearchData {
- val modules = SearchData(moduleRecords = input.map {
- SearchRecord(
- l = it.name,
- url = locationProvider.resolveOrThrow(it).formatToEndWithHtml()
- )
- })
- val processablePackages = input.flatMap { it.children.filterIsInstance<JavadocPackagePageNode>() }
- return processPackages(processablePackages, modules)
- }
-
- private fun processPackages(input: List<JavadocPackagePageNode>, accumulator: SearchData): SearchData {
- val packages = input.map {
- SearchRecord(
- l = it.name,
- url = locationProvider.resolveOrThrow(it).formatToEndWithHtml()
- )
- } + SearchRecord.allPackages
- fun allClasses(c: JavadocClasslikePageNode): List<JavadocClasslikePageNode> =
- c.children.filterIsInstance<JavadocClasslikePageNode>().flatMap { allClasses(it) } + c
- val types = input.flatMap {
- it.children.filterIsInstance<JavadocClasslikePageNode>().flatMap { allClasses(it) }.map { classlike -> it to classlike }
- }
- val updated = accumulator.copy(packageRecords = packages)
- return processTypes(types, updated)
- }
-
- private fun processTypes(
- input: List<Pair<JavadocPackagePageNode, JavadocClasslikePageNode>>,
- accumulator: SearchData
- ): SearchData {
- val types = input.map {
- SearchRecord(
- p = it.first.name,
- l = it.second.name,
- url = locationProvider.resolveOrThrow(it.second).formatToEndWithHtml()
- )
- } + allTypes
- val updated = accumulator.copy(typeRecords = types)
- return processMembers(input, updated).copy(searchIndexes = indexSearchForClasslike(input))
- }
-
- private fun processMembers(
- input: List<Pair<JavadocPackagePageNode, JavadocClasslikePageNode>>,
- accumulator: SearchData
- ): SearchData {
- val functions = input.flatMap {
- (it.second.constructors + it.second.methods).withoutInherited().map { function ->
- SearchRecordCreator.function(
- packageName = it.first.name,
- classlikeName = it.second.name,
- input = function,
- url = locationProvider.resolveOrThrow(function.dri, it.first.sourceSets())
- )
- }
- }
-
- val properties = input.flatMap {
- it.second.properties.map { property ->
- SearchRecordCreator.property(
- packageName = it.first.name,
- classlikeName = it.second.name,
- property,
- locationProvider.resolveOrThrow(property.dri, it.first.sourceSets())
- )
- }
- }
-
- val entries = input.flatMap {
- it.second.entries.map { entry ->
- SearchRecordCreator.entry(
- packageName = it.first.name,
- classlikeName = it.second.name,
- entry,
- locationProvider.resolveOrThrow(entry.dri, it.first.sourceSets())
- )
- }
- }
-
- return accumulator.copy(memberRecords = functions + properties + entries)
- }
-
- private fun indexSearchForClasslike(
- input: List<Pair<JavadocPackagePageNode, JavadocClasslikePageNode>>,
- ): List<SearchRecord> {
- val indexesForClasslike = input.flatMap {
- val indexes = it.second.indexes()
- indexes.map { index ->
- val label = renderNode(index)
- SearchRecord(
- p = it.first.name,
- c = it.second.name,
- l = label,
- url = resolveUrlForSearchIndex(it.second.dri.first(), it.second.sourceSets(), label)
- )
- }
- }
-
- val indexesForMemberNodes = input.flatMap { packageWithClasslike ->
- (packageWithClasslike.second.constructors +
- packageWithClasslike.second.methods.withoutInherited() +
- packageWithClasslike.second.properties +
- packageWithClasslike.second.entries
- ).map { it to it.indexes() }
- .flatMap { entryWithIndex ->
- entryWithIndex.second.map {
- val label = renderNode(it)
- SearchRecord(
- p = packageWithClasslike.first.name,
- c = packageWithClasslike.second.name,
- l = label,
- url = resolveUrlForSearchIndex(
- entryWithIndex.first.dri,
- packageWithClasslike.second.sourceSets(),
- label
- )
- )
- }
- }
- }
-
- return indexesForClasslike + indexesForMemberNodes
- }
-
- private fun <T : Documentable> WithJavadocExtra<T>.indexes(): List<ContentNode> =
- extra[JavadocIndexExtra]?.index.orEmpty()
-
- private fun List<JavadocFunctionNode>.withoutInherited(): List<JavadocFunctionNode> = filter { !it.isInherited }
-
- private fun resolveUrlForSearchIndex(
- dri: DRI,
- sourceSets: Set<DisplaySourceSet>,
- label: String
- ): String =
- locationProvider.resolveOrThrow(dri, sourceSets).formatToEndWithHtml() + "#" + label
-}
-
-private data class SearchRecord(
- val p: String? = null,
- val c: String? = null,
- val l: String,
- val url: String? = null
-) {
- companion object {
- val allPackages = SearchRecord(l = "All packages", url = "index.html")
- val allTypes = SearchRecord(l = "All classes", url = "allclasses.html")
- }
-}
-
-private object SearchRecordCreator {
- fun function(
- packageName: String,
- classlikeName: String,
- input: JavadocFunctionNode,
- url: String
- ): SearchRecord =
- SearchRecord(
- p = packageName,
- c = classlikeName,
- l = input.name + input.parameters.joinToString(
- prefix = "(",
- postfix = ")"
- ) { renderNode(it.type) },
- url = url.formatToEndWithHtml()
- )
-
- fun property(
- packageName: String,
- classlikeName: String,
- input: JavadocPropertyNode,
- url: String
- ): SearchRecord =
- SearchRecord(
- p = packageName,
- c = classlikeName,
- l = input.name,
- url = url.formatToEndWithHtml()
- )
-
- fun entry(packageName: String, classlikeName: String, input: JavadocEntryNode, url: String): SearchRecord =
- SearchRecord(
- p = packageName,
- c = classlikeName,
- l = input.name,
- url = url.formatToEndWithHtml()
- )
-}
-
-private data class SearchData(
- val moduleRecords: List<SearchRecord> = emptyList(),
- val packageRecords: List<SearchRecord> = emptyList(),
- val typeRecords: List<SearchRecord> = emptyList(),
- val memberRecords: List<SearchRecord> = emptyList(),
- val searchIndexes: List<SearchRecord> = emptyList()
-)
-
-private class SearchRecordJsonSerializer {
- fun serialize(record: SearchRecord): String {
- val serialized = StringBuilder()
- serialized.append("{")
- with(record) {
- if (p != null) serialized.append("\"p\":\"$p\",")
- if (c != null) serialized.append("\"c\":\"$c\",")
- serialized.append("\"l\":\"$l\"")
- if (url != null) serialized.append(",\"url\":\"$url\"")
- }
- serialized.append("}")
- return serialized.toString()
- }
-
- fun serialize(records: List<SearchRecord>, variable: String): String =
- "var " + variable + " = " + records.joinToString(prefix = "[", postfix = "]") { serialize(it) }
-}
-
-private fun renderNode(node: ContentNode): String =
- when (node) {
- is ContentText -> node.text
- else -> node.children.joinToString(separator = "") { renderNode(it) }
- }
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/signatures/JavadocSignatureProvider.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/signatures/JavadocSignatureProvider.kt
deleted file mode 100644
index e3510686..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/signatures/JavadocSignatureProvider.kt
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.signatures
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.signatures.JvmSignatureUtils
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.javadoc.translators.documentables.JavadocPageContentBuilder
-import org.jetbrains.dokka.kotlinAsJava.signatures.JavaSignatureUtils
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.sureClassNames
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.DokkaLogger
-
-public class JavadocSignatureProvider(
- ctcc: CommentsToContentConverter,
- logger: DokkaLogger
-) : SignatureProvider, JvmSignatureUtils by JavaSignatureUtils {
-
- public constructor(context: DokkaContext) : this(
- context.plugin<DokkaBase>().querySingle { commentsToContentConverter },
- context.logger
- )
-
- private val contentBuilder = JavadocPageContentBuilder(ctcc, this, logger)
-
- private val ignoredVisibilities = setOf(JavaVisibility.Default)
-
- private val ignoredModifiers =
- setOf(KotlinModifier.Open, JavaModifier.Empty, KotlinModifier.Empty, KotlinModifier.Sealed)
-
- override fun signature(documentable: Documentable): List<ContentNode> = when (documentable) {
- is DFunction -> signature(documentable)
- is DProperty -> signature(documentable)
- is DClasslike -> signature(documentable)
- is DEnumEntry -> signature(documentable)
- is DTypeParameter -> signature(documentable)
- is DParameter -> signature(documentable)
- else -> throw NotImplementedError(
- "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}"
- )
- }
-
- private fun signature(c: DClasslike): List<ContentNode> =
- javadocSignature(c) {
- annotations {
- annotationsBlock(c)
- }
- modifiers {
- text(c.visibility[it]?.takeIf { it !in ignoredVisibilities }?.name?.plus(" ") ?: "")
-
- if (c is DClass) {
- text(c.modifier[it]?.takeIf { it !in ignoredModifiers }?.name?.plus(" ") ?: "")
- text(c.modifiers()[it]?.toSignatureString() ?: "")
- }
-
- when (c) {
- is DClass -> text("class")
- is DInterface -> text("interface")
- is DEnum -> text("enum")
- is DObject -> text("class")
- is DAnnotation -> text("@interface")
- }
- }
- signatureWithoutModifiers {
- link(c.dri.classNames!!, c.dri)
- if (c is WithGenerics) {
- list(c.generics, prefix = "<", suffix = ">") {
- +buildSignature(it)
- }
- }
- }
- supertypes {
- if (c is WithSupertypes) {
- c.supertypes.map { (p, dris) ->
- val (classes, interfaces) = dris.partition { it.kind == JavaClassKindTypes.CLASS }
- list(classes, prefix = "extends ", sourceSets = setOf(p)) {
- link(it.typeConstructor.dri.sureClassNames, it.typeConstructor.dri, sourceSets = setOf(p))
- list(it.typeConstructor.projections, prefix = "<", suffix = ">", sourceSets = setOf(p)) {
- signatureForProjection(it)
- }
- }
- list(interfaces, prefix = " implements ", sourceSets = setOf(p)){
- link(it.typeConstructor.dri.sureClassNames, it.typeConstructor.dri, sourceSets = setOf(p))
- list(it.typeConstructor.projections, prefix = "<", suffix = ">", sourceSets = setOf(p)) {
- signatureForProjection(it)
- }
- }
- }
- }
- }
- }
-
- private fun signature(f: DFunction): List<ContentNode> =
- javadocSignature(f) { sourceSet ->
- annotations {
- annotationsBlock(f)
- }
- modifiers {
- text(f.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.name?.plus(" ") ?: "")
- text(f.modifiers()[sourceSet]?.toSignatureString() ?: "")
- val usedGenerics = if (f.isConstructor) f.generics.filter { f uses it } else f.generics
- list(usedGenerics, prefix = "<", suffix = "> ") {
- +buildSignature(it)
- }
- signatureForProjection(f.type)
- }
- signatureWithoutModifiers {
- link(f.name, f.dri)
- text("(")
- list(f.parameters) {
- annotationsInline(it)
- text(it.modifiers()[sourceSet]?.toSignatureString().orEmpty())
- signatureForProjection(it.type)
- text(Typography.nbsp.toString())
- text(it.name.orEmpty())
- }
- text(")")
- }
- }
-
- private fun signature(p: DProperty): List<ContentNode> =
- javadocSignature(p) {
- annotations {
- annotationsBlock(p)
- }
- modifiers {
- text(p.visibility[it]?.takeIf { it !in ignoredVisibilities }?.name?.plus(" ") ?: "")
- text(p.modifier[it]?.name + " ")
- text(p.modifiers()[it]?.toSignatureString() ?: "")
- signatureForProjection(p.type)
- }
- signatureWithoutModifiers {
- link(p.name, p.dri)
- }
- }
-
- private fun signature(e: DEnumEntry): List<ContentNode> =
- javadocSignature(e) {
- annotations {
- annotationsBlock(e)
- }
- modifiers {
- text(e.modifiers()[it]?.toSignatureString() ?: "")
- }
- signatureWithoutModifiers {
- link(e.name, e.dri)
- }
- }
-
- private fun signature(t: DTypeParameter): List<ContentNode> =
- javadocSignature(t) {
- annotations {
- annotationsBlock(t)
- }
- signatureWithoutModifiers {
- text(t.name)
- }
- supertypes {
- list(t.bounds, prefix = "extends ") {
- signatureForProjection(it)
- }
- }
- }
-
- private fun signature(p: DParameter): List<ContentNode> =
- javadocSignature(p) {
- modifiers {
- signatureForProjection(p.type)
- }
- signatureWithoutModifiers {
- link(p.name.orEmpty(), p.dri)
- }
- }
-
- private fun javadocSignature(
- d: Documentable,
- extra: PropertyContainer<ContentNode> = PropertyContainer.empty(),
- block: JavadocPageContentBuilder.JavadocContentBuilder.(DokkaConfiguration.DokkaSourceSet) -> Unit
- ): List<ContentNode> =
- d.sourceSets.map { sourceSet ->
- contentBuilder.contentFor(d, ContentKind.Main) {
- with(contentBuilder) {
- javadocGroup(d.dri, d.sourceSets, extra) {
- block(sourceSet)
- }
- }
- }
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.signatureForProjection(p: Projection): Unit = when (p) {
- is TypeParameter -> link(p.name, p.dri)
- is TypeConstructor -> group {
- link(p.dri.classNames.orEmpty(), p.dri)
- list(p.projections, prefix = "<", suffix = ">") {
- signatureForProjection(it)
- }
- }
- is Variance<*> -> group {
- text("$p ".takeIf { it.isNotBlank() } ?: "")
- signatureForProjection(p.inner)
- }
- is Star -> text("?")
- is Nullable -> signatureForProjection(p.inner)
- is DefinitelyNonNullable -> signatureForProjection(p.inner)
- is JavaObject, is Dynamic -> link("Object", DRI("java.lang", "Object"))
- is Void -> text("void")
- is PrimitiveJavaType -> text(p.name)
- is UnresolvedBound -> text(p.name)
- is TypeAliased -> signatureForProjection(p.inner)
- }
-
- private fun DRI.fqName(): String = "${packageName.orEmpty()}.${classNames.orEmpty()}"
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilter.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilter.kt
deleted file mode 100644
index 0ab5280e..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilter.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.transformers.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
-
-public class JavadocDocumentableJVMSourceSetFilter(
- public val context: DokkaContext
-) : PreMergeDocumentableTransformer {
-
- private val allowedSourceSets = context.configuration.sourceSets.filter { it.analysisPlatform == Platform.jvm }
- .flatMap { it.getAllDependentSourceSets() }.distinct()
-
- private fun DokkaConfiguration.DokkaSourceSet.getAllDependentSourceSets(): List<DokkaConfiguration.DokkaSourceSet> =
- dependentSourceSets.flatMap { setId ->
- context.configuration.sourceSets.find { it.sourceSetID == setId }?.getAllDependentSourceSets().orEmpty()
- } + this
-
- override fun invoke(modules: List<DModule>): List<DModule> =
- modules.filter { module -> allowedSourceSets.containsAll(module.sourceSets) }
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder.kt
deleted file mode 100644
index 9746376b..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/translators/documentables/JavadocPageContentBuilder.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.translators.documentables
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.javadoc.pages.JavadocSignatureContentNode
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.utilities.DokkaLogger
-
-public class JavadocPageContentBuilder(
- commentsConverter: CommentsToContentConverter,
- signatureProvider: SignatureProvider,
- logger: DokkaLogger
-) : PageContentBuilder(commentsConverter, signatureProvider, logger) {
-
- public fun PageContentBuilder.DocumentableContentBuilder.javadocGroup(
- dri: DRI = mainDRI.first(),
- sourceSets: Set<DokkaConfiguration.DokkaSourceSet> = mainSourcesetData,
- extra: PropertyContainer<ContentNode> = mainExtra,
- block: JavadocContentBuilder.() -> Unit
- ) {
- +JavadocContentBuilder(
- mainDri = dri,
- mainExtra = extra,
- mainSourceSet = sourceSets,
- ).apply(block).build()
- }
-
- public open inner class JavadocContentBuilder(
- private val mainDri: DRI,
- private val mainExtra: PropertyContainer<ContentNode>,
- private val mainSourceSet: Set<DokkaConfiguration.DokkaSourceSet>,
- ) {
- public var annotations: ContentNode? = null
- public var modifiers: ContentNode? = null
- public var signatureWithoutModifiers: ContentNode? = null
- public var supertypes: ContentNode? = null
-
- public fun annotations(block: PageContentBuilder.DocumentableContentBuilder.() -> Unit) {
- val built = buildContentForBlock(block)
- if(built.hasAnyContent()) annotations = built
- }
-
- public fun modifiers(block: PageContentBuilder.DocumentableContentBuilder.() -> Unit) {
- val built = buildContentForBlock(block)
- if(built.hasAnyContent()) modifiers = built
- }
-
- public fun signatureWithoutModifiers(block: PageContentBuilder.DocumentableContentBuilder.() -> Unit) {
- signatureWithoutModifiers = buildContentForBlock(block)
- }
-
- public fun supertypes(block: PageContentBuilder.DocumentableContentBuilder.() -> Unit) {
- val built = buildContentForBlock(block)
- if(built.hasAnyContent()) supertypes = built
- }
-
- private fun buildContentForBlock(block: PageContentBuilder.DocumentableContentBuilder.() -> Unit) =
- contentFor(
- dri = mainDri,
- sourceSets = mainSourceSet,
- kind = ContentKind.Symbol,
- extra = mainExtra,
- block = block
- )
-
- public fun build(): JavadocSignatureContentNode = JavadocSignatureContentNode(
- dri = mainDri,
- annotations = annotations,
- modifiers = modifiers,
- signatureWithoutModifiers = signatureWithoutModifiers ?: throw IllegalStateException("JavadocSignatureContentNode should have at least a signature"),
- supertypes = supertypes
- )
- }
-}
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/utils.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/utils.kt
deleted file mode 100644
index 654f4391..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/utils.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import java.nio.file.Path
-import java.nio.file.Paths
-
-internal fun Path.toNormalized() = this.normalize().toFile().toString()
-
-internal fun String.toNormalized() = Paths.get(this).toNormalized()
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker.kt
deleted file mode 100644
index 7ecd6757..00000000
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredChecker.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.validity
-
-import org.jetbrains.dokka.Platform
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.validity.PreGenerationChecker
-import org.jetbrains.dokka.validity.PreGenerationCheckerOutput
-
-public class MultiplatformConfiguredChecker(
- public val context: DokkaContext
-) : PreGenerationChecker {
-
- override fun invoke(): PreGenerationCheckerOutput {
- val isSinglePlatform = context.configuration.sourceSets.all { sourceSet ->
- val platform = sourceSet.analysisPlatform
- (platform == Platform.jvm || platform == Platform.common)
- }
- return PreGenerationCheckerOutput(isSinglePlatform, listOfNotNull(errorMessage.takeUnless { isSinglePlatform }))
- }
-
- public companion object {
- public const val errorMessage: String =
- "Dokka Javadoc plugin currently does not support generating documentation for multiplatform project. Please, adjust your configuration"
- }
-}
diff --git a/plugins/javadoc/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/javadoc/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index b76dc3dc..00000000
--- a/plugins/javadoc/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.javadoc.JavadocPlugin
diff --git a/plugins/javadoc/src/main/resources/static_res/dokka-javadoc-stylesheet.css b/plugins/javadoc/src/main/resources/static_res/dokka-javadoc-stylesheet.css
deleted file mode 100644
index 267807e4..00000000
--- a/plugins/javadoc/src/main/resources/static_res/dokka-javadoc-stylesheet.css
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-pre.wrap-overflow {
- overflow-x: auto;
- white-space: pre-wrap;
- white-space: -moz-pre-wrap;
- word-wrap: break-word;
-}
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/external/jquery/jquery.js b/plugins/javadoc/src/main/resources/static_res/jquery/external/jquery/jquery.js
deleted file mode 100644
index fc6c299b..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/external/jquery/jquery.js
+++ /dev/null
@@ -1,10881 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.6.0
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright OpenJS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2021-03-02T17:08Z
- */
-( function( global, factory ) {
-
- "use strict";
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
-
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var flat = arr.flat ? function( array ) {
- return arr.flat.call( array );
-} : function( array ) {
- return arr.concat.apply( [], array );
-};
-
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-var isFunction = function isFunction( obj ) {
-
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
- // Plus for old WebKit, typeof returns "function" for HTML collections
- // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
- return typeof obj === "function" && typeof obj.nodeType !== "number" &&
- typeof obj.item !== "function";
- };
-
-
-var isWindow = function isWindow( obj ) {
- return obj != null && obj === obj.window;
- };
-
-
-var document = window.document;
-
-
-
- var preservedScriptAttributes = {
- type: true,
- src: true,
- nonce: true,
- noModule: true
- };
-
- function DOMEval( code, node, doc ) {
- doc = doc || document;
-
- var i, val,
- script = doc.createElement( "script" );
-
- script.text = code;
- if ( node ) {
- for ( i in preservedScriptAttributes ) {
-
- // Support: Firefox 64+, Edge 18+
- // Some browsers don't support the "nonce" property on scripts.
- // On the other hand, just using `getAttribute` is not enough as
- // the `nonce` attribute is reset to an empty string whenever it
- // becomes browsing-context connected.
- // See https://github.com/whatwg/html/issues/2369
- // See https://html.spec.whatwg.org/#nonce-attributes
- // The `node.getAttribute` check was added for the sake of
- // `jQuery.globalEval` so that it can fake a nonce-containing node
- // via an object.
- val = node[ i ] || node.getAttribute && node.getAttribute( i );
- if ( val ) {
- script.setAttribute( i, val );
- }
- }
- }
- doc.head.appendChild( script ).parentNode.removeChild( script );
- }
-
-
-function toType( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
-
- // Support: Android <=2.3 only (functionish RegExp)
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
-}
-/* global Symbol */
-// Defining this global in .eslintrc.json would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
-
-
-var
- version = "3.6.0",
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
-
- // The jQuery object is actually just the init constructor 'enhanced'
- // Need init if jQuery is called (just allow error to be thrown if not included)
- return new jQuery.fn.init( selector, context );
- };
-
-jQuery.fn = jQuery.prototype = {
-
- // The current version of jQuery being used
- jquery: version,
-
- constructor: jQuery,
-
- // The default length of a jQuery object is 0
- length: 0,
-
- toArray: function() {
- return slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
-
- // Return all the elements in a clean array
- if ( num == null ) {
- return slice.call( this );
- }
-
- // Return just the one element from the set
- return num < 0 ? this[ num + this.length ] : this[ num ];
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- each: function( callback ) {
- return jQuery.each( this, callback );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map( this, function( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ) );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- even: function() {
- return this.pushStack( jQuery.grep( this, function( _elem, i ) {
- return ( i + 1 ) % 2;
- } ) );
- },
-
- odd: function() {
- return this.pushStack( jQuery.grep( this, function( _elem, i ) {
- return i % 2;
- } ) );
- },
-
- eq: function( i ) {
- var len = this.length,
- j = +i + ( i < 0 ? len : 0 );
- return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
- },
-
- end: function() {
- return this.prevObject || this.constructor();
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: arr.sort,
- splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[ 0 ] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
-
- // Skip the boolean and the target
- target = arguments[ i ] || {};
- i++;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !isFunction( target ) ) {
- target = {};
- }
-
- // Extend jQuery itself if only one argument is passed
- if ( i === length ) {
- target = this;
- i--;
- }
-
- for ( ; i < length; i++ ) {
-
- // Only deal with non-null/undefined values
- if ( ( options = arguments[ i ] ) != null ) {
-
- // Extend the base object
- for ( name in options ) {
- copy = options[ name ];
-
- // Prevent Object.prototype pollution
- // Prevent never-ending loop
- if ( name === "__proto__" || target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
- ( copyIsArray = Array.isArray( copy ) ) ) ) {
- src = target[ name ];
-
- // Ensure proper type for the source value
- if ( copyIsArray && !Array.isArray( src ) ) {
- clone = [];
- } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
- clone = {};
- } else {
- clone = src;
- }
- copyIsArray = false;
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend( {
-
- // Unique for each copy of jQuery on the page
- expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
- // Assume jQuery is ready without the ready module
- isReady: true,
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- noop: function() {},
-
- isPlainObject: function( obj ) {
- var proto, Ctor;
-
- // Detect obvious negatives
- // Use toString instead of jQuery.type to catch host objects
- if ( !obj || toString.call( obj ) !== "[object Object]" ) {
- return false;
- }
-
- proto = getProto( obj );
-
- // Objects with no prototype (e.g., `Object.create( null )`) are plain
- if ( !proto ) {
- return true;
- }
-
- // Objects with prototype are plain iff they were constructed by a global Object function
- Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
- return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
- },
-
- isEmptyObject: function( obj ) {
- var name;
-
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- // Evaluates a script in a provided context; falls back to the global one
- // if not specified.
- globalEval: function( code, options, doc ) {
- DOMEval( code, { nonce: options && options.nonce }, doc );
- },
-
- each: function( obj, callback ) {
- var length, i = 0;
-
- if ( isArrayLike( obj ) ) {
- length = obj.length;
- for ( ; i < length; i++ ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- }
-
- return obj;
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var ret = results || [];
-
- if ( arr != null ) {
- if ( isArrayLike( Object( arr ) ) ) {
- jQuery.merge( ret,
- typeof arr === "string" ?
- [ arr ] : arr
- );
- } else {
- push.call( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- return arr == null ? -1 : indexOf.call( arr, elem, i );
- },
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- merge: function( first, second ) {
- var len = +second.length,
- j = 0,
- i = first.length;
-
- for ( ; j < len; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, invert ) {
- var callbackInverse,
- matches = [],
- i = 0,
- length = elems.length,
- callbackExpect = !invert;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- callbackInverse = !callback( elems[ i ], i );
- if ( callbackInverse !== callbackExpect ) {
- matches.push( elems[ i ] );
- }
- }
-
- return matches;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var length, value,
- i = 0,
- ret = [];
-
- // Go through the array, translating each of the items to their new values
- if ( isArrayLike( elems ) ) {
- length = elems.length;
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( i in elems ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
- }
-
- // Flatten any nested arrays
- return flat( ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // jQuery.support is not used in Core but other projects attach their
- // properties to it so it needs to exist.
- support: support
-} );
-
-if ( typeof Symbol === "function" ) {
- jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
- function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
- } );
-
-function isArrayLike( obj ) {
-
- // Support: real iOS 8.2 only (not reproducible in simulator)
- // `in` check used to prevent JIT error (gh-2145)
- // hasOwn isn't used here due to false negatives
- // regarding Nodelist length in IE
- var length = !!obj && "length" in obj && obj.length,
- type = toType( obj );
-
- if ( isFunction( obj ) || isWindow( obj ) ) {
- return false;
- }
-
- return type === "array" || length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.3.6
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://js.foundation/
- *
- * Date: 2021-02-16
- */
-( function( window ) {
-var i,
- support,
- Expr,
- getText,
- isXML,
- tokenize,
- compile,
- select,
- outermostContext,
- sortInput,
- hasDuplicate,
-
- // Local document vars
- setDocument,
- document,
- docElem,
- documentIsHTML,
- rbuggyQSA,
- rbuggyMatches,
- matches,
- contains,
-
- // Instance-specific data
- expando = "sizzle" + 1 * new Date(),
- preferredDoc = window.document,
- dirruns = 0,
- done = 0,
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
- nonnativeSelectorCache = createCache(),
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- }
- return 0;
- },
-
- // Instance methods
- hasOwn = ( {} ).hasOwnProperty,
- arr = [],
- pop = arr.pop,
- pushNative = arr.push,
- push = arr.push,
- slice = arr.slice,
-
- // Use a stripped-down indexOf as it's faster than native
- // https://jsperf.com/thor-indexof-vs-for/5
- indexOf = function( list, elem ) {
- var i = 0,
- len = list.length;
- for ( ; i < len; i++ ) {
- if ( list[ i ] === elem ) {
- return i;
- }
- }
- return -1;
- },
-
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
- "ismap|loop|multiple|open|readonly|required|scoped",
-
- // Regular expressions
-
- // http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
-
- // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
- identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
- "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
-
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-
- // Operator (capture 2)
- "*([*^$|!~]?=)" + whitespace +
-
- // "Attribute values must be CSS identifiers [capture 5]
- // or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
- whitespace + "*\\]",
-
- pseudos = ":(" + identifier + ")(?:\\((" +
-
- // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
- // 1. quoted (capture 3; capture 4 or capture 5)
- "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-
- // 2. simple (capture 6)
- "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-
- // 3. anything else (capture 2)
- ".*" +
- ")\\)|)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rwhitespace = new RegExp( whitespace + "+", "g" ),
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
- whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
- "*" ),
- rdescend = new RegExp( whitespace + "|>" ),
-
- rpseudo = new RegExp( pseudos ),
- ridentifier = new RegExp( "^" + identifier + "$" ),
-
- matchExpr = {
- "ID": new RegExp( "^#(" + identifier + ")" ),
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
- whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
- whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-
- // For use in libraries implementing .is()
- // We use this for POS matching in `select`
- "needsContext": new RegExp( "^" + whitespace +
- "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
- "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
- },
-
- rhtml = /HTML$/i,
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
- rnative = /^[^{]+\{\s*\[native \w/,
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
- rsibling = /[+~]/,
-
- // CSS escapes
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
- funescape = function( escape, nonHex ) {
- var high = "0x" + escape.slice( 1 ) - 0x10000;
-
- return nonHex ?
-
- // Strip the backslash prefix from a non-hex escape sequence
- nonHex :
-
- // Replace a hexadecimal escape sequence with the encoded Unicode code point
- // Support: IE <=11+
- // For values outside the Basic Multilingual Plane (BMP), manually construct a
- // surrogate pair
- high < 0 ?
- String.fromCharCode( high + 0x10000 ) :
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
- },
-
- // CSS string/identifier serialization
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
- fcssescape = function( ch, asCodePoint ) {
- if ( asCodePoint ) {
-
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
- if ( ch === "\0" ) {
- return "\uFFFD";
- }
-
- // Control characters and (dependent upon position) numbers get escaped as code points
- return ch.slice( 0, -1 ) + "\\" +
- ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
- }
-
- // Other potentially-special ASCII characters get backslash-escaped
- return "\\" + ch;
- },
-
- // Used for iframes
- // See setDocument()
- // Removing the function wrapper causes a "Permission Denied"
- // error in IE
- unloadHandler = function() {
- setDocument();
- },
-
- inDisabledFieldset = addCombinator(
- function( elem ) {
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
- },
- { dir: "parentNode", next: "legend" }
- );
-
-// Optimize for push.apply( _, NodeList )
-try {
- push.apply(
- ( arr = slice.call( preferredDoc.childNodes ) ),
- preferredDoc.childNodes
- );
-
- // Support: Android<4.0
- // Detect silently failing push.apply
- // eslint-disable-next-line no-unused-expressions
- arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
- push = { apply: arr.length ?
-
- // Leverage slice if possible
- function( target, els ) {
- pushNative.apply( target, slice.call( els ) );
- } :
-
- // Support: IE<9
- // Otherwise append directly
- function( target, els ) {
- var j = target.length,
- i = 0;
-
- // Can't trust NodeList.length
- while ( ( target[ j++ ] = els[ i++ ] ) ) {}
- target.length = j - 1;
- }
- };
-}
-
-function Sizzle( selector, context, results, seed ) {
- var m, i, elem, nid, match, groups, newSelector,
- newContext = context && context.ownerDocument,
-
- // nodeType defaults to 9, since context defaults to document
- nodeType = context ? context.nodeType : 9;
-
- results = results || [];
-
- // Return early from calls with invalid selector or context
- if ( typeof selector !== "string" || !selector ||
- nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
- return results;
- }
-
- // Try to shortcut find operations (as opposed to filters) in HTML documents
- if ( !seed ) {
- setDocument( context );
- context = context || document;
-
- if ( documentIsHTML ) {
-
- // If the selector is sufficiently simple, try using a "get*By*" DOM method
- // (excepting DocumentFragment context, where the methods don't exist)
- if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
-
- // ID selector
- if ( ( m = match[ 1 ] ) ) {
-
- // Document context
- if ( nodeType === 9 ) {
- if ( ( elem = context.getElementById( m ) ) ) {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
-
- // Element context
- } else {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( newContext && ( elem = newContext.getElementById( m ) ) &&
- contains( context, elem ) &&
- elem.id === m ) {
-
- results.push( elem );
- return results;
- }
- }
-
- // Type selector
- } else if ( match[ 2 ] ) {
- push.apply( results, context.getElementsByTagName( selector ) );
- return results;
-
- // Class selector
- } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
- context.getElementsByClassName ) {
-
- push.apply( results, context.getElementsByClassName( m ) );
- return results;
- }
- }
-
- // Take advantage of querySelectorAll
- if ( support.qsa &&
- !nonnativeSelectorCache[ selector + " " ] &&
- ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
-
- // Support: IE 8 only
- // Exclude object elements
- ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
-
- newSelector = selector;
- newContext = context;
-
- // qSA considers elements outside a scoping root when evaluating child or
- // descendant combinators, which is not what we want.
- // In such cases, we work around the behavior by prefixing every selector in the
- // list with an ID selector referencing the scope context.
- // The technique has to be used as well when a leading combinator is used
- // as such selectors are not recognized by querySelectorAll.
- // Thanks to Andrew Dupont for this technique.
- if ( nodeType === 1 &&
- ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
-
- // We can use :scope instead of the ID hack if the browser
- // supports it & if we're not changing the context.
- if ( newContext !== context || !support.scope ) {
-
- // Capture the context ID, setting it first if necessary
- if ( ( nid = context.getAttribute( "id" ) ) ) {
- nid = nid.replace( rcssescape, fcssescape );
- } else {
- context.setAttribute( "id", ( nid = expando ) );
- }
- }
-
- // Prefix every selector in the list
- groups = tokenize( selector );
- i = groups.length;
- while ( i-- ) {
- groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
- toSelector( groups[ i ] );
- }
- newSelector = groups.join( "," );
- }
-
- try {
- push.apply( results,
- newContext.querySelectorAll( newSelector )
- );
- return results;
- } catch ( qsaError ) {
- nonnativeSelectorCache( selector, true );
- } finally {
- if ( nid === expando ) {
- context.removeAttribute( "id" );
- }
- }
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- * deleting the oldest entry
- */
-function createCache() {
- var keys = [];
-
- function cache( key, value ) {
-
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
- if ( keys.push( key + " " ) > Expr.cacheLength ) {
-
- // Only keep the most recent entries
- delete cache[ keys.shift() ];
- }
- return ( cache[ key + " " ] = value );
- }
- return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
- fn[ expando ] = true;
- return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created element and returns a boolean result
- */
-function assert( fn ) {
- var el = document.createElement( "fieldset" );
-
- try {
- return !!fn( el );
- } catch ( e ) {
- return false;
- } finally {
-
- // Remove from its parent by default
- if ( el.parentNode ) {
- el.parentNode.removeChild( el );
- }
-
- // release memory in IE
- el = null;
- }
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
- var arr = attrs.split( "|" ),
- i = arr.length;
-
- while ( i-- ) {
- Expr.attrHandle[ arr[ i ] ] = handler;
- }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
- var cur = b && a,
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
- a.sourceIndex - b.sourceIndex;
-
- // Use IE sourceIndex if available on both nodes
- if ( diff ) {
- return diff;
- }
-
- // Check if b follows a
- if ( cur ) {
- while ( ( cur = cur.nextSibling ) ) {
- if ( cur === b ) {
- return -1;
- }
- }
- }
-
- return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return ( name === "input" || name === "button" ) && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for :enabled/:disabled
- * @param {Boolean} disabled true for :disabled; false for :enabled
- */
-function createDisabledPseudo( disabled ) {
-
- // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
- return function( elem ) {
-
- // Only certain elements can match :enabled or :disabled
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
- if ( "form" in elem ) {
-
- // Check for inherited disabledness on relevant non-disabled elements:
- // * listed form-associated elements in a disabled fieldset
- // https://html.spec.whatwg.org/multipage/forms.html#category-listed
- // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
- // * option elements in a disabled optgroup
- // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
- // All such elements have a "form" property.
- if ( elem.parentNode && elem.disabled === false ) {
-
- // Option elements defer to a parent optgroup if present
- if ( "label" in elem ) {
- if ( "label" in elem.parentNode ) {
- return elem.parentNode.disabled === disabled;
- } else {
- return elem.disabled === disabled;
- }
- }
-
- // Support: IE 6 - 11
- // Use the isDisabled shortcut property to check for disabled fieldset ancestors
- return elem.isDisabled === disabled ||
-
- // Where there is no isDisabled, check manually
- /* jshint -W018 */
- elem.isDisabled !== !disabled &&
- inDisabledFieldset( elem ) === disabled;
- }
-
- return elem.disabled === disabled;
-
- // Try to winnow out elements that can't be disabled before trusting the disabled property.
- // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
- // even exist on them, let alone have a boolean value.
- } else if ( "label" in elem ) {
- return elem.disabled === disabled;
- }
-
- // Remaining elements are neither :enabled nor :disabled
- return false;
- };
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
- return markFunction( function( argument ) {
- argument = +argument;
- return markFunction( function( seed, matches ) {
- var j,
- matchIndexes = fn( [], seed.length, argument ),
- i = matchIndexes.length;
-
- // Match elements found at the specified indexes
- while ( i-- ) {
- if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
- seed[ j ] = !( matches[ j ] = seed[ j ] );
- }
- }
- } );
- } );
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
- return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem && elem.namespaceURI,
- docElem = elem && ( elem.ownerDocument || elem ).documentElement;
-
- // Support: IE <=8
- // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
- // https://bugs.jquery.com/ticket/4833
- return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
- var hasCompare, subWindow,
- doc = node ? node.ownerDocument || node : preferredDoc;
-
- // Return early if doc is invalid or already selected
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
- return document;
- }
-
- // Update global variables
- document = doc;
- docElem = document.documentElement;
- documentIsHTML = !isXML( document );
-
- // Support: IE 9 - 11+, Edge 12 - 18+
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( preferredDoc != document &&
- ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
-
- // Support: IE 11, Edge
- if ( subWindow.addEventListener ) {
- subWindow.addEventListener( "unload", unloadHandler, false );
-
- // Support: IE 9 - 10 only
- } else if ( subWindow.attachEvent ) {
- subWindow.attachEvent( "onunload", unloadHandler );
- }
- }
-
- // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
- // Safari 4 - 5 only, Opera <=11.6 - 12.x only
- // IE/Edge & older browsers don't support the :scope pseudo-class.
- // Support: Safari 6.0 only
- // Safari 6.0 supports :scope but it's an alias of :root there.
- support.scope = assert( function( el ) {
- docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
- return typeof el.querySelectorAll !== "undefined" &&
- !el.querySelectorAll( ":scope fieldset div" ).length;
- } );
-
- /* Attributes
- ---------------------------------------------------------------------- */
-
- // Support: IE<8
- // Verify that getAttribute really returns attributes and not properties
- // (excepting IE8 booleans)
- support.attributes = assert( function( el ) {
- el.className = "i";
- return !el.getAttribute( "className" );
- } );
-
- /* getElement(s)By*
- ---------------------------------------------------------------------- */
-
- // Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert( function( el ) {
- el.appendChild( document.createComment( "" ) );
- return !el.getElementsByTagName( "*" ).length;
- } );
-
- // Support: IE<9
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
- // Support: IE<10
- // Check if getElementById returns elements by name
- // The broken getElementById methods don't pick up programmatically-set names,
- // so use a roundabout getElementsByName test
- support.getById = assert( function( el ) {
- docElem.appendChild( el ).id = expando;
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
- } );
-
- // ID filter and find
- if ( support.getById ) {
- Expr.filter[ "ID" ] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- return elem.getAttribute( "id" ) === attrId;
- };
- };
- Expr.find[ "ID" ] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var elem = context.getElementById( id );
- return elem ? [ elem ] : [];
- }
- };
- } else {
- Expr.filter[ "ID" ] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== "undefined" &&
- elem.getAttributeNode( "id" );
- return node && node.value === attrId;
- };
- };
-
- // Support: IE 6 - 7 only
- // getElementById is not reliable as a find shortcut
- Expr.find[ "ID" ] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var node, i, elems,
- elem = context.getElementById( id );
-
- if ( elem ) {
-
- // Verify the id attribute
- node = elem.getAttributeNode( "id" );
- if ( node && node.value === id ) {
- return [ elem ];
- }
-
- // Fall back on getElementsByName
- elems = context.getElementsByName( id );
- i = 0;
- while ( ( elem = elems[ i++ ] ) ) {
- node = elem.getAttributeNode( "id" );
- if ( node && node.value === id ) {
- return [ elem ];
- }
- }
- }
-
- return [];
- }
- };
- }
-
- // Tag
- Expr.find[ "TAG" ] = support.getElementsByTagName ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( tag );
-
- // DocumentFragment nodes don't have gEBTN
- } else if ( support.qsa ) {
- return context.querySelectorAll( tag );
- }
- } :
-
- function( tag, context ) {
- var elem,
- tmp = [],
- i = 0,
-
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
- results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- while ( ( elem = results[ i++ ] ) ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- };
-
- // Class
- Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
- return context.getElementsByClassName( className );
- }
- };
-
- /* QSA/matchesSelector
- ---------------------------------------------------------------------- */
-
- // QSA and matchesSelector support
-
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- rbuggyMatches = [];
-
- // qSa(:focus) reports false when true (Chrome 21)
- // We allow this because of a bug in IE8/9 that throws an error
- // whenever `document.activeElement` is accessed on an iframe
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
- // See https://bugs.jquery.com/ticket/13378
- rbuggyQSA = [];
-
- if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
-
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert( function( el ) {
-
- var input;
-
- // Select is set to empty string on purpose
- // This is to test IE's treatment of not explicitly
- // setting a boolean content attribute,
- // since its presence should be enough
- // https://bugs.jquery.com/ticket/12359
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
- "<option selected=''></option></select>";
-
- // Support: IE8, Opera 11-12.16
- // Nothing should be selected when empty strings follow ^= or $= or *=
- // The test attribute must be unknown in Opera but "safe" for WinRT
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
- }
-
- // Support: IE8
- // Boolean attributes and "value" are not treated correctly
- if ( !el.querySelectorAll( "[selected]" ).length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
- }
-
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push( "~=" );
- }
-
- // Support: IE 11+, Edge 15 - 18+
- // IE 11/Edge don't find elements on a `[name='']` query in some cases.
- // Adding a temporary attribute to the document before the selection works
- // around the issue.
- // Interestingly, IE 10 & older don't seem to have the issue.
- input = document.createElement( "input" );
- input.setAttribute( "name", "" );
- el.appendChild( input );
- if ( !el.querySelectorAll( "[name='']" ).length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
- whitespace + "*(?:''|\"\")" );
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here and will not see later tests
- if ( !el.querySelectorAll( ":checked" ).length ) {
- rbuggyQSA.push( ":checked" );
- }
-
- // Support: Safari 8+, iOS 8+
- // https://bugs.webkit.org/show_bug.cgi?id=136851
- // In-page `selector#id sibling-combinator selector` fails
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push( ".#.+[+~]" );
- }
-
- // Support: Firefox <=3.6 - 5 only
- // Old Firefox doesn't throw on a badly-escaped identifier.
- el.querySelectorAll( "\\\f" );
- rbuggyQSA.push( "[\\r\\n\\f]" );
- } );
-
- assert( function( el ) {
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
- "<select disabled='disabled'><option/></select>";
-
- // Support: Windows 8 Native Apps
- // The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement( "input" );
- input.setAttribute( "type", "hidden" );
- el.appendChild( input ).setAttribute( "name", "D" );
-
- // Support: IE8
- // Enforce case-sensitivity of name attribute
- if ( el.querySelectorAll( "[name=d]" ).length ) {
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here and will not see later tests
- if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Support: IE9-11+
- // IE's :disabled selector does not pick up the children of disabled fieldsets
- docElem.appendChild( el ).disabled = true;
- if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Support: Opera 10 - 11 only
- // Opera 10-11 does not throw on post-comma invalid pseudos
- el.querySelectorAll( "*,:x" );
- rbuggyQSA.push( ",.*:" );
- } );
- }
-
- if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
- docElem.webkitMatchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector ) ) ) ) {
-
- assert( function( el ) {
-
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- support.disconnectedMatch = matches.call( el, "*" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( el, "[s!='']:x" );
- rbuggyMatches.push( "!=", pseudos );
- } );
- }
-
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
-
- /* Contains
- ---------------------------------------------------------------------- */
- hasCompare = rnative.test( docElem.compareDocumentPosition );
-
- // Element contains another
- // Purposefully self-exclusive
- // As in, an element does not contain itself
- contains = hasCompare || rnative.test( docElem.contains ) ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && (
- adown.contains ?
- adown.contains( bup ) :
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ) );
- } :
- function( a, b ) {
- if ( b ) {
- while ( ( b = b.parentNode ) ) {
- if ( b === a ) {
- return true;
- }
- }
- }
- return false;
- };
-
- /* Sorting
- ---------------------------------------------------------------------- */
-
- // Document order sorting
- sortOrder = hasCompare ?
- function( a, b ) {
-
- // Flag for duplicate removal
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- // Sort on method existence if only one input has compareDocumentPosition
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
- if ( compare ) {
- return compare;
- }
-
- // Calculate position if both inputs belong to the same document
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
- a.compareDocumentPosition( b ) :
-
- // Otherwise we know they are disconnected
- 1;
-
- // Disconnected nodes
- if ( compare & 1 ||
- ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
-
- // Choose the first element that is related to our preferred document
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( a == document || a.ownerDocument == preferredDoc &&
- contains( preferredDoc, a ) ) {
- return -1;
- }
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( b == document || b.ownerDocument == preferredDoc &&
- contains( preferredDoc, b ) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
- } :
- function( a, b ) {
-
- // Exit early if the nodes are identical
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- var cur,
- i = 0,
- aup = a.parentNode,
- bup = b.parentNode,
- ap = [ a ],
- bp = [ b ];
-
- // Parentless nodes are either documents or disconnected
- if ( !aup || !bup ) {
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- /* eslint-disable eqeqeq */
- return a == document ? -1 :
- b == document ? 1 :
- /* eslint-enable eqeqeq */
- aup ? -1 :
- bup ? 1 :
- sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
-
- // If the nodes are siblings, we can do a quick check
- } else if ( aup === bup ) {
- return siblingCheck( a, b );
- }
-
- // Otherwise we need full lists of their ancestors for comparison
- cur = a;
- while ( ( cur = cur.parentNode ) ) {
- ap.unshift( cur );
- }
- cur = b;
- while ( ( cur = cur.parentNode ) ) {
- bp.unshift( cur );
- }
-
- // Walk down the tree looking for a discrepancy
- while ( ap[ i ] === bp[ i ] ) {
- i++;
- }
-
- return i ?
-
- // Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[ i ], bp[ i ] ) :
-
- // Otherwise nodes in our document sort first
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- /* eslint-disable eqeqeq */
- ap[ i ] == preferredDoc ? -1 :
- bp[ i ] == preferredDoc ? 1 :
- /* eslint-enable eqeqeq */
- 0;
- };
-
- return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- setDocument( elem );
-
- if ( support.matchesSelector && documentIsHTML &&
- !nonnativeSelectorCache[ expr + " " ] &&
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
-
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || support.disconnectedMatch ||
-
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch ( e ) {
- nonnativeSelectorCache( expr, true );
- }
- }
-
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-
- // Set document vars if needed
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( ( context.ownerDocument || context ) != document ) {
- setDocument( context );
- }
- return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-
- // Set document vars if needed
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( ( elem.ownerDocument || elem ) != document ) {
- setDocument( elem );
- }
-
- var fn = Expr.attrHandle[ name.toLowerCase() ],
-
- // Don't get fooled by Object.prototype properties (jQuery #13807)
- val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
- fn( elem, name, !documentIsHTML ) :
- undefined;
-
- return val !== undefined ?
- val :
- support.attributes || !documentIsHTML ?
- elem.getAttribute( name ) :
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
- val.value :
- null;
-};
-
-Sizzle.escape = function( sel ) {
- return ( sel + "" ).replace( rcssescape, fcssescape );
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
- var elem,
- duplicates = [],
- j = 0,
- i = 0;
-
- // Unless we *know* we can detect duplicates, assume their presence
- hasDuplicate = !support.detectDuplicates;
- sortInput = !support.sortStable && results.slice( 0 );
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- while ( ( elem = results[ i++ ] ) ) {
- if ( elem === results[ i ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- results.splice( duplicates[ j ], 1 );
- }
- }
-
- // Clear input after sorting to release objects
- // See https://github.com/jquery/sizzle/pull/225
- sortInput = null;
-
- return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( !nodeType ) {
-
- // If no nodeType, this is expected to be an array
- while ( ( node = elem[ i++ ] ) ) {
-
- // Do not traverse comment nodes
- ret += getText( node );
- }
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (jQuery #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
-
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
-
- // Do not include comment or processing instruction nodes
-
- return ret;
-};
-
-Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- createPseudo: markFunction,
-
- match: matchExpr,
-
- attrHandle: {},
-
- find: {},
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[ 1 ] = match[ 1 ].replace( runescape, funescape );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
- match[ 5 ] || "" ).replace( runescape, funescape );
-
- if ( match[ 2 ] === "~=" ) {
- match[ 3 ] = " " + match[ 3 ] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
-
- /* matches from matchExpr["CHILD"]
- 1 type (only|nth|...)
- 2 what (child|of-type)
- 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 4 xn-component of xn+y argument ([+-]?\d*n|)
- 5 sign of xn-component
- 6 x of xn-component
- 7 sign of y-component
- 8 y of y-component
- */
- match[ 1 ] = match[ 1 ].toLowerCase();
-
- if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
-
- // nth-* requires argument
- if ( !match[ 3 ] ) {
- Sizzle.error( match[ 0 ] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[ 4 ] = +( match[ 4 ] ?
- match[ 5 ] + ( match[ 6 ] || 1 ) :
- 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
- match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[ 3 ] ) {
- Sizzle.error( match[ 0 ] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var excess,
- unquoted = !match[ 6 ] && match[ 2 ];
-
- if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
- return null;
- }
-
- // Accept quoted arguments as-is
- if ( match[ 3 ] ) {
- match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
-
- // Strip excess characters from unquoted arguments
- } else if ( unquoted && rpseudo.test( unquoted ) &&
-
- // Get excess from tokenize (recursively)
- ( excess = tokenize( unquoted, true ) ) &&
-
- // advance to the next closing parenthesis
- ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
-
- // excess is a negative index
- match[ 0 ] = match[ 0 ].slice( 0, excess );
- match[ 2 ] = unquoted.slice( 0, excess );
- }
-
- // Return only captures needed by the pseudo filter method (type and argument)
- return match.slice( 0, 3 );
- }
- },
-
- filter: {
-
- "TAG": function( nodeNameSelector ) {
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
- return nodeNameSelector === "*" ?
- function() {
- return true;
- } :
- function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ className + " " ];
-
- return pattern ||
- ( pattern = new RegExp( "(^|" + whitespace +
- ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
- className, function( elem ) {
- return pattern.test(
- typeof elem.className === "string" && elem.className ||
- typeof elem.getAttribute !== "undefined" &&
- elem.getAttribute( "class" ) ||
- ""
- );
- } );
- },
-
- "ATTR": function( name, operator, check ) {
- return function( elem ) {
- var result = Sizzle.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- /* eslint-disable max-len */
-
- return operator === "=" ? result === check :
- operator === "!=" ? result !== check :
- operator === "^=" ? check && result.indexOf( check ) === 0 :
- operator === "*=" ? check && result.indexOf( check ) > -1 :
- operator === "$=" ? check && result.slice( -check.length ) === check :
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
- false;
- /* eslint-enable max-len */
-
- };
- },
-
- "CHILD": function( type, what, _argument, first, last ) {
- var simple = type.slice( 0, 3 ) !== "nth",
- forward = type.slice( -4 ) !== "last",
- ofType = what === "of-type";
-
- return first === 1 && last === 0 ?
-
- // Shortcut for :nth-*(n)
- function( elem ) {
- return !!elem.parentNode;
- } :
-
- function( elem, _context, xml ) {
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
- dir = simple !== forward ? "nextSibling" : "previousSibling",
- parent = elem.parentNode,
- name = ofType && elem.nodeName.toLowerCase(),
- useCache = !xml && !ofType,
- diff = false;
-
- if ( parent ) {
-
- // :(first|last|only)-(child|of-type)
- if ( simple ) {
- while ( dir ) {
- node = elem;
- while ( ( node = node[ dir ] ) ) {
- if ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) {
-
- return false;
- }
- }
-
- // Reverse direction for :only-* (if we haven't yet done so)
- start = dir = type === "only" && !start && "nextSibling";
- }
- return true;
- }
-
- start = [ forward ? parent.firstChild : parent.lastChild ];
-
- // non-xml :nth-child(...) stores cache data on `parent`
- if ( forward && useCache ) {
-
- // Seek `elem` from a previously-cached index
-
- // ...in a gzip-friendly way
- node = parent;
- outerCache = node[ expando ] || ( node[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- ( outerCache[ node.uniqueID ] = {} );
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex && cache[ 2 ];
- node = nodeIndex && parent.childNodes[ nodeIndex ];
-
- while ( ( node = ++nodeIndex && node && node[ dir ] ||
-
- // Fallback to seeking `elem` from the start
- ( diff = nodeIndex = 0 ) || start.pop() ) ) {
-
- // When found, cache indexes on `parent` and break
- if ( node.nodeType === 1 && ++diff && node === elem ) {
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
- break;
- }
- }
-
- } else {
-
- // Use previously-cached element index if available
- if ( useCache ) {
-
- // ...in a gzip-friendly way
- node = elem;
- outerCache = node[ expando ] || ( node[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- ( outerCache[ node.uniqueID ] = {} );
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex;
- }
-
- // xml :nth-child(...)
- // or :nth-last-child(...) or :nth(-last)?-of-type(...)
- if ( diff === false ) {
-
- // Use the same loop as above to seek `elem` from the start
- while ( ( node = ++nodeIndex && node && node[ dir ] ||
- ( diff = nodeIndex = 0 ) || start.pop() ) ) {
-
- if ( ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) &&
- ++diff ) {
-
- // Cache the index of each encountered element
- if ( useCache ) {
- outerCache = node[ expando ] ||
- ( node[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- ( outerCache[ node.uniqueID ] = {} );
-
- uniqueCache[ type ] = [ dirruns, diff ];
- }
-
- if ( node === elem ) {
- break;
- }
- }
- }
- }
- }
-
- // Incorporate the offset, then check against cycle size
- diff -= last;
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument ) {
-
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- // Remember that setFilters inherits from pseudos
- var args,
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
- Sizzle.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as Sizzle does
- if ( fn[ expando ] ) {
- return fn( argument );
- }
-
- // But maintain support for old signatures
- if ( fn.length > 1 ) {
- args = [ pseudo, pseudo, "", argument ];
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction( function( seed, matches ) {
- var idx,
- matched = fn( seed, argument ),
- i = matched.length;
- while ( i-- ) {
- idx = indexOf( seed, matched[ i ] );
- seed[ idx ] = !( matches[ idx ] = matched[ i ] );
- }
- } ) :
- function( elem ) {
- return fn( elem, 0, args );
- };
- }
-
- return fn;
- }
- },
-
- pseudos: {
-
- // Potentially complex pseudos
- "not": markFunction( function( selector ) {
-
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var input = [],
- results = [],
- matcher = compile( selector.replace( rtrim, "$1" ) );
-
- return matcher[ expando ] ?
- markFunction( function( seed, matches, _context, xml ) {
- var elem,
- unmatched = matcher( seed, null, xml, [] ),
- i = seed.length;
-
- // Match elements unmatched by `matcher`
- while ( i-- ) {
- if ( ( elem = unmatched[ i ] ) ) {
- seed[ i ] = !( matches[ i ] = elem );
- }
- }
- } ) :
- function( elem, _context, xml ) {
- input[ 0 ] = elem;
- matcher( input, null, xml, results );
-
- // Don't keep the element (issue #299)
- input[ 0 ] = null;
- return !results.pop();
- };
- } ),
-
- "has": markFunction( function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- } ),
-
- "contains": markFunction( function( text ) {
- text = text.replace( runescape, funescape );
- return function( elem ) {
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
- };
- } ),
-
- // "Whether an element is represented by a :lang() selector
- // is based solely on the element's language value
- // being equal to the identifier C,
- // or beginning with the identifier C immediately followed by "-".
- // The matching of C against the element's language value is performed case-insensitively.
- // The identifier C does not have to be a valid language name."
- // http://www.w3.org/TR/selectors/#lang-pseudo
- "lang": markFunction( function( lang ) {
-
- // lang value must be a valid identifier
- if ( !ridentifier.test( lang || "" ) ) {
- Sizzle.error( "unsupported lang: " + lang );
- }
- lang = lang.replace( runescape, funescape ).toLowerCase();
- return function( elem ) {
- var elemLang;
- do {
- if ( ( elemLang = documentIsHTML ?
- elem.lang :
- elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
-
- elemLang = elemLang.toLowerCase();
- return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
- }
- } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
- return false;
- };
- } ),
-
- // Miscellaneous
- "target": function( elem ) {
- var hash = window.location && window.location.hash;
- return hash && hash.slice( 1 ) === elem.id;
- },
-
- "root": function( elem ) {
- return elem === docElem;
- },
-
- "focus": function( elem ) {
- return elem === document.activeElement &&
- ( !document.hasFocus || document.hasFocus() ) &&
- !!( elem.type || elem.href || ~elem.tabIndex );
- },
-
- // Boolean properties
- "enabled": createDisabledPseudo( false ),
- "disabled": createDisabledPseudo( true ),
-
- "checked": function( elem ) {
-
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return ( nodeName === "input" && !!elem.checked ) ||
- ( nodeName === "option" && !!elem.selected );
- },
-
- "selected": function( elem ) {
-
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- // eslint-disable-next-line no-unused-expressions
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- // Contents
- "empty": function( elem ) {
-
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
- // but not by others (comment: 8; processing instruction: 7; etc.)
- // nodeType < 6 works because attributes (2) do not appear as children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- if ( elem.nodeType < 6 ) {
- return false;
- }
- }
- return true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos[ "empty" ]( elem );
- },
-
- // Element/input types
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "text": function( elem ) {
- var attr;
- return elem.nodeName.toLowerCase() === "input" &&
- elem.type === "text" &&
-
- // Support: IE<8
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( ( attr = elem.getAttribute( "type" ) ) == null ||
- attr.toLowerCase() === "text" );
- },
-
- // Position-in-collection
- "first": createPositionalPseudo( function() {
- return [ 0 ];
- } ),
-
- "last": createPositionalPseudo( function( _matchIndexes, length ) {
- return [ length - 1 ];
- } ),
-
- "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
- return [ argument < 0 ? argument + length : argument ];
- } ),
-
- "even": createPositionalPseudo( function( matchIndexes, length ) {
- var i = 0;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } ),
-
- "odd": createPositionalPseudo( function( matchIndexes, length ) {
- var i = 1;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } ),
-
- "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
- var i = argument < 0 ?
- argument + length :
- argument > length ?
- length :
- argument;
- for ( ; --i >= 0; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } ),
-
- "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
- var i = argument < 0 ? argument + length : argument;
- for ( ; ++i < length; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- } )
- }
-};
-
-Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
- Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
- Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
- var matched, match, tokens, type,
- soFar, groups, preFilters,
- cached = tokenCache[ selector + " " ];
-
- if ( cached ) {
- return parseOnly ? 0 : cached.slice( 0 );
- }
-
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
-
- while ( soFar ) {
-
- // Comma and first run
- if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
- if ( match ) {
-
- // Don't consume trailing commas as valid
- soFar = soFar.slice( match[ 0 ].length ) || soFar;
- }
- groups.push( ( tokens = [] ) );
- }
-
- matched = false;
-
- // Combinators
- if ( ( match = rcombinators.exec( soFar ) ) ) {
- matched = match.shift();
- tokens.push( {
- value: matched,
-
- // Cast descendant combinators to space
- type: match[ 0 ].replace( rtrim, " " )
- } );
- soFar = soFar.slice( matched.length );
- }
-
- // Filters
- for ( type in Expr.filter ) {
- if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
- ( match = preFilters[ type ]( match ) ) ) ) {
- matched = match.shift();
- tokens.push( {
- value: matched,
- type: type,
- matches: match
- } );
- soFar = soFar.slice( matched.length );
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
-
- // Return the length of the invalid excess
- // if we're just parsing
- // Otherwise, throw an error or return tokens
- return parseOnly ?
- soFar.length :
- soFar ?
- Sizzle.error( selector ) :
-
- // Cache the tokens
- tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
- var i = 0,
- len = tokens.length,
- selector = "";
- for ( ; i < len; i++ ) {
- selector += tokens[ i ].value;
- }
- return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
- var dir = combinator.dir,
- skip = combinator.next,
- key = skip || dir,
- checkNonElements = base && key === "parentNode",
- doneName = done++;
-
- return combinator.first ?
-
- // Check against closest ancestor/preceding element
- function( elem, context, xml ) {
- while ( ( elem = elem[ dir ] ) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- return matcher( elem, context, xml );
- }
- }
- return false;
- } :
-
- // Check against all ancestor/preceding elements
- function( elem, context, xml ) {
- var oldCache, uniqueCache, outerCache,
- newCache = [ dirruns, doneName ];
-
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
- if ( xml ) {
- while ( ( elem = elem[ dir ] ) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- if ( matcher( elem, context, xml ) ) {
- return true;
- }
- }
- }
- } else {
- while ( ( elem = elem[ dir ] ) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- outerCache = elem[ expando ] || ( elem[ expando ] = {} );
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ elem.uniqueID ] ||
- ( outerCache[ elem.uniqueID ] = {} );
-
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
- elem = elem[ dir ] || elem;
- } else if ( ( oldCache = uniqueCache[ key ] ) &&
- oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
- // Assign to newCache so results back-propagate to previous elements
- return ( newCache[ 2 ] = oldCache[ 2 ] );
- } else {
-
- // Reuse newcache so results back-propagate to previous elements
- uniqueCache[ key ] = newCache;
-
- // A match means we're done; a fail means we have to keep checking
- if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
- return true;
- }
- }
- }
- }
- }
- return false;
- };
-}
-
-function elementMatcher( matchers ) {
- return matchers.length > 1 ?
- function( elem, context, xml ) {
- var i = matchers.length;
- while ( i-- ) {
- if ( !matchers[ i ]( elem, context, xml ) ) {
- return false;
- }
- }
- return true;
- } :
- matchers[ 0 ];
-}
-
-function multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[ i ], results );
- }
- return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
- var elem,
- newUnmatched = [],
- i = 0,
- len = unmatched.length,
- mapped = map != null;
-
- for ( ; i < len; i++ ) {
- if ( ( elem = unmatched[ i ] ) ) {
- if ( !filter || filter( elem, context, xml ) ) {
- newUnmatched.push( elem );
- if ( mapped ) {
- map.push( i );
- }
- }
- }
- }
-
- return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
- if ( postFilter && !postFilter[ expando ] ) {
- postFilter = setMatcher( postFilter );
- }
- if ( postFinder && !postFinder[ expando ] ) {
- postFinder = setMatcher( postFinder, postSelector );
- }
- return markFunction( function( seed, results, context, xml ) {
- var temp, i, elem,
- preMap = [],
- postMap = [],
- preexisting = results.length,
-
- // Get initial elements from seed or context
- elems = seed || multipleContexts(
- selector || "*",
- context.nodeType ? [ context ] : context,
- []
- ),
-
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
- matcherIn = preFilter && ( seed || !selector ) ?
- condense( elems, preMap, preFilter, context, xml ) :
- elems,
-
- matcherOut = matcher ?
-
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results :
- matcherIn;
-
- // Find primary matches
- if ( matcher ) {
- matcher( matcherIn, matcherOut, context, xml );
- }
-
- // Apply postFilter
- if ( postFilter ) {
- temp = condense( matcherOut, postMap );
- postFilter( temp, [], context, xml );
-
- // Un-match failing elements by moving them back to matcherIn
- i = temp.length;
- while ( i-- ) {
- if ( ( elem = temp[ i ] ) ) {
- matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
- }
- }
- }
-
- if ( seed ) {
- if ( postFinder || preFilter ) {
- if ( postFinder ) {
-
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
- temp = [];
- i = matcherOut.length;
- while ( i-- ) {
- if ( ( elem = matcherOut[ i ] ) ) {
-
- // Restore matcherIn since elem is not yet a final match
- temp.push( ( matcherIn[ i ] = elem ) );
- }
- }
- postFinder( null, ( matcherOut = [] ), temp, xml );
- }
-
- // Move matched elements from seed to results to keep them synchronized
- i = matcherOut.length;
- while ( i-- ) {
- if ( ( elem = matcherOut[ i ] ) &&
- ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
-
- seed[ temp ] = !( results[ temp ] = elem );
- }
- }
- }
-
- // Add elements to results, through postFinder if defined
- } else {
- matcherOut = condense(
- matcherOut === results ?
- matcherOut.splice( preexisting, matcherOut.length ) :
- matcherOut
- );
- if ( postFinder ) {
- postFinder( null, results, matcherOut, xml );
- } else {
- push.apply( results, matcherOut );
- }
- }
- } );
-}
-
-function matcherFromTokens( tokens ) {
- var checkContext, matcher, j,
- len = tokens.length,
- leadingRelative = Expr.relative[ tokens[ 0 ].type ],
- implicitRelative = leadingRelative || Expr.relative[ " " ],
- i = leadingRelative ? 1 : 0,
-
- // The foundational matcher ensures that elements are reachable from top-level context(s)
- matchContext = addCombinator( function( elem ) {
- return elem === checkContext;
- }, implicitRelative, true ),
- matchAnyContext = addCombinator( function( elem ) {
- return indexOf( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- ( checkContext = context ).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
-
- // Avoid hanging onto element (issue #299)
- checkContext = null;
- return ret;
- } ];
-
- for ( ; i < len; i++ ) {
- if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
- matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
- } else {
- matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
-
- // Return special upon seeing a positional matcher
- if ( matcher[ expando ] ) {
-
- // Find the next relative operator (if any) for proper handling
- j = ++i;
- for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[ j ].type ] ) {
- break;
- }
- }
- return setMatcher(
- i > 1 && elementMatcher( matchers ),
- i > 1 && toSelector(
-
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
- tokens
- .slice( 0, i - 1 )
- .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
- ).replace( rtrim, "$1" ),
- matcher,
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
- j < len && toSelector( tokens )
- );
- }
- matchers.push( matcher );
- }
- }
-
- return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- var bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, outermost ) {
- var elem, j, matcher,
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- setMatched = [],
- contextBackup = outermostContext,
-
- // We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
-
- // Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
- len = elems.length;
-
- if ( outermost ) {
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- outermostContext = context == document || context || outermost;
- }
-
- // Add elements passing elementMatchers directly to results
- // Support: IE<9, Safari
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
- for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
- if ( byElement && elem ) {
- j = 0;
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( !context && elem.ownerDocument != document ) {
- setDocument( elem );
- xml = !documentIsHTML;
- }
- while ( ( matcher = elementMatchers[ j++ ] ) ) {
- if ( matcher( elem, context || document, xml ) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- }
- }
-
- // Track unmatched elements for set filters
- if ( bySet ) {
-
- // They will have gone through all possible matchers
- if ( ( elem = !matcher && elem ) ) {
- matchedCount--;
- }
-
- // Lengthen the array for every element, matched or not
- if ( seed ) {
- unmatched.push( elem );
- }
- }
- }
-
- // `i` is now the count of elements visited above, and adding it to `matchedCount`
- // makes the latter nonnegative.
- matchedCount += i;
-
- // Apply set filters to unmatched elements
- // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
- // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
- // no element matchers and no seed.
- // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
- // case, which will result in a "00" `matchedCount` that differs from `i` but is also
- // numerically zero.
- if ( bySet && i !== matchedCount ) {
- j = 0;
- while ( ( matcher = setMatchers[ j++ ] ) ) {
- matcher( unmatched, setMatched, context, xml );
- }
-
- if ( seed ) {
-
- // Reintegrate element matches to eliminate the need for sorting
- if ( matchedCount > 0 ) {
- while ( i-- ) {
- if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
- setMatched[ i ] = pop.call( results );
- }
- }
- }
-
- // Discard index placeholder values to get only actual matches
- setMatched = condense( setMatched );
- }
-
- // Add matches to results
- push.apply( results, setMatched );
-
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
- if ( outermost && !seed && setMatched.length > 0 &&
- ( matchedCount + setMatchers.length ) > 1 ) {
-
- Sizzle.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
- var i,
- setMatchers = [],
- elementMatchers = [],
- cached = compilerCache[ selector + " " ];
-
- if ( !cached ) {
-
- // Generate a function of recursive functions that can be used to check each element
- if ( !match ) {
- match = tokenize( selector );
- }
- i = match.length;
- while ( i-- ) {
- cached = matcherFromTokens( match[ i ] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache(
- selector,
- matcherFromGroupMatchers( elementMatchers, setMatchers )
- );
-
- // Save selector and tokenization
- cached.selector = selector;
- }
- return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- * selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- * selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
- var i, tokens, token, type, find,
- compiled = typeof selector === "function" && selector,
- match = !seed && tokenize( ( selector = compiled.selector || selector ) );
-
- results = results || [];
-
- // Try to minimize operations if there is only one selector in the list and no seed
- // (the latter of which guarantees us context)
- if ( match.length === 1 ) {
-
- // Reduce context if the leading compound selector is an ID
- tokens = match[ 0 ] = match[ 0 ].slice( 0 );
- if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
-
- context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
- .replace( runescape, funescape ), context ) || [] )[ 0 ];
- if ( !context ) {
- return results;
-
- // Precompiled matchers will still verify ancestry, so step up a level
- } else if ( compiled ) {
- context = context.parentNode;
- }
-
- selector = selector.slice( tokens.shift().value.length );
- }
-
- // Fetch a seed set for right-to-left matching
- i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
- while ( i-- ) {
- token = tokens[ i ];
-
- // Abort if we hit a combinator
- if ( Expr.relative[ ( type = token.type ) ] ) {
- break;
- }
- if ( ( find = Expr.find[ type ] ) ) {
-
- // Search, expanding context for leading sibling combinators
- if ( ( seed = find(
- token.matches[ 0 ].replace( runescape, funescape ),
- rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
- context
- ) ) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && toSelector( tokens );
- if ( !selector ) {
- push.apply( results, seed );
- return results;
- }
-
- break;
- }
- }
- }
- }
-
- // Compile and execute a filtering function if one is not provided
- // Provide `match` to avoid retokenization if we modified the selector above
- ( compiled || compile( selector, match ) )(
- seed,
- context,
- !documentIsHTML,
- results,
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
- );
- return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert( function( el ) {
-
- // Should return 1, but returns 4 (following)
- return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
-} );
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert( function( el ) {
- el.innerHTML = "<a href='#'></a>";
- return el.firstChild.getAttribute( "href" ) === "#";
-} ) ) {
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
- if ( !isXML ) {
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
- }
- } );
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert( function( el ) {
- el.innerHTML = "<input/>";
- el.firstChild.setAttribute( "value", "" );
- return el.firstChild.getAttribute( "value" ) === "";
-} ) ) {
- addHandle( "value", function( elem, _name, isXML ) {
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
- return elem.defaultValue;
- }
- } );
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert( function( el ) {
- return el.getAttribute( "disabled" ) == null;
-} ) ) {
- addHandle( booleans, function( elem, name, isXML ) {
- var val;
- if ( !isXML ) {
- return elem[ name ] === true ? name.toLowerCase() :
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
- val.value :
- null;
- }
- } );
-}
-
-return Sizzle;
-
-} )( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-jQuery.escapeSelector = Sizzle.escape;
-
-
-
-
-var dir = function( elem, dir, until ) {
- var matched = [],
- truncate = until !== undefined;
-
- while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
- if ( elem.nodeType === 1 ) {
- if ( truncate && jQuery( elem ).is( until ) ) {
- break;
- }
- matched.push( elem );
- }
- }
- return matched;
-};
-
-
-var siblings = function( n, elem ) {
- var matched = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- matched.push( n );
- }
- }
-
- return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-
-
-function nodeName( elem, name ) {
-
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-}
-var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
-
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
- if ( isFunction( qualifier ) ) {
- return jQuery.grep( elements, function( elem, i ) {
- return !!qualifier.call( elem, i, elem ) !== not;
- } );
- }
-
- // Single element
- if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function( elem ) {
- return ( elem === qualifier ) !== not;
- } );
- }
-
- // Arraylike of elements (jQuery, arguments, Array)
- if ( typeof qualifier !== "string" ) {
- return jQuery.grep( elements, function( elem ) {
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
- } );
- }
-
- // Filtered directly for both simple and complex selectors
- return jQuery.filter( qualifier, elements, not );
-}
-
-jQuery.filter = function( expr, elems, not ) {
- var elem = elems[ 0 ];
-
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- if ( elems.length === 1 && elem.nodeType === 1 ) {
- return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
- }
-
- return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- } ) );
-};
-
-jQuery.fn.extend( {
- find: function( selector ) {
- var i, ret,
- len = this.length,
- self = this;
-
- if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter( function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- } ) );
- }
-
- ret = this.pushStack( [] );
-
- for ( i = 0; i < len; i++ ) {
- jQuery.find( selector, self[ i ], ret );
- }
-
- return len > 1 ? jQuery.uniqueSort( ret ) : ret;
- },
- filter: function( selector ) {
- return this.pushStack( winnow( this, selector || [], false ) );
- },
- not: function( selector ) {
- return this.pushStack( winnow( this, selector || [], true ) );
- },
- is: function( selector ) {
- return !!winnow(
- this,
-
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- typeof selector === "string" && rneedsContext.test( selector ) ?
- jQuery( selector ) :
- selector || [],
- false
- ).length;
- }
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
- // A simple way to check for HTML strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- // Strict HTML recognition (#11290: must start with <)
- // Shortcut simple #id case for speed
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
-
- init = jQuery.fn.init = function( selector, context, root ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Method init() accepts an alternate rootjQuery
- // so migrate can support jQuery.sub (gh-2101)
- root = root || rootjQuery;
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector[ 0 ] === "<" &&
- selector[ selector.length - 1 ] === ">" &&
- selector.length >= 3 ) {
-
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && ( match[ 1 ] || !context ) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[ 1 ] ) {
- context = context instanceof jQuery ? context[ 0 ] : context;
-
- // Option to run scripts is true for back-compat
- // Intentionally let the error be thrown if parseHTML is not present
- jQuery.merge( this, jQuery.parseHTML(
- match[ 1 ],
- context && context.nodeType ? context.ownerDocument || context : document,
- true
- ) );
-
- // HANDLE: $(html, props)
- if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
- for ( match in context ) {
-
- // Properties of context are called as methods if possible
- if ( isFunction( this[ match ] ) ) {
- this[ match ]( context[ match ] );
-
- // ...and otherwise set as attributes
- } else {
- this.attr( match, context[ match ] );
- }
- }
- }
-
- return this;
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[ 2 ] );
-
- if ( elem ) {
-
- // Inject the element directly into the jQuery object
- this[ 0 ] = elem;
- this.length = 1;
- }
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || root ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(DOMElement)
- } else if ( selector.nodeType ) {
- this[ 0 ] = selector;
- this.length = 1;
- return this;
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( isFunction( selector ) ) {
- return root.ready !== undefined ?
- root.ready( selector ) :
-
- // Execute immediately if ready is not present
- selector( jQuery );
- }
-
- return jQuery.makeArray( selector, this );
- };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
- // Methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend( {
- has: function( target ) {
- var targets = jQuery( target, this ),
- l = targets.length;
-
- return this.filter( function() {
- var i = 0;
- for ( ; i < l; i++ ) {
- if ( jQuery.contains( this, targets[ i ] ) ) {
- return true;
- }
- }
- } );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- matched = [],
- targets = typeof selectors !== "string" && jQuery( selectors );
-
- // Positional selectors never match, since there's no _selection_ context
- if ( !rneedsContext.test( selectors ) ) {
- for ( ; i < l; i++ ) {
- for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
- // Always skip document fragments
- if ( cur.nodeType < 11 && ( targets ?
- targets.index( cur ) > -1 :
-
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
- matched.push( cur );
- break;
- }
- }
- }
- }
-
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
- },
-
- // Determine the position of an element within the set
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
- }
-
- // Index in selector
- if ( typeof elem === "string" ) {
- return indexOf.call( jQuery( elem ), this[ 0 ] );
- }
-
- // Locate the position of the desired element
- return indexOf.call( this,
-
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[ 0 ] : elem
- );
- },
-
- add: function( selector, context ) {
- return this.pushStack(
- jQuery.uniqueSort(
- jQuery.merge( this.get(), jQuery( selector, context ) )
- )
- );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- }
-} );
-
-function sibling( cur, dir ) {
- while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
- return cur;
-}
-
-jQuery.each( {
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, _i, until ) {
- return dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, _i, until ) {
- return dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, _i, until ) {
- return dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return siblings( elem.firstChild );
- },
- contents: function( elem ) {
- if ( elem.contentDocument != null &&
-
- // Support: IE 11+
- // <object> elements with no `data` attribute has an object
- // `contentDocument` with a `null` prototype.
- getProto( elem.contentDocument ) ) {
-
- return elem.contentDocument;
- }
-
- // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
- // Treat the template element as a regular one in browsers that
- // don't support it.
- if ( nodeName( elem, "template" ) ) {
- elem = elem.content || elem;
- }
-
- return jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var matched = jQuery.map( this, fn, until );
-
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- matched = jQuery.filter( selector, matched );
- }
-
- if ( this.length > 1 ) {
-
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- jQuery.uniqueSort( matched );
- }
-
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- matched.reverse();
- }
- }
-
- return this.pushStack( matched );
- };
-} );
-var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
- var object = {};
- jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
- object[ flag ] = true;
- } );
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- createOptions( options ) :
- jQuery.extend( {}, options );
-
- var // Flag to know if list is currently firing
- firing,
-
- // Last fire value for non-forgettable lists
- memory,
-
- // Flag to know if list was already fired
- fired,
-
- // Flag to prevent firing
- locked,
-
- // Actual callback list
- list = [],
-
- // Queue of execution data for repeatable lists
- queue = [],
-
- // Index of currently firing callback (modified by add/remove as needed)
- firingIndex = -1,
-
- // Fire callbacks
- fire = function() {
-
- // Enforce single-firing
- locked = locked || options.once;
-
- // Execute callbacks for all pending executions,
- // respecting firingIndex overrides and runtime changes
- fired = firing = true;
- for ( ; queue.length; firingIndex = -1 ) {
- memory = queue.shift();
- while ( ++firingIndex < list.length ) {
-
- // Run callback and check for early termination
- if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
- options.stopOnFalse ) {
-
- // Jump to end and forget the data so .add doesn't re-fire
- firingIndex = list.length;
- memory = false;
- }
- }
- }
-
- // Forget the data if we're done with it
- if ( !options.memory ) {
- memory = false;
- }
-
- firing = false;
-
- // Clean up if we're done firing for good
- if ( locked ) {
-
- // Keep an empty list if we have data for future add calls
- if ( memory ) {
- list = [];
-
- // Otherwise, this object is spent
- } else {
- list = "";
- }
- }
- },
-
- // Actual Callbacks object
- self = {
-
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
-
- // If we have memory from a past run, we should fire after adding
- if ( memory && !firing ) {
- firingIndex = list.length - 1;
- queue.push( memory );
- }
-
- ( function add( args ) {
- jQuery.each( args, function( _, arg ) {
- if ( isFunction( arg ) ) {
- if ( !options.unique || !self.has( arg ) ) {
- list.push( arg );
- }
- } else if ( arg && arg.length && toType( arg ) !== "string" ) {
-
- // Inspect recursively
- add( arg );
- }
- } );
- } )( arguments );
-
- if ( memory && !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Remove a callback from the list
- remove: function() {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
-
- // Handle firing indexes
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- } );
- return this;
- },
-
- // Check if a given callback is in the list.
- // If no argument is given, return whether or not list has callbacks attached.
- has: function( fn ) {
- return fn ?
- jQuery.inArray( fn, list ) > -1 :
- list.length > 0;
- },
-
- // Remove all callbacks from the list
- empty: function() {
- if ( list ) {
- list = [];
- }
- return this;
- },
-
- // Disable .fire and .add
- // Abort any current/pending executions
- // Clear all callbacks and values
- disable: function() {
- locked = queue = [];
- list = memory = "";
- return this;
- },
- disabled: function() {
- return !list;
- },
-
- // Disable .fire
- // Also disable .add unless we have memory (since it would have no effect)
- // Abort any pending executions
- lock: function() {
- locked = queue = [];
- if ( !memory && !firing ) {
- list = memory = "";
- }
- return this;
- },
- locked: function() {
- return !!locked;
- },
-
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( !locked ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- queue.push( args );
- if ( !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
-
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-
-
-function Identity( v ) {
- return v;
-}
-function Thrower( ex ) {
- throw ex;
-}
-
-function adoptValue( value, resolve, reject, noValue ) {
- var method;
-
- try {
-
- // Check for promise aspect first to privilege synchronous behavior
- if ( value && isFunction( ( method = value.promise ) ) ) {
- method.call( value ).done( resolve ).fail( reject );
-
- // Other thenables
- } else if ( value && isFunction( ( method = value.then ) ) ) {
- method.call( value, resolve, reject );
-
- // Other non-thenables
- } else {
-
- // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
- // * false: [ value ].slice( 0 ) => resolve( value )
- // * true: [ value ].slice( 1 ) => resolve()
- resolve.apply( undefined, [ value ].slice( noValue ) );
- }
-
- // For Promises/A+, convert exceptions into rejections
- // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
- // Deferred#then to conditionally suppress rejection.
- } catch ( value ) {
-
- // Support: Android 4.0 only
- // Strict mode functions invoked without .call/.apply get global-object context
- reject.apply( undefined, [ value ] );
- }
-}
-
-jQuery.extend( {
-
- Deferred: function( func ) {
- var tuples = [
-
- // action, add listener, callbacks,
- // ... .then handlers, argument index, [final state]
- [ "notify", "progress", jQuery.Callbacks( "memory" ),
- jQuery.Callbacks( "memory" ), 2 ],
- [ "resolve", "done", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), 0, "resolved" ],
- [ "reject", "fail", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), 1, "rejected" ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- "catch": function( fn ) {
- return promise.then( null, fn );
- },
-
- // Keep pipe for back-compat
- pipe: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
-
- return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( _i, tuple ) {
-
- // Map tuples (progress, done, fail) to arguments (done, fail, progress)
- var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
- // deferred.progress(function() { bind to newDefer or newDefer.notify })
- // deferred.done(function() { bind to newDefer or newDefer.resolve })
- // deferred.fail(function() { bind to newDefer or newDefer.reject })
- deferred[ tuple[ 1 ] ]( function() {
- var returned = fn && fn.apply( this, arguments );
- if ( returned && isFunction( returned.promise ) ) {
- returned.promise()
- .progress( newDefer.notify )
- .done( newDefer.resolve )
- .fail( newDefer.reject );
- } else {
- newDefer[ tuple[ 0 ] + "With" ](
- this,
- fn ? [ returned ] : arguments
- );
- }
- } );
- } );
- fns = null;
- } ).promise();
- },
- then: function( onFulfilled, onRejected, onProgress ) {
- var maxDepth = 0;
- function resolve( depth, deferred, handler, special ) {
- return function() {
- var that = this,
- args = arguments,
- mightThrow = function() {
- var returned, then;
-
- // Support: Promises/A+ section 2.3.3.3.3
- // https://promisesaplus.com/#point-59
- // Ignore double-resolution attempts
- if ( depth < maxDepth ) {
- return;
- }
-
- returned = handler.apply( that, args );
-
- // Support: Promises/A+ section 2.3.1
- // https://promisesaplus.com/#point-48
- if ( returned === deferred.promise() ) {
- throw new TypeError( "Thenable self-resolution" );
- }
-
- // Support: Promises/A+ sections 2.3.3.1, 3.5
- // https://promisesaplus.com/#point-54
- // https://promisesaplus.com/#point-75
- // Retrieve `then` only once
- then = returned &&
-
- // Support: Promises/A+ section 2.3.4
- // https://promisesaplus.com/#point-64
- // Only check objects and functions for thenability
- ( typeof returned === "object" ||
- typeof returned === "function" ) &&
- returned.then;
-
- // Handle a returned thenable
- if ( isFunction( then ) ) {
-
- // Special processors (notify) just wait for resolution
- if ( special ) {
- then.call(
- returned,
- resolve( maxDepth, deferred, Identity, special ),
- resolve( maxDepth, deferred, Thrower, special )
- );
-
- // Normal processors (resolve) also hook into progress
- } else {
-
- // ...and disregard older resolution values
- maxDepth++;
-
- then.call(
- returned,
- resolve( maxDepth, deferred, Identity, special ),
- resolve( maxDepth, deferred, Thrower, special ),
- resolve( maxDepth, deferred, Identity,
- deferred.notifyWith )
- );
- }
-
- // Handle all other returned values
- } else {
-
- // Only substitute handlers pass on context
- // and multiple values (non-spec behavior)
- if ( handler !== Identity ) {
- that = undefined;
- args = [ returned ];
- }
-
- // Process the value(s)
- // Default process is resolve
- ( special || deferred.resolveWith )( that, args );
- }
- },
-
- // Only normal processors (resolve) catch and reject exceptions
- process = special ?
- mightThrow :
- function() {
- try {
- mightThrow();
- } catch ( e ) {
-
- if ( jQuery.Deferred.exceptionHook ) {
- jQuery.Deferred.exceptionHook( e,
- process.stackTrace );
- }
-
- // Support: Promises/A+ section 2.3.3.3.4.1
- // https://promisesaplus.com/#point-61
- // Ignore post-resolution exceptions
- if ( depth + 1 >= maxDepth ) {
-
- // Only substitute handlers pass on context
- // and multiple values (non-spec behavior)
- if ( handler !== Thrower ) {
- that = undefined;
- args = [ e ];
- }
-
- deferred.rejectWith( that, args );
- }
- }
- };
-
- // Support: Promises/A+ section 2.3.3.3.1
- // https://promisesaplus.com/#point-57
- // Re-resolve promises immediately to dodge false rejection from
- // subsequent errors
- if ( depth ) {
- process();
- } else {
-
- // Call an optional hook to record the stack, in case of exception
- // since it's otherwise lost when execution goes async
- if ( jQuery.Deferred.getStackHook ) {
- process.stackTrace = jQuery.Deferred.getStackHook();
- }
- window.setTimeout( process );
- }
- };
- }
-
- return jQuery.Deferred( function( newDefer ) {
-
- // progress_handlers.add( ... )
- tuples[ 0 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onProgress ) ?
- onProgress :
- Identity,
- newDefer.notifyWith
- )
- );
-
- // fulfilled_handlers.add( ... )
- tuples[ 1 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onFulfilled ) ?
- onFulfilled :
- Identity
- )
- );
-
- // rejected_handlers.add( ... )
- tuples[ 2 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onRejected ) ?
- onRejected :
- Thrower
- )
- );
- } ).promise();
- },
-
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return obj != null ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 5 ];
-
- // promise.progress = list.add
- // promise.done = list.add
- // promise.fail = list.add
- promise[ tuple[ 1 ] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add(
- function() {
-
- // state = "resolved" (i.e., fulfilled)
- // state = "rejected"
- state = stateString;
- },
-
- // rejected_callbacks.disable
- // fulfilled_callbacks.disable
- tuples[ 3 - i ][ 2 ].disable,
-
- // rejected_handlers.disable
- // fulfilled_handlers.disable
- tuples[ 3 - i ][ 3 ].disable,
-
- // progress_callbacks.lock
- tuples[ 0 ][ 2 ].lock,
-
- // progress_handlers.lock
- tuples[ 0 ][ 3 ].lock
- );
- }
-
- // progress_handlers.fire
- // fulfilled_handlers.fire
- // rejected_handlers.fire
- list.add( tuple[ 3 ].fire );
-
- // deferred.notify = function() { deferred.notifyWith(...) }
- // deferred.resolve = function() { deferred.resolveWith(...) }
- // deferred.reject = function() { deferred.rejectWith(...) }
- deferred[ tuple[ 0 ] ] = function() {
- deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
- return this;
- };
-
- // deferred.notifyWith = list.fireWith
- // deferred.resolveWith = list.fireWith
- // deferred.rejectWith = list.fireWith
- deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
- } );
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( singleValue ) {
- var
-
- // count of uncompleted subordinates
- remaining = arguments.length,
-
- // count of unprocessed arguments
- i = remaining,
-
- // subordinate fulfillment data
- resolveContexts = Array( i ),
- resolveValues = slice.call( arguments ),
-
- // the primary Deferred
- primary = jQuery.Deferred(),
-
- // subordinate callback factory
- updateFunc = function( i ) {
- return function( value ) {
- resolveContexts[ i ] = this;
- resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
- if ( !( --remaining ) ) {
- primary.resolveWith( resolveContexts, resolveValues );
- }
- };
- };
-
- // Single- and empty arguments are adopted like Promise.resolve
- if ( remaining <= 1 ) {
- adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
- !remaining );
-
- // Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( primary.state() === "pending" ||
- isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
- return primary.then();
- }
- }
-
- // Multiple arguments are aggregated like Promise.all array elements
- while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
- }
-
- return primary.promise();
- }
-} );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
- // Support: IE 8 - 9 only
- // Console exists when dev tools are open, which can happen at any time
- if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
- }
-};
-
-
-
-
-jQuery.readyException = function( error ) {
- window.setTimeout( function() {
- throw error;
- } );
-};
-
-
-
-
-// The deferred used on DOM ready
-var readyList = jQuery.Deferred();
-
-jQuery.fn.ready = function( fn ) {
-
- readyList
- .then( fn )
-
- // Wrap jQuery.readyException in a function so that the lookup
- // happens at the time of error handling instead of callback
- // registration.
- .catch( function( error ) {
- jQuery.readyException( error );
- } );
-
- return this;
-};
-
-jQuery.extend( {
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
- }
-} );
-
-jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
-function completed() {
- document.removeEventListener( "DOMContentLoaded", completed );
- window.removeEventListener( "load", completed );
- jQuery.ready();
-}
-
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-if ( document.readyState === "complete" ||
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- window.setTimeout( jQuery.ready );
-
-} else {
-
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed );
-}
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- len = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( toType( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- access( elems, fn, i, key[ i ], true, emptyGet, raw );
- }
-
- // Sets one value
- } else if ( value !== undefined ) {
- chainable = true;
-
- if ( !isFunction( value ) ) {
- raw = true;
- }
-
- if ( bulk ) {
-
- // Bulk operations run against the entire set
- if ( raw ) {
- fn.call( elems, value );
- fn = null;
-
- // ...except when executing function values
- } else {
- bulk = fn;
- fn = function( elem, _key, value ) {
- return bulk.call( jQuery( elem ), value );
- };
- }
- }
-
- if ( fn ) {
- for ( ; i < len; i++ ) {
- fn(
- elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
- );
- }
- }
- }
-
- if ( chainable ) {
- return elems;
- }
-
- // Gets
- if ( bulk ) {
- return fn.call( elems );
- }
-
- return len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-
-
-// Matches dashed string for camelizing
-var rmsPrefix = /^-ms-/,
- rdashAlpha = /-([a-z])/g;
-
-// Used by camelCase as callback to replace()
-function fcamelCase( _all, letter ) {
- return letter.toUpperCase();
-}
-
-// Convert dashed to camelCase; used by the css and data modules
-// Support: IE <=9 - 11, Edge 12 - 15
-// Microsoft forgot to hump their vendor prefix (#9572)
-function camelCase( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-}
-var acceptData = function( owner ) {
-
- // Accepts only:
- // - Node
- // - Node.ELEMENT_NODE
- // - Node.DOCUMENT_NODE
- // - Object
- // - Any
- return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
- this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
- cache: function( owner ) {
-
- // Check if the owner object already has a cache
- var value = owner[ this.expando ];
-
- // If not, create one
- if ( !value ) {
- value = {};
-
- // We can accept data for non-element nodes in modern browsers,
- // but we should not, see #8335.
- // Always return an empty object.
- if ( acceptData( owner ) ) {
-
- // If it is a node unlikely to be stringify-ed or looped over
- // use plain assignment
- if ( owner.nodeType ) {
- owner[ this.expando ] = value;
-
- // Otherwise secure it in a non-enumerable property
- // configurable must be true to allow the property to be
- // deleted when data is removed
- } else {
- Object.defineProperty( owner, this.expando, {
- value: value,
- configurable: true
- } );
- }
- }
- }
-
- return value;
- },
- set: function( owner, data, value ) {
- var prop,
- cache = this.cache( owner );
-
- // Handle: [ owner, key, value ] args
- // Always use camelCase key (gh-2257)
- if ( typeof data === "string" ) {
- cache[ camelCase( data ) ] = value;
-
- // Handle: [ owner, { properties } ] args
- } else {
-
- // Copy the properties one-by-one to the cache object
- for ( prop in data ) {
- cache[ camelCase( prop ) ] = data[ prop ];
- }
- }
- return cache;
- },
- get: function( owner, key ) {
- return key === undefined ?
- this.cache( owner ) :
-
- // Always use camelCase key (gh-2257)
- owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
- },
- access: function( owner, key, value ) {
-
- // In cases where either:
- //
- // 1. No key was specified
- // 2. A string key was specified, but no value provided
- //
- // Take the "read" path and allow the get method to determine
- // which value to return, respectively either:
- //
- // 1. The entire cache object
- // 2. The data stored at the key
- //
- if ( key === undefined ||
- ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
- return this.get( owner, key );
- }
-
- // When the key is not a string, or both a key and value
- // are specified, set or extend (existing objects) with either:
- //
- // 1. An object of properties
- // 2. A key and value
- //
- this.set( owner, key, value );
-
- // Since the "set" path can have two possible entry points
- // return the expected data based on which path was taken[*]
- return value !== undefined ? value : key;
- },
- remove: function( owner, key ) {
- var i,
- cache = owner[ this.expando ];
-
- if ( cache === undefined ) {
- return;
- }
-
- if ( key !== undefined ) {
-
- // Support array or space separated string of keys
- if ( Array.isArray( key ) ) {
-
- // If key is an array of keys...
- // We always set camelCase keys, so remove that.
- key = key.map( camelCase );
- } else {
- key = camelCase( key );
-
- // If a key with the spaces exists, use it.
- // Otherwise, create an array by matching non-whitespace
- key = key in cache ?
- [ key ] :
- ( key.match( rnothtmlwhite ) || [] );
- }
-
- i = key.length;
-
- while ( i-- ) {
- delete cache[ key[ i ] ];
- }
- }
-
- // Remove the expando if there's no more data
- if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
- // Support: Chrome <=35 - 45
- // Webkit & Blink performance suffers when deleting properties
- // from DOM nodes, so set to undefined instead
- // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
- if ( owner.nodeType ) {
- owner[ this.expando ] = undefined;
- } else {
- delete owner[ this.expando ];
- }
- }
- },
- hasData: function( owner ) {
- var cache = owner[ this.expando ];
- return cache !== undefined && !jQuery.isEmptyObject( cache );
- }
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-// Implementation Summary
-//
-// 1. Enforce API surface and semantic compatibility with 1.9.x branch
-// 2. Improve the module's maintainability by reducing the storage
-// paths to a single mechanism.
-// 3. Use the same single mechanism to support "private" and "user" data.
-// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-// 5. Avoid exposing implementation details on user objects (eg. expando properties)
-// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
- rmultiDash = /[A-Z]/g;
-
-function getData( data ) {
- if ( data === "true" ) {
- return true;
- }
-
- if ( data === "false" ) {
- return false;
- }
-
- if ( data === "null" ) {
- return null;
- }
-
- // Only convert to a number if it doesn't change the string
- if ( data === +data + "" ) {
- return +data;
- }
-
- if ( rbrace.test( data ) ) {
- return JSON.parse( data );
- }
-
- return data;
-}
-
-function dataAttr( elem, key, data ) {
- var name;
-
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = getData( data );
- } catch ( e ) {}
-
- // Make sure we set the data so it isn't changed later
- dataUser.set( elem, key, data );
- } else {
- data = undefined;
- }
- }
- return data;
-}
-
-jQuery.extend( {
- hasData: function( elem ) {
- return dataUser.hasData( elem ) || dataPriv.hasData( elem );
- },
-
- data: function( elem, name, data ) {
- return dataUser.access( elem, name, data );
- },
-
- removeData: function( elem, name ) {
- dataUser.remove( elem, name );
- },
-
- // TODO: Now that all calls to _data and _removeData have been replaced
- // with direct calls to dataPriv methods, these can be deprecated.
- _data: function( elem, name, data ) {
- return dataPriv.access( elem, name, data );
- },
-
- _removeData: function( elem, name ) {
- dataPriv.remove( elem, name );
- }
-} );
-
-jQuery.fn.extend( {
- data: function( key, value ) {
- var i, name, data,
- elem = this[ 0 ],
- attrs = elem && elem.attributes;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = dataUser.get( elem );
-
- if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
- i = attrs.length;
- while ( i-- ) {
-
- // Support: IE 11 only
- // The attrs elements can be null (#14894)
- if ( attrs[ i ] ) {
- name = attrs[ i ].name;
- if ( name.indexOf( "data-" ) === 0 ) {
- name = camelCase( name.slice( 5 ) );
- dataAttr( elem, name, data[ name ] );
- }
- }
- }
- dataPriv.set( elem, "hasDataAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each( function() {
- dataUser.set( this, key );
- } );
- }
-
- return access( this, function( value ) {
- var data;
-
- // The calling jQuery object (element matches) is not empty
- // (and therefore has an element appears at this[ 0 ]) and the
- // `value` parameter was not undefined. An empty jQuery object
- // will result in `undefined` for elem = this[ 0 ] which will
- // throw an exception if an attempt to read a data cache is made.
- if ( elem && value === undefined ) {
-
- // Attempt to get data from the cache
- // The key will always be camelCased in Data
- data = dataUser.get( elem, key );
- if ( data !== undefined ) {
- return data;
- }
-
- // Attempt to "discover" the data in
- // HTML5 custom data-* attrs
- data = dataAttr( elem, key );
- if ( data !== undefined ) {
- return data;
- }
-
- // We tried really hard, but the data doesn't exist.
- return;
- }
-
- // Set the data...
- this.each( function() {
-
- // We always store the camelCased key
- dataUser.set( this, key, value );
- } );
- }, null, value, arguments.length > 1, null, true );
- },
-
- removeData: function( key ) {
- return this.each( function() {
- dataUser.remove( this, key );
- } );
- }
-} );
-
-
-jQuery.extend( {
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = dataPriv.get( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || Array.isArray( data ) ) {
- queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- startLength = queue.length,
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- startLength--;
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // Clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
-
- if ( !startLength && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // Not public - generate a queueHooks object, or return the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
- empty: jQuery.Callbacks( "once memory" ).add( function() {
- dataPriv.remove( elem, [ type + "queue", key ] );
- } )
- } );
- }
-} );
-
-jQuery.fn.extend( {
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[ 0 ], type );
- }
-
- return data === undefined ?
- this :
- this.each( function() {
- var queue = jQuery.queue( this, type, data );
-
- // Ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- dequeue: function( type ) {
- return this.each( function() {
- jQuery.dequeue( this, type );
- } );
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
-
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while ( i-- ) {
- tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var documentElement = document.documentElement;
-
-
-
- var isAttached = function( elem ) {
- return jQuery.contains( elem.ownerDocument, elem );
- },
- composed = { composed: true };
-
- // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
- // Check attachment across shadow DOM boundaries when possible (gh-3504)
- // Support: iOS 10.0-10.2 only
- // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
- // leading to errors. We need to check for `getRootNode`.
- if ( documentElement.getRootNode ) {
- isAttached = function( elem ) {
- return jQuery.contains( elem.ownerDocument, elem ) ||
- elem.getRootNode( composed ) === elem.ownerDocument;
- };
- }
-var isHiddenWithinTree = function( elem, el ) {
-
- // isHiddenWithinTree might be called from jQuery#filter function;
- // in that case, element will be second argument
- elem = el || elem;
-
- // Inline style trumps all
- return elem.style.display === "none" ||
- elem.style.display === "" &&
-
- // Otherwise, check computed style
- // Support: Firefox <=43 - 45
- // Disconnected elements can have computed display: none, so first confirm that elem is
- // in the document.
- isAttached( elem ) &&
-
- jQuery.css( elem, "display" ) === "none";
- };
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
- var adjusted, scale,
- maxIterations = 20,
- currentValue = tween ?
- function() {
- return tween.cur();
- } :
- function() {
- return jQuery.css( elem, prop, "" );
- },
- initial = currentValue(),
- unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
- // Starting value computation is required for potential unit mismatches
- initialInUnit = elem.nodeType &&
- ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
- rcssNum.exec( jQuery.css( elem, prop ) );
-
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
- // Support: Firefox <=54
- // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
- initial = initial / 2;
-
- // Trust units reported by jQuery.css
- unit = unit || initialInUnit[ 3 ];
-
- // Iteratively approximate from a nonzero starting point
- initialInUnit = +initial || 1;
-
- while ( maxIterations-- ) {
-
- // Evaluate and update our best guess (doubling guesses that zero out).
- // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
- jQuery.style( elem, prop, initialInUnit + unit );
- if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
- maxIterations = 0;
- }
- initialInUnit = initialInUnit / scale;
-
- }
-
- initialInUnit = initialInUnit * 2;
- jQuery.style( elem, prop, initialInUnit + unit );
-
- // Make sure we update the tween properties later on
- valueParts = valueParts || [];
- }
-
- if ( valueParts ) {
- initialInUnit = +initialInUnit || +initial || 0;
-
- // Apply relative offset (+=/-=) if specified
- adjusted = valueParts[ 1 ] ?
- initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
- +valueParts[ 2 ];
- if ( tween ) {
- tween.unit = unit;
- tween.start = initialInUnit;
- tween.end = adjusted;
- }
- }
- return adjusted;
-}
-
-
-var defaultDisplayMap = {};
-
-function getDefaultDisplay( elem ) {
- var temp,
- doc = elem.ownerDocument,
- nodeName = elem.nodeName,
- display = defaultDisplayMap[ nodeName ];
-
- if ( display ) {
- return display;
- }
-
- temp = doc.body.appendChild( doc.createElement( nodeName ) );
- display = jQuery.css( temp, "display" );
-
- temp.parentNode.removeChild( temp );
-
- if ( display === "none" ) {
- display = "block";
- }
- defaultDisplayMap[ nodeName ] = display;
-
- return display;
-}
-
-function showHide( elements, show ) {
- var display, elem,
- values = [],
- index = 0,
- length = elements.length;
-
- // Determine new display value for elements that need to change
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- display = elem.style.display;
- if ( show ) {
-
- // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
- // check is required in this first loop unless we have a nonempty display value (either
- // inline or about-to-be-restored)
- if ( display === "none" ) {
- values[ index ] = dataPriv.get( elem, "display" ) || null;
- if ( !values[ index ] ) {
- elem.style.display = "";
- }
- }
- if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
- values[ index ] = getDefaultDisplay( elem );
- }
- } else {
- if ( display !== "none" ) {
- values[ index ] = "none";
-
- // Remember what we're overwriting
- dataPriv.set( elem, "display", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop to avoid constant reflow
- for ( index = 0; index < length; index++ ) {
- if ( values[ index ] != null ) {
- elements[ index ].style.display = values[ index ];
- }
- }
-
- return elements;
-}
-
-jQuery.fn.extend( {
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state ) {
- if ( typeof state === "boolean" ) {
- return state ? this.show() : this.hide();
- }
-
- return this.each( function() {
- if ( isHiddenWithinTree( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- } );
- }
-} );
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
-
-var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
-
-
-
-( function() {
- var fragment = document.createDocumentFragment(),
- div = fragment.appendChild( document.createElement( "div" ) ),
- input = document.createElement( "input" );
-
- // Support: Android 4.0 - 4.3 only
- // Check state lost if the name is set (#11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Android <=4.1 only
- // Older WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE <=11 only
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
- // Support: IE <=9 only
- // IE <=9 replaces <option> tags with their contents when inserted outside of
- // the select element.
- div.innerHTML = "<option></option>";
- support.option = !!div.lastChild;
-} )();
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
- // XHTML parsers do not magically insert elements in the
- // same way that tag soup parsers do. So we cannot shorten
- // this by omitting <tbody> or other required elements.
- thead: [ 1, "<table>", "</table>" ],
- col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
- _default: [ 0, "", "" ]
-};
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// Support: IE <=9 only
-if ( !support.option ) {
- wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
-}
-
-
-function getAll( context, tag ) {
-
- // Support: IE <=9 - 11 only
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
- var ret;
-
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- ret = context.getElementsByTagName( tag || "*" );
-
- } else if ( typeof context.querySelectorAll !== "undefined" ) {
- ret = context.querySelectorAll( tag || "*" );
-
- } else {
- ret = [];
- }
-
- if ( tag === undefined || tag && nodeName( context, tag ) ) {
- return jQuery.merge( [ context ], ret );
- }
-
- return ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- dataPriv.set(
- elems[ i ],
- "globalEval",
- !refElements || dataPriv.get( refElements[ i ], "globalEval" )
- );
- }
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
- var elem, tmp, tag, wrap, attached, j,
- fragment = context.createDocumentFragment(),
- nodes = [],
- i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
-
- if ( elem || elem === 0 ) {
-
- // Add nodes directly
- if ( toType( elem ) === "object" ) {
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
- // Convert non-html into a text node
- } else if ( !rhtml.test( elem ) ) {
- nodes.push( context.createTextNode( elem ) );
-
- // Convert html into DOM nodes
- } else {
- tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
- tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
- // Descend through wrappers to the right content
- j = wrap[ 0 ];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, tmp.childNodes );
-
- // Remember the top-level container
- tmp = fragment.firstChild;
-
- // Ensure the created nodes are orphaned (#12392)
- tmp.textContent = "";
- }
- }
- }
-
- // Remove wrapper from fragment
- fragment.textContent = "";
-
- i = 0;
- while ( ( elem = nodes[ i++ ] ) ) {
-
- // Skip elements already in the context collection (trac-4087)
- if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
- if ( ignored ) {
- ignored.push( elem );
- }
- continue;
- }
-
- attached = isAttached( elem );
-
- // Append to fragment
- tmp = getAll( fragment.appendChild( elem ), "script" );
-
- // Preserve script evaluation history
- if ( attached ) {
- setGlobalEval( tmp );
- }
-
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( ( elem = tmp[ j++ ] ) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
- }
-
- return fragment;
-}
-
-
-var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
- return true;
-}
-
-function returnFalse() {
- return false;
-}
-
-// Support: IE <=9 - 11+
-// focus() and blur() are asynchronous, except when they are no-op.
-// So expect focus to be synchronous when the element is already active,
-// and blur to be synchronous when the element is not already active.
-// (focus and blur are always synchronous in other supported browsers,
-// this just defines when we can count on it).
-function expectSync( elem, type ) {
- return ( elem === safeActiveElement() ) === ( type === "focus" );
-}
-
-// Support: IE <=9 only
-// Accessing document.activeElement can throw unexpectedly
-// https://bugs.jquery.com/ticket/13393
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
-
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
-
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- on( elem, type, selector, data, types[ type ], one );
- }
- return elem;
- }
-
- if ( data == null && fn == null ) {
-
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
-
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
-
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return elem;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
-
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
-
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return elem.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- } );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- global: {},
-
- add: function( elem, types, handler, data, selector ) {
-
- var handleObjIn, eventHandle, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.get( elem );
-
- // Only attach events to objects that accept data
- if ( !acceptData( elem ) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Ensure that invalid selectors throw exceptions at attach time
- // Evaluate against documentElement in case elem is a non-element node (e.g., document)
- if ( selector ) {
- jQuery.find.matchesSelector( documentElement, selector );
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- if ( !( events = elemData.events ) ) {
- events = elemData.events = Object.create( null );
- }
- if ( !( eventHandle = elemData.handle ) ) {
- eventHandle = elemData.handle = function( e ) {
-
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
- jQuery.event.dispatch.apply( elem, arguments ) : undefined;
- };
- }
-
- // Handle multiple events separated by a space
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // There *must* be a type, no attaching namespace-only handlers
- if ( !type ) {
- continue;
- }
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend( {
- type: type,
- origType: origType,
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join( "." )
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- if ( !( handlers = events[ type ] ) ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener if the special events handler returns false
- if ( !special.setup ||
- special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- },
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var j, origCount, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
- if ( !elemData || !( events = elemData.events ) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector ? special.delegateType : special.bindType ) || type;
- handlers = events[ type ] || [];
- tmp = tmp[ 2 ] &&
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
- // Remove matching events
- origCount = j = handlers.length;
- while ( j-- ) {
- handleObj = handlers[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !tmp || tmp.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector ||
- selector === "**" && handleObj.selector ) ) {
- handlers.splice( j, 1 );
-
- if ( handleObj.selector ) {
- handlers.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( origCount && !handlers.length ) {
- if ( !special.teardown ||
- special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove data and the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- dataPriv.remove( elem, "handle events" );
- }
- },
-
- dispatch: function( nativeEvent ) {
-
- var i, j, ret, matched, handleObj, handlerQueue,
- args = new Array( arguments.length ),
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( nativeEvent ),
-
- handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
- special = jQuery.event.special[ event.type ] || {};
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[ 0 ] = event;
-
- for ( i = 1; i < arguments.length; i++ ) {
- args[ i ] = arguments[ i ];
- }
-
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers
- handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
- // Run delegates first; they may want to stop propagation beneath us
- i = 0;
- while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
- event.currentTarget = matched.elem;
-
- j = 0;
- while ( ( handleObj = matched.handlers[ j++ ] ) &&
- !event.isImmediatePropagationStopped() ) {
-
- // If the event is namespaced, then each handler is only invoked if it is
- // specially universal or its namespaces are a superset of the event's.
- if ( !event.rnamespace || handleObj.namespace === false ||
- event.rnamespace.test( handleObj.namespace ) ) {
-
- event.handleObj = handleObj;
- event.data = handleObj.data;
-
- ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
- handleObj.handler ).apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- if ( ( event.result = ret ) === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- handlers: function( event, handlers ) {
- var i, handleObj, sel, matchedHandlers, matchedSelectors,
- handlerQueue = [],
- delegateCount = handlers.delegateCount,
- cur = event.target;
-
- // Find delegate handlers
- if ( delegateCount &&
-
- // Support: IE <=9
- // Black-hole SVG <use> instance trees (trac-13180)
- cur.nodeType &&
-
- // Support: Firefox <=42
- // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
- // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
- // Support: IE 11 only
- // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
- !( event.type === "click" && event.button >= 1 ) ) {
-
- for ( ; cur !== this; cur = cur.parentNode || this ) {
-
- // Don't check non-elements (#13208)
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
- matchedHandlers = [];
- matchedSelectors = {};
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
-
- // Don't conflict with Object.prototype properties (#13203)
- sel = handleObj.selector + " ";
-
- if ( matchedSelectors[ sel ] === undefined ) {
- matchedSelectors[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) > -1 :
- jQuery.find( sel, this, null, [ cur ] ).length;
- }
- if ( matchedSelectors[ sel ] ) {
- matchedHandlers.push( handleObj );
- }
- }
- if ( matchedHandlers.length ) {
- handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- cur = this;
- if ( delegateCount < handlers.length ) {
- handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
- }
-
- return handlerQueue;
- },
-
- addProp: function( name, hook ) {
- Object.defineProperty( jQuery.Event.prototype, name, {
- enumerable: true,
- configurable: true,
-
- get: isFunction( hook ) ?
- function() {
- if ( this.originalEvent ) {
- return hook( this.originalEvent );
- }
- } :
- function() {
- if ( this.originalEvent ) {
- return this.originalEvent[ name ];
- }
- },
-
- set: function( value ) {
- Object.defineProperty( this, name, {
- enumerable: true,
- configurable: true,
- writable: true,
- value: value
- } );
- }
- } );
- },
-
- fix: function( originalEvent ) {
- return originalEvent[ jQuery.expando ] ?
- originalEvent :
- new jQuery.Event( originalEvent );
- },
-
- special: {
- load: {
-
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
- click: {
-
- // Utilize native event to ensure correct state for checkable inputs
- setup: function( data ) {
-
- // For mutual compressibility with _default, replace `this` access with a local var.
- // `|| data` is dead code meant only to preserve the variable through minification.
- var el = this || data;
-
- // Claim the first handler
- if ( rcheckableType.test( el.type ) &&
- el.click && nodeName( el, "input" ) ) {
-
- // dataPriv.set( el, "click", ... )
- leverageNative( el, "click", returnTrue );
- }
-
- // Return false to allow normal processing in the caller
- return false;
- },
- trigger: function( data ) {
-
- // For mutual compressibility with _default, replace `this` access with a local var.
- // `|| data` is dead code meant only to preserve the variable through minification.
- var el = this || data;
-
- // Force setup before triggering a click
- if ( rcheckableType.test( el.type ) &&
- el.click && nodeName( el, "input" ) ) {
-
- leverageNative( el, "click" );
- }
-
- // Return non-false to allow normal event-path propagation
- return true;
- },
-
- // For cross-browser consistency, suppress native .click() on links
- // Also prevent it if we're currently inside a leveraged native-event stack
- _default: function( event ) {
- var target = event.target;
- return rcheckableType.test( target.type ) &&
- target.click && nodeName( target, "input" ) &&
- dataPriv.get( target, "click" ) ||
- nodeName( target, "a" );
- }
- },
-
- beforeunload: {
- postDispatch: function( event ) {
-
- // Support: Firefox 20+
- // Firefox doesn't alert if the returnValue field is not set.
- if ( event.result !== undefined && event.originalEvent ) {
- event.originalEvent.returnValue = event.result;
- }
- }
- }
- }
-};
-
-// Ensure the presence of an event listener that handles manually-triggered
-// synthetic events by interrupting progress until reinvoked in response to
-// *native* events that it fires directly, ensuring that state changes have
-// already occurred before other listeners are invoked.
-function leverageNative( el, type, expectSync ) {
-
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
- if ( !expectSync ) {
- if ( dataPriv.get( el, type ) === undefined ) {
- jQuery.event.add( el, type, returnTrue );
- }
- return;
- }
-
- // Register the controller as a special universal handler for all event namespaces
- dataPriv.set( el, type, false );
- jQuery.event.add( el, type, {
- namespace: false,
- handler: function( event ) {
- var notAsync, result,
- saved = dataPriv.get( this, type );
-
- if ( ( event.isTrigger & 1 ) && this[ type ] ) {
-
- // Interrupt processing of the outer synthetic .trigger()ed event
- // Saved data should be false in such cases, but might be a leftover capture object
- // from an async native handler (gh-4350)
- if ( !saved.length ) {
-
- // Store arguments for use when handling the inner native event
- // There will always be at least one argument (an event object), so this array
- // will not be confused with a leftover capture object.
- saved = slice.call( arguments );
- dataPriv.set( this, type, saved );
-
- // Trigger the native event and capture its result
- // Support: IE <=9 - 11+
- // focus() and blur() are asynchronous
- notAsync = expectSync( this, type );
- this[ type ]();
- result = dataPriv.get( this, type );
- if ( saved !== result || notAsync ) {
- dataPriv.set( this, type, false );
- } else {
- result = {};
- }
- if ( saved !== result ) {
-
- // Cancel the outer synthetic event
- event.stopImmediatePropagation();
- event.preventDefault();
-
- // Support: Chrome 86+
- // In Chrome, if an element having a focusout handler is blurred by
- // clicking outside of it, it invokes the handler synchronously. If
- // that handler calls `.remove()` on the element, the data is cleared,
- // leaving `result` undefined. We need to guard against this.
- return result && result.value;
- }
-
- // If this is an inner synthetic event for an event with a bubbling surrogate
- // (focus or blur), assume that the surrogate already propagated from triggering the
- // native event and prevent that from happening again here.
- // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
- // bubbling surrogate propagates *after* the non-bubbling base), but that seems
- // less bad than duplication.
- } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
- event.stopPropagation();
- }
-
- // If this is a native event triggered above, everything is now in order
- // Fire an inner synthetic event with the original arguments
- } else if ( saved.length ) {
-
- // ...and capture the result
- dataPriv.set( this, type, {
- value: jQuery.event.trigger(
-
- // Support: IE <=9 - 11+
- // Extend with the prototype to reset the above stopImmediatePropagation()
- jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
- saved.slice( 1 ),
- this
- )
- } );
-
- // Abort handling of the native event
- event.stopImmediatePropagation();
- }
- }
- } );
-}
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
- // This "if" is needed for plain objects
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle );
- }
-};
-
-jQuery.Event = function( src, props ) {
-
- // Allow instantiation without the 'new' keyword
- if ( !( this instanceof jQuery.Event ) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = src.defaultPrevented ||
- src.defaultPrevented === undefined &&
-
- // Support: Android <=2.3 only
- src.returnValue === false ?
- returnTrue :
- returnFalse;
-
- // Create target properties
- // Support: Safari <=6 - 7 only
- // Target should not be a text node (#504, #13143)
- this.target = ( src.target && src.target.nodeType === 3 ) ?
- src.target.parentNode :
- src.target;
-
- this.currentTarget = src.currentTarget;
- this.relatedTarget = src.relatedTarget;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || Date.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- constructor: jQuery.Event,
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse,
- isSimulated: false,
-
- preventDefault: function() {
- var e = this.originalEvent;
-
- this.isDefaultPrevented = returnTrue;
-
- if ( e && !this.isSimulated ) {
- e.preventDefault();
- }
- },
- stopPropagation: function() {
- var e = this.originalEvent;
-
- this.isPropagationStopped = returnTrue;
-
- if ( e && !this.isSimulated ) {
- e.stopPropagation();
- }
- },
- stopImmediatePropagation: function() {
- var e = this.originalEvent;
-
- this.isImmediatePropagationStopped = returnTrue;
-
- if ( e && !this.isSimulated ) {
- e.stopImmediatePropagation();
- }
-
- this.stopPropagation();
- }
-};
-
-// Includes all common event props including KeyEvent and MouseEvent specific props
-jQuery.each( {
- altKey: true,
- bubbles: true,
- cancelable: true,
- changedTouches: true,
- ctrlKey: true,
- detail: true,
- eventPhase: true,
- metaKey: true,
- pageX: true,
- pageY: true,
- shiftKey: true,
- view: true,
- "char": true,
- code: true,
- charCode: true,
- key: true,
- keyCode: true,
- button: true,
- buttons: true,
- clientX: true,
- clientY: true,
- offsetX: true,
- offsetY: true,
- pointerId: true,
- pointerType: true,
- screenX: true,
- screenY: true,
- targetTouches: true,
- toElement: true,
- touches: true,
- which: true
-}, jQuery.event.addProp );
-
-jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
- jQuery.event.special[ type ] = {
-
- // Utilize native event if possible so blur/focus sequence is correct
- setup: function() {
-
- // Claim the first handler
- // dataPriv.set( this, "focus", ... )
- // dataPriv.set( this, "blur", ... )
- leverageNative( this, type, expectSync );
-
- // Return false to allow normal processing in the caller
- return false;
- },
- trigger: function() {
-
- // Force setup before trigger
- leverageNative( this, type );
-
- // Return non-false to allow normal event-path propagation
- return true;
- },
-
- // Suppress native focus or blur as it's already being fired
- // in leverageNative.
- _default: function() {
- return true;
- },
-
- delegateType: delegateType
- };
-} );
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
- mouseenter: "mouseover",
- mouseleave: "mouseout",
- pointerenter: "pointerover",
- pointerleave: "pointerout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj;
-
- // For mouseenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-} );
-
-jQuery.fn.extend( {
-
- on: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn );
- },
- one: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
-
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ?
- handleObj.origType + "." + handleObj.namespace :
- handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
-
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
-
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each( function() {
- jQuery.event.remove( this, types, fn, selector );
- } );
- }
-} );
-
-
-var
-
- // Support: IE <=10 - 11, Edge 12 - 13 only
- // In IE/Edge using regex groups here causes severe slowdowns.
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
- rnoInnerhtml = /<script|<style|<link/i,
-
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Prefer a tbody over its parent table for containing new rows
-function manipulationTarget( elem, content ) {
- if ( nodeName( elem, "table" ) &&
- nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
-
- return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
- }
-
- return elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
- elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
- return elem;
-}
-function restoreScript( elem ) {
- if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
- elem.type = elem.type.slice( 5 );
- } else {
- elem.removeAttribute( "type" );
- }
-
- return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
- var i, l, type, pdataOld, udataOld, udataCur, events;
-
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // 1. Copy private data: events, handlers, etc.
- if ( dataPriv.hasData( src ) ) {
- pdataOld = dataPriv.get( src );
- events = pdataOld.events;
-
- if ( events ) {
- dataPriv.remove( dest, "handle events" );
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
- }
-
- // 2. Copy user data
- if ( dataUser.hasData( src ) ) {
- udataOld = dataUser.access( src );
- udataCur = jQuery.extend( {}, udataOld );
-
- dataUser.set( dest, udataCur );
- }
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
- var nodeName = dest.nodeName.toLowerCase();
-
- // Fails to persist the checked state of a cloned checkbox or radio button.
- if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
- dest.checked = src.checked;
-
- // Fails to return the selected option to the default selected state when cloning options
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
- // Flatten any nested arrays
- args = flat( args );
-
- var fragment, first, scripts, hasScripts, node, doc,
- i = 0,
- l = collection.length,
- iNoClone = l - 1,
- value = args[ 0 ],
- valueIsFunction = isFunction( value );
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( valueIsFunction ||
- ( l > 1 && typeof value === "string" &&
- !support.checkClone && rchecked.test( value ) ) ) {
- return collection.each( function( index ) {
- var self = collection.eq( index );
- if ( valueIsFunction ) {
- args[ 0 ] = value.call( this, index, self.html() );
- }
- domManip( self, args, callback, ignored );
- } );
- }
-
- if ( l ) {
- fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- // Require either new content or an interest in ignored elements to invoke the callback
- if ( first || ignored ) {
- scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
- hasScripts = scripts.length;
-
- // Use the original fragment for the last item
- // instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- for ( ; i < l; i++ ) {
- node = fragment;
-
- if ( i !== iNoClone ) {
- node = jQuery.clone( node, true, true );
-
- // Keep references to cloned scripts for later restoration
- if ( hasScripts ) {
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( scripts, getAll( node, "script" ) );
- }
- }
-
- callback.call( collection[ i ], node, i );
- }
-
- if ( hasScripts ) {
- doc = scripts[ scripts.length - 1 ].ownerDocument;
-
- // Reenable scripts
- jQuery.map( scripts, restoreScript );
-
- // Evaluate executable scripts on first document insertion
- for ( i = 0; i < hasScripts; i++ ) {
- node = scripts[ i ];
- if ( rscriptType.test( node.type || "" ) &&
- !dataPriv.access( node, "globalEval" ) &&
- jQuery.contains( doc, node ) ) {
-
- if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
-
- // Optional AJAX dependency, but won't run scripts if not present
- if ( jQuery._evalUrl && !node.noModule ) {
- jQuery._evalUrl( node.src, {
- nonce: node.nonce || node.getAttribute( "nonce" )
- }, doc );
- }
- } else {
- DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
- }
- }
- }
- }
- }
- }
-
- return collection;
-}
-
-function remove( elem, selector, keepData ) {
- var node,
- nodes = selector ? jQuery.filter( selector, elem ) : elem,
- i = 0;
-
- for ( ; ( node = nodes[ i ] ) != null; i++ ) {
- if ( !keepData && node.nodeType === 1 ) {
- jQuery.cleanData( getAll( node ) );
- }
-
- if ( node.parentNode ) {
- if ( keepData && isAttached( node ) ) {
- setGlobalEval( getAll( node, "script" ) );
- }
- node.parentNode.removeChild( node );
- }
- }
-
- return elem;
-}
-
-jQuery.extend( {
- htmlPrefilter: function( html ) {
- return html;
- },
-
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var i, l, srcElements, destElements,
- clone = elem.cloneNode( true ),
- inPage = isAttached( elem );
-
- // Fix IE cloning issues
- if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
- !jQuery.isXMLDoc( elem ) ) {
-
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
- destElements = getAll( clone );
- srcElements = getAll( elem );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- fixInput( srcElements[ i ], destElements[ i ] );
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- if ( deepDataAndEvents ) {
- srcElements = srcElements || getAll( elem );
- destElements = destElements || getAll( clone );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- cloneCopyEvent( srcElements[ i ], destElements[ i ] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
-
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
-
- // Return the cloned set
- return clone;
- },
-
- cleanData: function( elems ) {
- var data, elem, type,
- special = jQuery.event.special,
- i = 0;
-
- for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
- if ( acceptData( elem ) ) {
- if ( ( data = elem[ dataPriv.expando ] ) ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
-
- // Support: Chrome <=35 - 45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataPriv.expando ] = undefined;
- }
- if ( elem[ dataUser.expando ] ) {
-
- // Support: Chrome <=35 - 45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataUser.expando ] = undefined;
- }
- }
- }
- }
-} );
-
-jQuery.fn.extend( {
- detach: function( selector ) {
- return remove( this, selector, true );
- },
-
- remove: function( selector ) {
- return remove( this, selector );
- },
-
- text: function( value ) {
- return access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().each( function() {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- this.textContent = value;
- }
- } );
- }, null, value, arguments.length );
- },
-
- append: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.appendChild( elem );
- }
- } );
- },
-
- prepend: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.insertBefore( elem, target.firstChild );
- }
- } );
- },
-
- before: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this );
- }
- } );
- },
-
- after: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- }
- } );
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; ( elem = this[ i ] ) != null; i++ ) {
- if ( elem.nodeType === 1 ) {
-
- // Prevent memory leaks
- jQuery.cleanData( getAll( elem, false ) );
-
- // Remove any remaining nodes
- elem.textContent = "";
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function() {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- } );
- },
-
- html: function( value ) {
- return access( this, function( value ) {
- var elem = this[ 0 ] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined && elem.nodeType === 1 ) {
- return elem.innerHTML;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
- value = jQuery.htmlPrefilter( value );
-
- try {
- for ( ; i < l; i++ ) {
- elem = this[ i ] || {};
-
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch ( e ) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function() {
- var ignored = [];
-
- // Make the changes, replacing each non-ignored context element with the new content
- return domManip( this, arguments, function( elem ) {
- var parent = this.parentNode;
-
- if ( jQuery.inArray( this, ignored ) < 0 ) {
- jQuery.cleanData( getAll( this ) );
- if ( parent ) {
- parent.replaceChild( elem, this );
- }
- }
-
- // Force callback invocation
- }, ignored );
- }
-} );
-
-jQuery.each( {
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- ret = [],
- insert = jQuery( selector ),
- last = insert.length - 1,
- i = 0;
-
- for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone( true );
- jQuery( insert[ i ] )[ original ]( elems );
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // .get() because push.apply(_, arraylike) throws on ancient WebKit
- push.apply( ret, elems.get() );
- }
-
- return this.pushStack( ret );
- };
-} );
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
- // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
- // IE throws on elements created in popups
- // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
- var view = elem.ownerDocument.defaultView;
-
- if ( !view || !view.opener ) {
- view = window;
- }
-
- return view.getComputedStyle( elem );
- };
-
-var swap = function( elem, options, callback ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
-};
-
-
-var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
-
-
-
-( function() {
-
- // Executing both pixelPosition & boxSizingReliable tests require only one layout
- // so they're executed at the same time to save the second computation.
- function computeStyleTests() {
-
- // This is a singleton, we need to execute it only once
- if ( !div ) {
- return;
- }
-
- container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
- "margin-top:1px;padding:0;border:0";
- div.style.cssText =
- "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
- "margin:auto;border:1px;padding:1px;" +
- "width:60%;top:1%";
- documentElement.appendChild( container ).appendChild( div );
-
- var divStyle = window.getComputedStyle( div );
- pixelPositionVal = divStyle.top !== "1%";
-
- // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
- reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
-
- // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
- // Some styles come back with percentage values, even though they shouldn't
- div.style.right = "60%";
- pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
-
- // Support: IE 9 - 11 only
- // Detect misreporting of content dimensions for box-sizing:border-box elements
- boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
-
- // Support: IE 9 only
- // Detect overflow:scroll screwiness (gh-3699)
- // Support: Chrome <=64
- // Don't get tricked when zoom affects offsetWidth (gh-4029)
- div.style.position = "absolute";
- scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
-
- documentElement.removeChild( container );
-
- // Nullify the div so it wouldn't be stored in the memory and
- // it will also be a sign that checks already performed
- div = null;
- }
-
- function roundPixelMeasures( measure ) {
- return Math.round( parseFloat( measure ) );
- }
-
- var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
- reliableTrDimensionsVal, reliableMarginLeftVal,
- container = document.createElement( "div" ),
- div = document.createElement( "div" );
-
- // Finish early in limited (non-browser) environments
- if ( !div.style ) {
- return;
- }
-
- // Support: IE <=9 - 11 only
- // Style of cloned element affects source element cloned (#8908)
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
- jQuery.extend( support, {
- boxSizingReliable: function() {
- computeStyleTests();
- return boxSizingReliableVal;
- },
- pixelBoxStyles: function() {
- computeStyleTests();
- return pixelBoxStylesVal;
- },
- pixelPosition: function() {
- computeStyleTests();
- return pixelPositionVal;
- },
- reliableMarginLeft: function() {
- computeStyleTests();
- return reliableMarginLeftVal;
- },
- scrollboxSize: function() {
- computeStyleTests();
- return scrollboxSizeVal;
- },
-
- // Support: IE 9 - 11+, Edge 15 - 18+
- // IE/Edge misreport `getComputedStyle` of table rows with width/height
- // set in CSS while `offset*` properties report correct values.
- // Behavior in IE 9 is more subtle than in newer versions & it passes
- // some versions of this test; make sure not to make it pass there!
- //
- // Support: Firefox 70+
- // Only Firefox includes border widths
- // in computed dimensions. (gh-4529)
- reliableTrDimensions: function() {
- var table, tr, trChild, trStyle;
- if ( reliableTrDimensionsVal == null ) {
- table = document.createElement( "table" );
- tr = document.createElement( "tr" );
- trChild = document.createElement( "div" );
-
- table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
- tr.style.cssText = "border:1px solid";
-
- // Support: Chrome 86+
- // Height set through cssText does not get applied.
- // Computed height then comes back as 0.
- tr.style.height = "1px";
- trChild.style.height = "9px";
-
- // Support: Android 8 Chrome 86+
- // In our bodyBackground.html iframe,
- // display for all div elements is set to "inline",
- // which causes a problem only in Android 8 Chrome 86.
- // Ensuring the div is display: block
- // gets around this issue.
- trChild.style.display = "block";
-
- documentElement
- .appendChild( table )
- .appendChild( tr )
- .appendChild( trChild );
-
- trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
- parseInt( trStyle.borderTopWidth, 10 ) +
- parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
-
- documentElement.removeChild( table );
- }
- return reliableTrDimensionsVal;
- }
- } );
-} )();
-
-
-function curCSS( elem, name, computed ) {
- var width, minWidth, maxWidth, ret,
-
- // Support: Firefox 51+
- // Retrieving style before computed somehow
- // fixes an issue with getting wrong values
- // on detached elements
- style = elem.style;
-
- computed = computed || getStyles( elem );
-
- // getPropertyValue is needed for:
- // .css('filter') (IE 9 only, #12537)
- // .css('--customProperty) (#3144)
- if ( computed ) {
- ret = computed.getPropertyValue( name ) || computed[ name ];
-
- if ( ret === "" && !isAttached( elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Android Browser returns percentage for some values,
- // but width seems to be reliably pixels.
- // This is against the CSSOM draft spec:
- // https://drafts.csswg.org/cssom/#resolved-values
- if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
-
- // Remember the original values
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
-
- // Put in the new values to get a computed value out
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
-
- // Revert the changed values
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
- }
- }
-
- return ret !== undefined ?
-
- // Support: IE <=9 - 11 only
- // IE returns zIndex value as an integer.
- ret + "" :
- ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
- // Define the hook, we'll check on the first run if it's really needed.
- return {
- get: function() {
- if ( conditionFn() ) {
-
- // Hook not needed (or it's not possible to use it due
- // to missing dependency), remove it.
- delete this.get;
- return;
- }
-
- // Hook needed; redefine it so that the support test is not executed again.
- return ( this.get = hookFn ).apply( this, arguments );
- }
- };
-}
-
-
-var cssPrefixes = [ "Webkit", "Moz", "ms" ],
- emptyStyle = document.createElement( "div" ).style,
- vendorProps = {};
-
-// Return a vendor-prefixed property or undefined
-function vendorPropName( name ) {
-
- // Check for vendor prefixed names
- var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in emptyStyle ) {
- return name;
- }
- }
-}
-
-// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
-function finalPropName( name ) {
- var final = jQuery.cssProps[ name ] || vendorProps[ name ];
-
- if ( final ) {
- return final;
- }
- if ( name in emptyStyle ) {
- return name;
- }
- return vendorProps[ name ] = vendorPropName( name ) || name;
-}
-
-
-var
-
- // Swappable if display is none or starts with table
- // except "table", "table-cell", or "table-caption"
- // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
- rcustomProp = /^--/,
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: "0",
- fontWeight: "400"
- };
-
-function setPositiveNumber( _elem, value, subtract ) {
-
- // Any relative (+/-) values have already been
- // normalized at this point
- var matches = rcssNum.exec( value );
- return matches ?
-
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
- value;
-}
-
-function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
- var i = dimension === "width" ? 1 : 0,
- extra = 0,
- delta = 0;
-
- // Adjustment may not be necessary
- if ( box === ( isBorderBox ? "border" : "content" ) ) {
- return 0;
- }
-
- for ( ; i < 4; i += 2 ) {
-
- // Both box models exclude margin
- if ( box === "margin" ) {
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
- }
-
- // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
- if ( !isBorderBox ) {
-
- // Add padding
- delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
- // For "border" or "margin", add border
- if ( box !== "padding" ) {
- delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-
- // But still keep track of it otherwise
- } else {
- extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
-
- // If we get here with a border-box (content + padding + border), we're seeking "content" or
- // "padding" or "margin"
- } else {
-
- // For "content", subtract padding
- if ( box === "content" ) {
- delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
- }
-
- // For "content" or "padding", subtract border
- if ( box !== "margin" ) {
- delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- }
- }
-
- // Account for positive content-box scroll gutter when requested by providing computedVal
- if ( !isBorderBox && computedVal >= 0 ) {
-
- // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
- // Assuming integer scroll gutter, subtract the rest and round down
- delta += Math.max( 0, Math.ceil(
- elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
- computedVal -
- delta -
- extra -
- 0.5
-
- // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
- // Use an explicit zero to avoid NaN (gh-3964)
- ) ) || 0;
- }
-
- return delta;
-}
-
-function getWidthOrHeight( elem, dimension, extra ) {
-
- // Start with computed style
- var styles = getStyles( elem ),
-
- // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
- // Fake content-box until we know it's needed to know the true value.
- boxSizingNeeded = !support.boxSizingReliable() || extra,
- isBorderBox = boxSizingNeeded &&
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- valueIsBorderBox = isBorderBox,
-
- val = curCSS( elem, dimension, styles ),
- offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
-
- // Support: Firefox <=54
- // Return a confounding non-pixel value or feign ignorance, as appropriate.
- if ( rnumnonpx.test( val ) ) {
- if ( !extra ) {
- return val;
- }
- val = "auto";
- }
-
-
- // Support: IE 9 - 11 only
- // Use offsetWidth/offsetHeight for when box sizing is unreliable.
- // In those cases, the computed value can be trusted to be border-box.
- if ( ( !support.boxSizingReliable() && isBorderBox ||
-
- // Support: IE 10 - 11+, Edge 15 - 18+
- // IE/Edge misreport `getComputedStyle` of table rows with width/height
- // set in CSS while `offset*` properties report correct values.
- // Interestingly, in some cases IE 9 doesn't suffer from this issue.
- !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
-
- // Fall back to offsetWidth/offsetHeight when value is "auto"
- // This happens for inline elements with no explicit setting (gh-3571)
- val === "auto" ||
-
- // Support: Android <=4.1 - 4.3 only
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
- !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
-
- // Make sure the element is visible & connected
- elem.getClientRects().length ) {
-
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
- // Where available, offsetWidth/offsetHeight approximate border box dimensions.
- // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
- // retrieved value as a content box dimension.
- valueIsBorderBox = offsetProp in elem;
- if ( valueIsBorderBox ) {
- val = elem[ offsetProp ];
- }
- }
-
- // Normalize "" and auto
- val = parseFloat( val ) || 0;
-
- // Adjust for the element's box model
- return ( val +
- boxModelAdjustment(
- elem,
- dimension,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox,
- styles,
-
- // Provide the current computed size to request scroll gutter calculation (gh-3589)
- val
- )
- ) + "px";
-}
-
-jQuery.extend( {
-
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
-
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
- }
- }
- }
- },
-
- // Don't automatically add "px" to these possibly-unitless properties
- cssNumber: {
- "animationIterationCount": true,
- "columnCount": true,
- "fillOpacity": true,
- "flexGrow": true,
- "flexShrink": true,
- "fontWeight": true,
- "gridArea": true,
- "gridColumn": true,
- "gridColumnEnd": true,
- "gridColumnStart": true,
- "gridRow": true,
- "gridRowEnd": true,
- "gridRowStart": true,
- "lineHeight": true,
- "opacity": true,
- "order": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {},
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
-
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, hooks,
- origName = camelCase( name ),
- isCustomProp = rcustomProp.test( name ),
- style = elem.style;
-
- // Make sure that we're working with the right name. We don't
- // want to query the value if it is a CSS custom property
- // since they are user-defined.
- if ( !isCustomProp ) {
- name = finalPropName( origName );
- }
-
- // Gets hook for the prefixed version, then unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // Convert "+=" or "-=" to relative numbers (#7345)
- if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
- value = adjustCSS( elem, name, ret );
-
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that null and NaN values aren't set (#7116)
- if ( value == null || value !== value ) {
- return;
- }
-
- // If a number was passed in, add the unit (except for certain CSS properties)
- // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
- // "px" to a few hardcoded values.
- if ( type === "number" && !isCustomProp ) {
- value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
- }
-
- // background-* props affect original clone's values
- if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
- style[ name ] = "inherit";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !( "set" in hooks ) ||
- ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
- if ( isCustomProp ) {
- style.setProperty( name, value );
- } else {
- style[ name ] = value;
- }
- }
-
- } else {
-
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks &&
- ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra, styles ) {
- var val, num, hooks,
- origName = camelCase( name ),
- isCustomProp = rcustomProp.test( name );
-
- // Make sure that we're working with the right name. We don't
- // want to modify the value if it is a CSS custom property
- // since they are user-defined.
- if ( !isCustomProp ) {
- name = finalPropName( origName );
- }
-
- // Try prefixed name followed by the unprefixed name
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks ) {
- val = hooks.get( elem, true, extra );
- }
-
- // Otherwise, if a way to get the computed value exists, use that
- if ( val === undefined ) {
- val = curCSS( elem, name, styles );
- }
-
- // Convert "normal" to computed value
- if ( val === "normal" && name in cssNormalTransform ) {
- val = cssNormalTransform[ name ];
- }
-
- // Make numeric if forced or a qualifier was provided and val looks numeric
- if ( extra === "" || extra ) {
- num = parseFloat( val );
- return extra === true || isFinite( num ) ? num || 0 : val;
- }
-
- return val;
- }
-} );
-
-jQuery.each( [ "height", "width" ], function( _i, dimension ) {
- jQuery.cssHooks[ dimension ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
-
- // Certain elements can have dimension info if we invisibly show them
- // but it must have a current display style that would benefit
- return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-
- // Support: Safari 8+
- // Table columns in Safari have non-zero offsetWidth & zero
- // getBoundingClientRect().width unless display is changed.
- // Support: IE <=11 only
- // Running getBoundingClientRect on a disconnected node
- // in IE throws an error.
- ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
- }
- },
-
- set: function( elem, value, extra ) {
- var matches,
- styles = getStyles( elem ),
-
- // Only read styles.position if the test has a chance to fail
- // to avoid forcing a reflow.
- scrollboxSizeBuggy = !support.scrollboxSize() &&
- styles.position === "absolute",
-
- // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
- boxSizingNeeded = scrollboxSizeBuggy || extra,
- isBorderBox = boxSizingNeeded &&
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- subtract = extra ?
- boxModelAdjustment(
- elem,
- dimension,
- extra,
- isBorderBox,
- styles
- ) :
- 0;
-
- // Account for unreliable border-box dimensions by comparing offset* to computed and
- // faking a content-box to get border and padding (gh-3699)
- if ( isBorderBox && scrollboxSizeBuggy ) {
- subtract -= Math.ceil(
- elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
- parseFloat( styles[ dimension ] ) -
- boxModelAdjustment( elem, dimension, "border", false, styles ) -
- 0.5
- );
- }
-
- // Convert to pixels if value adjustment is needed
- if ( subtract && ( matches = rcssNum.exec( value ) ) &&
- ( matches[ 3 ] || "px" ) !== "px" ) {
-
- elem.style[ dimension ] = value;
- value = jQuery.css( elem, dimension );
- }
-
- return setPositiveNumber( elem, value, subtract );
- }
- };
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
- function( elem, computed ) {
- if ( computed ) {
- return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
- elem.getBoundingClientRect().left -
- swap( elem, { marginLeft: 0 }, function() {
- return elem.getBoundingClientRect().left;
- } )
- ) + "px";
- }
- }
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i = 0,
- expanded = {},
-
- // Assumes a single number if not a string
- parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
- for ( ; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-
- if ( prefix !== "margin" ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
- }
-} );
-
-jQuery.fn.extend( {
- css: function( name, value ) {
- return access( this, function( elem, name, value ) {
- var styles, len,
- map = {},
- i = 0;
-
- if ( Array.isArray( name ) ) {
- styles = getStyles( elem );
- len = name.length;
-
- for ( ; i < len; i++ ) {
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
- }
-
- return map;
- }
-
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- }
-} );
-
-
-function Tween( elem, options, prop, end, easing ) {
- return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
- constructor: Tween,
- init: function( elem, options, prop, end, easing, unit ) {
- this.elem = elem;
- this.prop = prop;
- this.easing = easing || jQuery.easing._default;
- this.options = options;
- this.start = this.now = this.cur();
- this.end = end;
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
- },
- cur: function() {
- var hooks = Tween.propHooks[ this.prop ];
-
- return hooks && hooks.get ?
- hooks.get( this ) :
- Tween.propHooks._default.get( this );
- },
- run: function( percent ) {
- var eased,
- hooks = Tween.propHooks[ this.prop ];
-
- if ( this.options.duration ) {
- this.pos = eased = jQuery.easing[ this.easing ](
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- } else {
- this.pos = eased = percent;
- }
- this.now = ( this.end - this.start ) * eased + this.start;
-
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- if ( hooks && hooks.set ) {
- hooks.set( this );
- } else {
- Tween.propHooks._default.set( this );
- }
- return this;
- }
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
- _default: {
- get: function( tween ) {
- var result;
-
- // Use a property on the element directly when it is not a DOM element,
- // or when there is no matching style property that exists.
- if ( tween.elem.nodeType !== 1 ||
- tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
- return tween.elem[ tween.prop ];
- }
-
- // Passing an empty string as a 3rd parameter to .css will automatically
- // attempt a parseFloat and fallback to a string if the parse fails.
- // Simple values such as "10px" are parsed to Float;
- // complex values such as "rotate(1rad)" are returned as-is.
- result = jQuery.css( tween.elem, tween.prop, "" );
-
- // Empty strings, null, undefined and "auto" are converted to 0.
- return !result || result === "auto" ? 0 : result;
- },
- set: function( tween ) {
-
- // Use step hook for back compat.
- // Use cssHook if its there.
- // Use .style if available and use plain properties where available.
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
- tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
- } else {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
- }
-};
-
-// Support: IE <=9 only
-// Panic based approach to setting things on disconnected nodes
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
- set: function( tween ) {
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
-};
-
-jQuery.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p * Math.PI ) / 2;
- },
- _default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
- fxNow, inProgress,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rrun = /queueHooks$/;
-
-function schedule() {
- if ( inProgress ) {
- if ( document.hidden === false && window.requestAnimationFrame ) {
- window.requestAnimationFrame( schedule );
- } else {
- window.setTimeout( schedule, jQuery.fx.interval );
- }
-
- jQuery.fx.tick();
- }
-}
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- window.setTimeout( function() {
- fxNow = undefined;
- } );
- return ( fxNow = Date.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- i = 0,
- attrs = { height: type };
-
- // If we include width, step value is 1 to do all cssExpand values,
- // otherwise step value is 2 to skip over Left and Right
- includeWidth = includeWidth ? 1 : 0;
- for ( ; i < 4; i += 2 - includeWidth ) {
- which = cssExpand[ i ];
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
- }
-
- if ( includeWidth ) {
- attrs.opacity = attrs.width = type;
- }
-
- return attrs;
-}
-
-function createTween( value, prop, animation ) {
- var tween,
- collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
- // We're done with this property
- return tween;
- }
- }
-}
-
-function defaultPrefilter( elem, props, opts ) {
- var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
- isBox = "width" in props || "height" in props,
- anim = this,
- orig = {},
- style = elem.style,
- hidden = elem.nodeType && isHiddenWithinTree( elem ),
- dataShow = dataPriv.get( elem, "fxshow" );
-
- // Queue-skipping animations hijack the fx hooks
- if ( !opts.queue ) {
- hooks = jQuery._queueHooks( elem, "fx" );
- if ( hooks.unqueued == null ) {
- hooks.unqueued = 0;
- oldfire = hooks.empty.fire;
- hooks.empty.fire = function() {
- if ( !hooks.unqueued ) {
- oldfire();
- }
- };
- }
- hooks.unqueued++;
-
- anim.always( function() {
-
- // Ensure the complete handler is called before this completes
- anim.always( function() {
- hooks.unqueued--;
- if ( !jQuery.queue( elem, "fx" ).length ) {
- hooks.empty.fire();
- }
- } );
- } );
- }
-
- // Detect show/hide animations
- for ( prop in props ) {
- value = props[ prop ];
- if ( rfxtypes.test( value ) ) {
- delete props[ prop ];
- toggle = toggle || value === "toggle";
- if ( value === ( hidden ? "hide" : "show" ) ) {
-
- // Pretend to be hidden if this is a "show" and
- // there is still data from a stopped show/hide
- if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
- hidden = true;
-
- // Ignore all other no-op show/hide data
- } else {
- continue;
- }
- }
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
- }
- }
-
- // Bail out if this is a no-op like .hide().hide()
- propTween = !jQuery.isEmptyObject( props );
- if ( !propTween && jQuery.isEmptyObject( orig ) ) {
- return;
- }
-
- // Restrict "overflow" and "display" styles during box animations
- if ( isBox && elem.nodeType === 1 ) {
-
- // Support: IE <=9 - 11, Edge 12 - 15
- // Record all 3 overflow attributes because IE does not infer the shorthand
- // from identically-valued overflowX and overflowY and Edge just mirrors
- // the overflowX value there.
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
- // Identify a display type, preferring old show/hide data over the CSS cascade
- restoreDisplay = dataShow && dataShow.display;
- if ( restoreDisplay == null ) {
- restoreDisplay = dataPriv.get( elem, "display" );
- }
- display = jQuery.css( elem, "display" );
- if ( display === "none" ) {
- if ( restoreDisplay ) {
- display = restoreDisplay;
- } else {
-
- // Get nonempty value(s) by temporarily forcing visibility
- showHide( [ elem ], true );
- restoreDisplay = elem.style.display || restoreDisplay;
- display = jQuery.css( elem, "display" );
- showHide( [ elem ] );
- }
- }
-
- // Animate inline elements as inline-block
- if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
- if ( jQuery.css( elem, "float" ) === "none" ) {
-
- // Restore the original display value at the end of pure show/hide animations
- if ( !propTween ) {
- anim.done( function() {
- style.display = restoreDisplay;
- } );
- if ( restoreDisplay == null ) {
- display = style.display;
- restoreDisplay = display === "none" ? "" : display;
- }
- }
- style.display = "inline-block";
- }
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- anim.always( function() {
- style.overflow = opts.overflow[ 0 ];
- style.overflowX = opts.overflow[ 1 ];
- style.overflowY = opts.overflow[ 2 ];
- } );
- }
-
- // Implement show/hide animations
- propTween = false;
- for ( prop in orig ) {
-
- // General show/hide setup for this element animation
- if ( !propTween ) {
- if ( dataShow ) {
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
- } else {
- dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
- }
-
- // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
- if ( toggle ) {
- dataShow.hidden = !hidden;
- }
-
- // Show elements before animating them
- if ( hidden ) {
- showHide( [ elem ], true );
- }
-
- /* eslint-disable no-loop-func */
-
- anim.done( function() {
-
- /* eslint-enable no-loop-func */
-
- // The final step of a "hide" animation is actually hiding the element
- if ( !hidden ) {
- showHide( [ elem ] );
- }
- dataPriv.remove( elem, "fxshow" );
- for ( prop in orig ) {
- jQuery.style( elem, prop, orig[ prop ] );
- }
- } );
- }
-
- // Per-property setup
- propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
- if ( !( prop in dataShow ) ) {
- dataShow[ prop ] = propTween.start;
- if ( hidden ) {
- propTween.end = propTween.start;
- propTween.start = 0;
- }
- }
- }
-}
-
-function propFilter( props, specialEasing ) {
- var index, name, easing, value, hooks;
-
- // camelCase, specialEasing and expand cssHook pass
- for ( index in props ) {
- name = camelCase( index );
- easing = specialEasing[ name ];
- value = props[ index ];
- if ( Array.isArray( value ) ) {
- easing = value[ 1 ];
- value = props[ index ] = value[ 0 ];
- }
-
- if ( index !== name ) {
- props[ name ] = value;
- delete props[ index ];
- }
-
- hooks = jQuery.cssHooks[ name ];
- if ( hooks && "expand" in hooks ) {
- value = hooks.expand( value );
- delete props[ name ];
-
- // Not quite $.extend, this won't overwrite existing keys.
- // Reusing 'index' because we have the correct "name"
- for ( index in value ) {
- if ( !( index in props ) ) {
- props[ index ] = value[ index ];
- specialEasing[ index ] = easing;
- }
- }
- } else {
- specialEasing[ name ] = easing;
- }
- }
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = Animation.prefilters.length,
- deferred = jQuery.Deferred().always( function() {
-
- // Don't match elem in the :animated selector
- delete tick.elem;
- } ),
- tick = function() {
- if ( stopped ) {
- return false;
- }
- var currentTime = fxNow || createFxNow(),
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
- // Support: Android 2.3 only
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
- temp = remaining / animation.duration || 0,
- percent = 1 - temp,
- index = 0,
- length = animation.tweens.length;
-
- for ( ; index < length; index++ ) {
- animation.tweens[ index ].run( percent );
- }
-
- deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
- // If there's more to do, yield
- if ( percent < 1 && length ) {
- return remaining;
- }
-
- // If this was an empty animation, synthesize a final progress notification
- if ( !length ) {
- deferred.notifyWith( elem, [ animation, 1, 0 ] );
- }
-
- // Resolve the animation and report its conclusion
- deferred.resolveWith( elem, [ animation ] );
- return false;
- },
- animation = deferred.promise( {
- elem: elem,
- props: jQuery.extend( {}, properties ),
- opts: jQuery.extend( true, {
- specialEasing: {},
- easing: jQuery.easing._default
- }, options ),
- originalProperties: properties,
- originalOptions: options,
- startTime: fxNow || createFxNow(),
- duration: options.duration,
- tweens: [],
- createTween: function( prop, end ) {
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
- animation.tweens.push( tween );
- return tween;
- },
- stop: function( gotoEnd ) {
- var index = 0,
-
- // If we are going to the end, we want to run all the tweens
- // otherwise we skip this part
- length = gotoEnd ? animation.tweens.length : 0;
- if ( stopped ) {
- return this;
- }
- stopped = true;
- for ( ; index < length; index++ ) {
- animation.tweens[ index ].run( 1 );
- }
-
- // Resolve when we played the last frame; otherwise, reject
- if ( gotoEnd ) {
- deferred.notifyWith( elem, [ animation, 1, 0 ] );
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
- } else {
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
- }
- return this;
- }
- } ),
- props = animation.props;
-
- propFilter( props, animation.opts.specialEasing );
-
- for ( ; index < length; index++ ) {
- result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- if ( isFunction( result.stop ) ) {
- jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
- result.stop.bind( result );
- }
- return result;
- }
- }
-
- jQuery.map( props, createTween, animation );
-
- if ( isFunction( animation.opts.start ) ) {
- animation.opts.start.call( elem, animation );
- }
-
- // Attach callbacks from options
- animation
- .progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
-
- jQuery.fx.timer(
- jQuery.extend( tick, {
- elem: elem,
- anim: animation,
- queue: animation.opts.queue
- } )
- );
-
- return animation;
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
- tweeners: {
- "*": [ function( prop, value ) {
- var tween = this.createTween( prop, value );
- adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
- return tween;
- } ]
- },
-
- tweener: function( props, callback ) {
- if ( isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.match( rnothtmlwhite );
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length; index++ ) {
- prop = props[ index ];
- Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
- Animation.tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilters: [ defaultPrefilter ],
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- Animation.prefilters.unshift( callback );
- } else {
- Animation.prefilters.push( callback );
- }
- }
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !isFunction( easing ) && easing
- };
-
- // Go to the end state if fx are off
- if ( jQuery.fx.off ) {
- opt.duration = 0;
-
- } else {
- if ( typeof opt.duration !== "number" ) {
- if ( opt.duration in jQuery.fx.speeds ) {
- opt.duration = jQuery.fx.speeds[ opt.duration ];
-
- } else {
- opt.duration = jQuery.fx.speeds._default;
- }
- }
- }
-
- // Normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function() {
- if ( isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- }
- };
-
- return opt;
-};
-
-jQuery.fn.extend( {
- fadeTo: function( speed, to, easing, callback ) {
-
- // Show any hidden elements after setting opacity to 0
- return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
-
- // Animate to the value specified
- .end().animate( { opacity: to }, speed, easing, callback );
- },
- animate: function( prop, speed, easing, callback ) {
- var empty = jQuery.isEmptyObject( prop ),
- optall = jQuery.speed( speed, easing, callback ),
- doAnimation = function() {
-
- // Operate on a copy of prop so per-property easing won't be lost
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
- // Empty animations, or finishing resolves immediately
- if ( empty || dataPriv.get( this, "finish" ) ) {
- anim.stop( true );
- }
- };
-
- doAnimation.finish = doAnimation;
-
- return empty || optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
- stop: function( type, clearQueue, gotoEnd ) {
- var stopQueue = function( hooks ) {
- var stop = hooks.stop;
- delete hooks.stop;
- stop( gotoEnd );
- };
-
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each( function() {
- var dequeue = true,
- index = type != null && type + "queueHooks",
- timers = jQuery.timers,
- data = dataPriv.get( this );
-
- if ( index ) {
- if ( data[ index ] && data[ index ].stop ) {
- stopQueue( data[ index ] );
- }
- } else {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
- stopQueue( data[ index ] );
- }
- }
- }
-
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this &&
- ( type == null || timers[ index ].queue === type ) ) {
-
- timers[ index ].anim.stop( gotoEnd );
- dequeue = false;
- timers.splice( index, 1 );
- }
- }
-
- // Start the next in the queue if the last step wasn't forced.
- // Timers currently will call their complete callbacks, which
- // will dequeue but only if they were gotoEnd.
- if ( dequeue || !gotoEnd ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- finish: function( type ) {
- if ( type !== false ) {
- type = type || "fx";
- }
- return this.each( function() {
- var index,
- data = dataPriv.get( this ),
- queue = data[ type + "queue" ],
- hooks = data[ type + "queueHooks" ],
- timers = jQuery.timers,
- length = queue ? queue.length : 0;
-
- // Enable finishing flag on private data
- data.finish = true;
-
- // Empty the queue first
- jQuery.queue( this, type, [] );
-
- if ( hooks && hooks.stop ) {
- hooks.stop.call( this, true );
- }
-
- // Look for any active animations, and finish them
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
- timers[ index ].anim.stop( true );
- timers.splice( index, 1 );
- }
- }
-
- // Look for any animations in the old queue and finish them
- for ( index = 0; index < length; index++ ) {
- if ( queue[ index ] && queue[ index ].finish ) {
- queue[ index ].finish.call( this );
- }
- }
-
- // Turn off finishing flag
- delete data.finish;
- } );
- }
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
- var cssFn = jQuery.fn[ name ];
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ?
- cssFn.apply( this, arguments ) :
- this.animate( genFx( name, true ), speed, easing, callback );
- };
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
- slideDown: genFx( "show" ),
- slideUp: genFx( "hide" ),
- slideToggle: genFx( "toggle" ),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
- var timer,
- i = 0,
- timers = jQuery.timers;
-
- fxNow = Date.now();
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
-
- // Run the timer and safely remove it when done (allowing for external removal)
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
- jQuery.timers.push( timer );
- jQuery.fx.start();
-};
-
-jQuery.fx.interval = 13;
-jQuery.fx.start = function() {
- if ( inProgress ) {
- return;
- }
-
- inProgress = true;
- schedule();
-};
-
-jQuery.fx.stop = function() {
- inProgress = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
-
- // Default speed
- _default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = window.setTimeout( next, time );
- hooks.stop = function() {
- window.clearTimeout( timeout );
- };
- } );
-};
-
-
-( function() {
- var input = document.createElement( "input" ),
- select = document.createElement( "select" ),
- opt = select.appendChild( document.createElement( "option" ) );
-
- input.type = "checkbox";
-
- // Support: Android <=4.3 only
- // Default value for a checkbox should be "on"
- support.checkOn = input.value !== "";
-
- // Support: IE <=11 only
- // Must access selectedIndex to make default options select
- support.optSelected = opt.selected;
-
- // Support: IE <=11 only
- // An input loses its value after becoming a radio
- input = document.createElement( "input" );
- input.value = "t";
- input.type = "radio";
- support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
- attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
- attr: function( name, value ) {
- return access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each( function() {
- jQuery.removeAttr( this, name );
- } );
- }
-} );
-
-jQuery.extend( {
- attr: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set attributes on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- // Attribute hooks are determined by the lowercase version
- // Grab necessary hook if one is defined
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
- hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
- ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
- }
-
- if ( value !== undefined ) {
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
- }
-
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ? undefined : ret;
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !support.radioValue && value === "radio" &&
- nodeName( elem, "input" ) ) {
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- removeAttr: function( elem, value ) {
- var name,
- i = 0,
-
- // Attribute names can contain non-HTML whitespace characters
- // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
- attrNames = value && value.match( rnothtmlwhite );
-
- if ( attrNames && elem.nodeType === 1 ) {
- while ( ( name = attrNames[ i++ ] ) ) {
- elem.removeAttribute( name );
- }
- }
- }
-} );
-
-// Hooks for boolean attributes
-boolHook = {
- set: function( elem, value, name ) {
- if ( value === false ) {
-
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- elem.setAttribute( name, name );
- }
- return name;
- }
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
- var getter = attrHandle[ name ] || jQuery.find.attr;
-
- attrHandle[ name ] = function( elem, name, isXML ) {
- var ret, handle,
- lowercaseName = name.toLowerCase();
-
- if ( !isXML ) {
-
- // Avoid an infinite loop by temporarily removing this function from the getter
- handle = attrHandle[ lowercaseName ];
- attrHandle[ lowercaseName ] = ret;
- ret = getter( elem, name, isXML ) != null ?
- lowercaseName :
- null;
- attrHandle[ lowercaseName ] = handle;
- }
- return ret;
- };
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
- rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
- prop: function( name, value ) {
- return access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- return this.each( function() {
- delete this[ jQuery.propFix[ name ] || name ];
- } );
- }
-} );
-
-jQuery.extend( {
- prop: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set properties on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- return ( elem[ name ] = value );
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- return elem[ name ];
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
-
- // Support: IE <=9 - 11 only
- // elem.tabIndex doesn't always return the
- // correct value when it hasn't been explicitly set
- // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- // Use proper attribute retrieval(#12072)
- var tabindex = jQuery.find.attr( elem, "tabindex" );
-
- if ( tabindex ) {
- return parseInt( tabindex, 10 );
- }
-
- if (
- rfocusable.test( elem.nodeName ) ||
- rclickable.test( elem.nodeName ) &&
- elem.href
- ) {
- return 0;
- }
-
- return -1;
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- }
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-// eslint rule "no-unused-expressions" is disabled for this code
-// since it considers such accessions noop
-if ( !support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
-
- /* eslint no-unused-expressions: "off" */
-
- var parent = elem.parentNode;
- if ( parent && parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- return null;
- },
- set: function( elem ) {
-
- /* eslint no-unused-expressions: "off" */
-
- var parent = elem.parentNode;
- if ( parent ) {
- parent.selectedIndex;
-
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- };
-}
-
-jQuery.each( [
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
- // Strip and collapse whitespace according to HTML spec
- // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
- function stripAndCollapse( value ) {
- var tokens = value.match( rnothtmlwhite ) || [];
- return tokens.join( " " );
- }
-
-
-function getClass( elem ) {
- return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-function classesToArray( value ) {
- if ( Array.isArray( value ) ) {
- return value;
- }
- if ( typeof value === "string" ) {
- return value.match( rnothtmlwhite ) || [];
- }
- return [];
-}
-
-jQuery.fn.extend( {
- addClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- classes = classesToArray( value );
-
- if ( classes.length ) {
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = stripAndCollapse( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( !arguments.length ) {
- return this.attr( "class", "" );
- }
-
- classes = classesToArray( value );
-
- if ( classes.length ) {
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
-
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
-
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = stripAndCollapse( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isValidValue = type === "string" || Array.isArray( value );
-
- if ( typeof stateVal === "boolean" && isValidValue ) {
- return stateVal ? this.addClass( value ) : this.removeClass( value );
- }
-
- if ( isFunction( value ) ) {
- return this.each( function( i ) {
- jQuery( this ).toggleClass(
- value.call( this, i, getClass( this ), stateVal ),
- stateVal
- );
- } );
- }
-
- return this.each( function() {
- var className, i, self, classNames;
-
- if ( isValidValue ) {
-
- // Toggle individual class names
- i = 0;
- self = jQuery( this );
- classNames = classesToArray( value );
-
- while ( ( className = classNames[ i++ ] ) ) {
-
- // Check each className given, space separated list
- if ( self.hasClass( className ) ) {
- self.removeClass( className );
- } else {
- self.addClass( className );
- }
- }
-
- // Toggle whole class name
- } else if ( value === undefined || type === "boolean" ) {
- className = getClass( this );
- if ( className ) {
-
- // Store className if set
- dataPriv.set( this, "__className__", className );
- }
-
- // If the element has a class name or if we're passed `false`,
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- if ( this.setAttribute ) {
- this.setAttribute( "class",
- className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
- );
- }
- }
- } );
- },
-
- hasClass: function( selector ) {
- var className, elem,
- i = 0;
-
- className = " " + selector + " ";
- while ( ( elem = this[ i++ ] ) ) {
- if ( elem.nodeType === 1 &&
- ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- }
-} );
-
-
-
-
-var rreturn = /\r/g;
-
-jQuery.fn.extend( {
- val: function( value ) {
- var hooks, ret, valueIsFunction,
- elem = this[ 0 ];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] ||
- jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks &&
- "get" in hooks &&
- ( ret = hooks.get( elem, "value" ) ) !== undefined
- ) {
- return ret;
- }
-
- ret = elem.value;
-
- // Handle most common string cases
- if ( typeof ret === "string" ) {
- return ret.replace( rreturn, "" );
- }
-
- // Handle cases where value is null/undef or number
- return ret == null ? "" : ret;
- }
-
- return;
- }
-
- valueIsFunction = isFunction( value );
-
- return this.each( function( i ) {
- var val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( valueIsFunction ) {
- val = value.call( this, i, jQuery( this ).val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
-
- } else if ( typeof val === "number" ) {
- val += "";
-
- } else if ( Array.isArray( val ) ) {
- val = jQuery.map( val, function( value ) {
- return value == null ? "" : value + "";
- } );
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- } );
- }
-} );
-
-jQuery.extend( {
- valHooks: {
- option: {
- get: function( elem ) {
-
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
-
- // Support: IE <=10 - 11 only
- // option.text throws exceptions (#14686, #14858)
- // Strip and collapse whitespace
- // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
- stripAndCollapse( jQuery.text( elem ) );
- }
- },
- select: {
- get: function( elem ) {
- var value, option, i,
- options = elem.options,
- index = elem.selectedIndex,
- one = elem.type === "select-one",
- values = one ? null : [],
- max = one ? index + 1 : options.length;
-
- if ( index < 0 ) {
- i = max;
-
- } else {
- i = one ? index : 0;
- }
-
- // Loop through all the selected options
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Support: IE <=9 only
- // IE8-9 doesn't update selected after form reset (#2551)
- if ( ( option.selected || i === index ) &&
-
- // Don't return options that are disabled or in a disabled optgroup
- !option.disabled &&
- ( !option.parentNode.disabled ||
- !nodeName( option.parentNode, "optgroup" ) ) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var optionSet, option,
- options = elem.options,
- values = jQuery.makeArray( value ),
- i = options.length;
-
- while ( i-- ) {
- option = options[ i ];
-
- /* eslint-disable no-cond-assign */
-
- if ( option.selected =
- jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
- ) {
- optionSet = true;
- }
-
- /* eslint-enable no-cond-assign */
- }
-
- // Force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- }
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- set: function( elem, value ) {
- if ( Array.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
- }
- }
- };
- if ( !support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- };
- }
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-support.focusin = "onfocusin" in window;
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- stopPropagationCallback = function( e ) {
- e.stopPropagation();
- };
-
-jQuery.extend( jQuery.event, {
-
- trigger: function( event, data, elem, onlyHandlers ) {
-
- var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
- eventPath = [ elem || document ],
- type = hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
- cur = lastElement = tmp = elem = elem || document;
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "." ) > -1 ) {
-
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split( "." );
- type = namespaces.shift();
- namespaces.sort();
- }
- ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
- // Caller can pass in a jQuery.Event object, Object, or just an event type string
- event = event[ jQuery.expando ] ?
- event :
- new jQuery.Event( type, typeof event === "object" && event );
-
- // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
- event.isTrigger = onlyHandlers ? 2 : 3;
- event.namespace = namespaces.join( "." );
- event.rnamespace = event.namespace ?
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
- null;
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data == null ?
- [ event ] :
- jQuery.makeArray( data, [ event ] );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- if ( !rfocusMorph.test( bubbleType + type ) ) {
- cur = cur.parentNode;
- }
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( cur );
- tmp = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( tmp === ( elem.ownerDocument || document ) ) {
- eventPath.push( tmp.defaultView || tmp.parentWindow || window );
- }
- }
-
- // Fire handlers on the event path
- i = 0;
- while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
- lastElement = cur;
- event.type = i > 1 ?
- bubbleType :
- special.bindType || type;
-
- // jQuery handler
- handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
- dataPriv.get( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Native handler
- handle = ontype && cur[ ontype ];
- if ( handle && handle.apply && acceptData( cur ) ) {
- event.result = handle.apply( cur, data );
- if ( event.result === false ) {
- event.preventDefault();
- }
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( ( !special._default ||
- special._default.apply( eventPath.pop(), data ) === false ) &&
- acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name as the event.
- // Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- tmp = elem[ ontype ];
-
- if ( tmp ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
-
- if ( event.isPropagationStopped() ) {
- lastElement.addEventListener( type, stopPropagationCallback );
- }
-
- elem[ type ]();
-
- if ( event.isPropagationStopped() ) {
- lastElement.removeEventListener( type, stopPropagationCallback );
- }
-
- jQuery.event.triggered = undefined;
-
- if ( tmp ) {
- elem[ ontype ] = tmp;
- }
- }
- }
- }
-
- return event.result;
- },
-
- // Piggyback on a donor event to simulate a different one
- // Used only for `focus(in | out)` events
- simulate: function( type, elem, event ) {
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- {
- type: type,
- isSimulated: true
- }
- );
-
- jQuery.event.trigger( e, null, elem );
- }
-
-} );
-
-jQuery.fn.extend( {
-
- trigger: function( type, data ) {
- return this.each( function() {
- jQuery.event.trigger( type, data, this );
- } );
- },
- triggerHandler: function( type, data ) {
- var elem = this[ 0 ];
- if ( elem ) {
- return jQuery.event.trigger( type, data, elem, true );
- }
- }
-} );
-
-
-// Support: Firefox <=44
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler on the document while someone wants focusin/focusout
- var handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
-
- // Handle: regular nodes (via `this.ownerDocument`), window
- // (via `this.document`) & document (via `this`).
- var doc = this.ownerDocument || this.document || this,
- attaches = dataPriv.access( doc, fix );
-
- if ( !attaches ) {
- doc.addEventListener( orig, handler, true );
- }
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
- },
- teardown: function() {
- var doc = this.ownerDocument || this.document || this,
- attaches = dataPriv.access( doc, fix ) - 1;
-
- if ( !attaches ) {
- doc.removeEventListener( orig, handler, true );
- dataPriv.remove( doc, fix );
-
- } else {
- dataPriv.access( doc, fix, attaches );
- }
- }
- };
- } );
-}
-var location = window.location;
-
-var nonce = { guid: Date.now() };
-
-var rquery = ( /\?/ );
-
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
- var xml, parserErrorElem;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
-
- // Support: IE 9 - 11 only
- // IE throws on parseFromString with invalid input.
- try {
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {}
-
- parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
- if ( !xml || parserErrorElem ) {
- jQuery.error( "Invalid XML: " + (
- parserErrorElem ?
- jQuery.map( parserErrorElem.childNodes, function( el ) {
- return el.textContent;
- } ).join( "\n" ) :
- data
- ) );
- }
- return xml;
-};
-
-
-var
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
- var name;
-
- if ( Array.isArray( obj ) ) {
-
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
-
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
-
- // Item is non-scalar (array or object), encode its numeric index.
- buildParams(
- prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
- v,
- traditional,
- add
- );
- }
- } );
-
- } else if ( !traditional && toType( obj ) === "object" ) {
-
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
-
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, valueOrFunction ) {
-
- // If value is a function, invoke it and use its return value
- var value = isFunction( valueOrFunction ) ?
- valueOrFunction() :
- valueOrFunction;
-
- s[ s.length ] = encodeURIComponent( key ) + "=" +
- encodeURIComponent( value == null ? "" : value );
- };
-
- if ( a == null ) {
- return "";
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- } );
-
- } else {
-
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" );
-};
-
-jQuery.fn.extend( {
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
- serializeArray: function() {
- return this.map( function() {
-
- // Can add propHook for "elements" to filter or add form elements
- var elements = jQuery.prop( this, "elements" );
- return elements ? jQuery.makeArray( elements ) : this;
- } ).filter( function() {
- var type = this.type;
-
- // Use .is( ":disabled" ) so that fieldset[disabled] works
- return this.name && !jQuery( this ).is( ":disabled" ) &&
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
- ( this.checked || !rcheckableType.test( type ) );
- } ).map( function( _i, elem ) {
- var val = jQuery( this ).val();
-
- if ( val == null ) {
- return null;
- }
-
- if ( Array.isArray( val ) ) {
- return jQuery.map( val, function( val ) {
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } );
- }
-
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ).get();
- }
-} );
-
-
-var
- r20 = /%20/g,
- rhash = /#.*$/,
- rantiCache = /([?&])_=[^&]*/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = "*/".concat( "*" ),
-
- // Anchor tag for parsing the document origin
- originAnchor = document.createElement( "a" );
-
-originAnchor.href = location.href;
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- var dataType,
- i = 0,
- dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
-
- if ( isFunction( func ) ) {
-
- // For each dataType in the dataTypeExpression
- while ( ( dataType = dataTypes[ i++ ] ) ) {
-
- // Prepend if requested
- if ( dataType[ 0 ] === "+" ) {
- dataType = dataType.slice( 1 ) || "*";
- ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
- // Otherwise append
- } else {
- ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
- }
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
- var inspected = {},
- seekingTransport = ( structure === transports );
-
- function inspect( dataType ) {
- var selected;
- inspected[ dataType ] = true;
- jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
- var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
- if ( typeof dataTypeOrTransport === "string" &&
- !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
- options.dataTypes.unshift( dataTypeOrTransport );
- inspect( dataTypeOrTransport );
- return false;
- } else if ( seekingTransport ) {
- return !( selected = dataTypeOrTransport );
- }
- } );
- return selected;
- }
-
- return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
- var key, deep,
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
- for ( key in src ) {
- if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
- }
- }
- if ( deep ) {
- jQuery.extend( true, target, deep );
- }
-
- return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
- var ct, type, finalDataType, firstDataType,
- contents = s.contents,
- dataTypes = s.dataTypes;
-
- // Remove auto dataType and get content-type in the process
- while ( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
-
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
-
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
- var conv2, current, conv, tmp, prev,
- converters = {},
-
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice();
-
- // Create converters map with lowercased keys
- if ( dataTypes[ 1 ] ) {
- for ( conv in s.converters ) {
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
- }
- }
-
- current = dataTypes.shift();
-
- // Convert to each sequential dataType
- while ( current ) {
-
- if ( s.responseFields[ current ] ) {
- jqXHR[ s.responseFields[ current ] ] = response;
- }
-
- // Apply the dataFilter if provided
- if ( !prev && isSuccess && s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- prev = current;
- current = dataTypes.shift();
-
- if ( current ) {
-
- // There's only work to do if current dataType is non-auto
- if ( current === "*" ) {
-
- current = prev;
-
- // Convert response if prev dataType is non-auto and differs from current
- } else if ( prev !== "*" && prev !== current ) {
-
- // Seek a direct converter
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
- // If none found, seek a pair
- if ( !conv ) {
- for ( conv2 in converters ) {
-
- // If conv2 outputs current
- tmp = conv2.split( " " );
- if ( tmp[ 1 ] === current ) {
-
- // If prev can be converted to accepted input
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
- converters[ "* " + tmp[ 0 ] ];
- if ( conv ) {
-
- // Condense equivalence converters
- if ( conv === true ) {
- conv = converters[ conv2 ];
-
- // Otherwise, insert the intermediate dataType
- } else if ( converters[ conv2 ] !== true ) {
- current = tmp[ 0 ];
- dataTypes.unshift( tmp[ 1 ] );
- }
- break;
- }
- }
- }
- }
-
- // Apply converter (if not an equivalence)
- if ( conv !== true ) {
-
- // Unless errors are allowed to bubble, catch and return them
- if ( conv && s.throws ) {
- response = conv( response );
- } else {
- try {
- response = conv( response );
- } catch ( e ) {
- return {
- state: "parsererror",
- error: conv ? e : "No conversion from " + prev + " to " + current
- };
- }
- }
- }
- }
- }
- }
-
- return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {},
-
- ajaxSettings: {
- url: location.href,
- type: "GET",
- isLocal: rlocalProtocol.test( location.protocol ),
- global: true,
- processData: true,
- async: true,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- throws: false,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- "*": allTypes,
- text: "text/plain",
- html: "text/html",
- xml: "application/xml, text/xml",
- json: "application/json, text/javascript"
- },
-
- contents: {
- xml: /\bxml\b/,
- html: /\bhtml/,
- json: /\bjson\b/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText",
- json: "responseJSON"
- },
-
- // Data converters
- // Keys separate source (or catchall "*") and destination types with a single space
- converters: {
-
- // Convert anything to text
- "* text": String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": JSON.parse,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- url: true,
- context: true
- }
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- return settings ?
-
- // Building a settings object
- ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
- // Extending ajaxSettings
- ajaxExtend( jQuery.ajaxSettings, target );
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var transport,
-
- // URL without anti-cache param
- cacheURL,
-
- // Response headers
- responseHeadersString,
- responseHeaders,
-
- // timeout handle
- timeoutTimer,
-
- // Url cleanup var
- urlAnchor,
-
- // Request state (becomes false upon send and true upon completion)
- completed,
-
- // To know if global events are to be dispatched
- fireGlobals,
-
- // Loop variable
- i,
-
- // uncached part of the url
- uncached,
-
- // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
-
- // Callbacks context
- callbackContext = s.context || s,
-
- // Context for global events is callbackContext if it is a DOM node or jQuery collection
- globalEventContext = s.context &&
- ( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
-
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
-
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
-
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
-
- // Default abort message
- strAbort = "canceled",
-
- // Fake xhr
- jqXHR = {
- readyState: 0,
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( completed ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
- ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
- .concat( match[ 2 ] );
- }
- }
- match = responseHeaders[ key.toLowerCase() + " " ];
- }
- return match == null ? null : match.join( ", " );
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return completed ? responseHeadersString : null;
- },
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- if ( completed == null ) {
- name = requestHeadersNames[ name.toLowerCase() ] =
- requestHeadersNames[ name.toLowerCase() ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( completed == null ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Status-dependent callbacks
- statusCode: function( map ) {
- var code;
- if ( map ) {
- if ( completed ) {
-
- // Execute the appropriate callbacks
- jqXHR.always( map[ jqXHR.status ] );
- } else {
-
- // Lazy-add the new callbacks in a way that preserves old ones
- for ( code in map ) {
- statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
- }
- }
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- var finalText = statusText || strAbort;
- if ( transport ) {
- transport.abort( finalText );
- }
- done( 0, finalText );
- return this;
- }
- };
-
- // Attach deferreds
- deferred.promise( jqXHR );
-
- // Add protocol if not provided (prefilters might expect it)
- // Handle falsy url in the settings object (#10093: consistency with old signature)
- // We also use the url parameter if available
- s.url = ( ( url || s.url || location.href ) + "" )
- .replace( rprotocol, location.protocol + "//" );
-
- // Alias method option to type as per ticket #12004
- s.type = options.method || options.type || s.method || s.type;
-
- // Extract dataTypes list
- s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
-
- // A cross-domain request is in order when the origin doesn't match the current origin.
- if ( s.crossDomain == null ) {
- urlAnchor = document.createElement( "a" );
-
- // Support: IE <=8 - 11, Edge 12 - 15
- // IE throws exception on accessing the href property if url is malformed,
- // e.g. http://example.com:80x/
- try {
- urlAnchor.href = s.url;
-
- // Support: IE <=8 - 11 only
- // Anchor's host property isn't correctly set when s.url is relative
- urlAnchor.href = urlAnchor.href;
- s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
- urlAnchor.protocol + "//" + urlAnchor.host;
- } catch ( e ) {
-
- // If there is an error parsing the URL, assume it is crossDomain,
- // it can be rejected by the transport if it is invalid
- s.crossDomain = true;
- }
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefilter, stop there
- if ( completed ) {
- return jqXHR;
- }
-
- // We can fire global events as of now if asked to
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
- fireGlobals = jQuery.event && s.global;
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Save the URL in case we're toying with the If-Modified-Since
- // and/or If-None-Match header later on
- // Remove hash to simplify url manipulation
- cacheURL = s.url.replace( rhash, "" );
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // Remember the hash so we can put it back
- uncached = s.url.slice( cacheURL.length );
-
- // If data is available and should be processed, append data to url
- if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
- cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
-
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Add or update anti-cache param if needed
- if ( s.cache === false ) {
- cacheURL = cacheURL.replace( rantiCache, "$1" );
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
- uncached;
- }
-
- // Put hash and anti-cache on the URL that will be requested (gh-1732)
- s.url = cacheURL + uncached;
-
- // Change '%20' to '+' if this is encoded form body content (gh-2658)
- } else if ( s.data && s.processData &&
- ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
- s.data = s.data.replace( r20, "+" );
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- if ( jQuery.lastModified[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
- }
- if ( jQuery.etag[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
- s.accepts[ s.dataTypes[ 0 ] ] +
- ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend &&
- ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
-
- // Abort if not done already and return
- return jqXHR.abort();
- }
-
- // Aborting is no longer a cancellation
- strAbort = "abort";
-
- // Install callbacks on deferreds
- completeDeferred.add( s.complete );
- jqXHR.done( s.success );
- jqXHR.fail( s.error );
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
-
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
-
- // If request was aborted inside ajaxSend, stop there
- if ( completed ) {
- return jqXHR;
- }
-
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = window.setTimeout( function() {
- jqXHR.abort( "timeout" );
- }, s.timeout );
- }
-
- try {
- completed = false;
- transport.send( requestHeaders, done );
- } catch ( e ) {
-
- // Rethrow post-completion exceptions
- if ( completed ) {
- throw e;
- }
-
- // Propagate others as results
- done( -1, e );
- }
- }
-
- // Callback for when everything is done
- function done( status, nativeStatusText, responses, headers ) {
- var isSuccess, success, error, response, modified,
- statusText = nativeStatusText;
-
- // Ignore repeat invocations
- if ( completed ) {
- return;
- }
-
- completed = true;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- window.clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- // Determine if successful
- isSuccess = status >= 200 && status < 300 || status === 304;
-
- // Get response data
- if ( responses ) {
- response = ajaxHandleResponses( s, jqXHR, responses );
- }
-
- // Use a noop converter for missing script but not if jsonp
- if ( !isSuccess &&
- jQuery.inArray( "script", s.dataTypes ) > -1 &&
- jQuery.inArray( "json", s.dataTypes ) < 0 ) {
- s.converters[ "text script" ] = function() {};
- }
-
- // Convert no matter what (that way responseXXX fields are always set)
- response = ajaxConvert( s, response, jqXHR, isSuccess );
-
- // If successful, handle type chaining
- if ( isSuccess ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- modified = jqXHR.getResponseHeader( "Last-Modified" );
- if ( modified ) {
- jQuery.lastModified[ cacheURL ] = modified;
- }
- modified = jqXHR.getResponseHeader( "etag" );
- if ( modified ) {
- jQuery.etag[ cacheURL ] = modified;
- }
- }
-
- // if no content
- if ( status === 204 || s.type === "HEAD" ) {
- statusText = "nocontent";
-
- // if not modified
- } else if ( status === 304 ) {
- statusText = "notmodified";
-
- // If we have data, let's convert it
- } else {
- statusText = response.state;
- success = response.data;
- error = response.error;
- isSuccess = !error;
- }
- } else {
-
- // Extract error from statusText and normalize for non-aborts
- error = statusText;
- if ( status || !statusText ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
- return jqXHR;
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- }
-} );
-
-jQuery.each( [ "get", "post" ], function( _i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
-
- // Shift arguments if data argument was omitted
- if ( isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- // The url can be an options object (which then must have .url)
- return jQuery.ajax( jQuery.extend( {
- url: url,
- type: method,
- dataType: type,
- data: data,
- success: callback
- }, jQuery.isPlainObject( url ) && url ) );
- };
-} );
-
-jQuery.ajaxPrefilter( function( s ) {
- var i;
- for ( i in s.headers ) {
- if ( i.toLowerCase() === "content-type" ) {
- s.contentType = s.headers[ i ] || "";
- }
- }
-} );
-
-
-jQuery._evalUrl = function( url, options, doc ) {
- return jQuery.ajax( {
- url: url,
-
- // Make this explicit, since user can override this through ajaxSetup (#11264)
- type: "GET",
- dataType: "script",
- cache: true,
- async: false,
- global: false,
-
- // Only evaluate the response if it is successful (gh-4126)
- // dataFilter is not invoked for failure responses, so using it instead
- // of the default converter is kludgy but it works.
- converters: {
- "text script": function() {}
- },
- dataFilter: function( response ) {
- jQuery.globalEval( response, options, doc );
- }
- } );
-};
-
-
-jQuery.fn.extend( {
- wrapAll: function( html ) {
- var wrap;
-
- if ( this[ 0 ] ) {
- if ( isFunction( html ) ) {
- html = html.call( this[ 0 ] );
- }
-
- // The elements to wrap the target around
- wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
- if ( this[ 0 ].parentNode ) {
- wrap.insertBefore( this[ 0 ] );
- }
-
- wrap.map( function() {
- var elem = this;
-
- while ( elem.firstElementChild ) {
- elem = elem.firstElementChild;
- }
-
- return elem;
- } ).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( isFunction( html ) ) {
- return this.each( function( i ) {
- jQuery( this ).wrapInner( html.call( this, i ) );
- } );
- }
-
- return this.each( function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- } );
- },
-
- wrap: function( html ) {
- var htmlIsFunction = isFunction( html );
-
- return this.each( function( i ) {
- jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
- } );
- },
-
- unwrap: function( selector ) {
- this.parent( selector ).not( "body" ).each( function() {
- jQuery( this ).replaceWith( this.childNodes );
- } );
- return this;
- }
-} );
-
-
-jQuery.expr.pseudos.hidden = function( elem ) {
- return !jQuery.expr.pseudos.visible( elem );
-};
-jQuery.expr.pseudos.visible = function( elem ) {
- return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
-};
-
-
-
-
-jQuery.ajaxSettings.xhr = function() {
- try {
- return new window.XMLHttpRequest();
- } catch ( e ) {}
-};
-
-var xhrSuccessStatus = {
-
- // File protocol always yields status code 0, assume 200
- 0: 200,
-
- // Support: IE <=9 only
- // #1450: sometimes IE returns 1223 when it should be 204
- 1223: 204
- },
- xhrSupported = jQuery.ajaxSettings.xhr();
-
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-support.ajax = xhrSupported = !!xhrSupported;
-
-jQuery.ajaxTransport( function( options ) {
- var callback, errorCallback;
-
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( support.cors || xhrSupported && !options.crossDomain ) {
- return {
- send: function( headers, complete ) {
- var i,
- xhr = options.xhr();
-
- xhr.open(
- options.type,
- options.url,
- options.async,
- options.username,
- options.password
- );
-
- // Apply custom fields if provided
- if ( options.xhrFields ) {
- for ( i in options.xhrFields ) {
- xhr[ i ] = options.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( options.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( options.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Set headers
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
-
- // Callback
- callback = function( type ) {
- return function() {
- if ( callback ) {
- callback = errorCallback = xhr.onload =
- xhr.onerror = xhr.onabort = xhr.ontimeout =
- xhr.onreadystatechange = null;
-
- if ( type === "abort" ) {
- xhr.abort();
- } else if ( type === "error" ) {
-
- // Support: IE <=9 only
- // On a manual native abort, IE9 throws
- // errors on any property access that is not readyState
- if ( typeof xhr.status !== "number" ) {
- complete( 0, "error" );
- } else {
- complete(
-
- // File: protocol always yields status 0; see #8605, #14207
- xhr.status,
- xhr.statusText
- );
- }
- } else {
- complete(
- xhrSuccessStatus[ xhr.status ] || xhr.status,
- xhr.statusText,
-
- // Support: IE <=9 only
- // IE9 has no XHR2 but throws on binary (trac-11426)
- // For XHR2 non-text, let the caller handle it (gh-2498)
- ( xhr.responseType || "text" ) !== "text" ||
- typeof xhr.responseText !== "string" ?
- { binary: xhr.response } :
- { text: xhr.responseText },
- xhr.getAllResponseHeaders()
- );
- }
- }
- };
- };
-
- // Listen to events
- xhr.onload = callback();
- errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
-
- // Support: IE 9 only
- // Use onreadystatechange to replace onabort
- // to handle uncaught aborts
- if ( xhr.onabort !== undefined ) {
- xhr.onabort = errorCallback;
- } else {
- xhr.onreadystatechange = function() {
-
- // Check readyState before timeout as it changes
- if ( xhr.readyState === 4 ) {
-
- // Allow onerror to be called first,
- // but that will not handle a native abort
- // Also, save errorCallback to a variable
- // as xhr.onerror cannot be accessed
- window.setTimeout( function() {
- if ( callback ) {
- errorCallback();
- }
- } );
- }
- };
- }
-
- // Create the abort callback
- callback = callback( "abort" );
-
- try {
-
- // Do send the request (this may raise an exception)
- xhr.send( options.hasContent && options.data || null );
- } catch ( e ) {
-
- // #14683: Only rethrow if this hasn't been notified as an error yet
- if ( callback ) {
- throw e;
- }
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback();
- }
- }
- };
- }
-} );
-
-
-
-
-// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
-jQuery.ajaxPrefilter( function( s ) {
- if ( s.crossDomain ) {
- s.contents.script = false;
- }
-} );
-
-// Install script dataType
-jQuery.ajaxSetup( {
- accepts: {
- script: "text/javascript, application/javascript, " +
- "application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /\b(?:java|ecma)script\b/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-} );
-
-// Handle cache's special case and crossDomain
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- }
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
- // This transport only deals with cross domain or forced-by-attrs requests
- if ( s.crossDomain || s.scriptAttrs ) {
- var script, callback;
- return {
- send: function( _, complete ) {
- script = jQuery( "<script>" )
- .attr( s.scriptAttrs || {} )
- .prop( { charset: s.scriptCharset, src: s.url } )
- .on( "load error", callback = function( evt ) {
- script.remove();
- callback = null;
- if ( evt ) {
- complete( evt.type === "error" ? 404 : 200, evt.type );
- }
- } );
-
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- document.head.appendChild( script[ 0 ] );
- },
- abort: function() {
- if ( callback ) {
- callback();
- }
- }
- };
- }
-} );
-
-
-
-
-var oldCallbacks = [],
- rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
- this[ callback ] = true;
- return callback;
- }
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var callbackName, overwritten, responseContainer,
- jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
- "url" :
- typeof s.data === "string" &&
- ( s.contentType || "" )
- .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
- rjsonp.test( s.data ) && "data"
- );
-
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
- if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
- // Get callback name, remembering preexisting value associated with it
- callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
- s.jsonpCallback() :
- s.jsonpCallback;
-
- // Insert callback into url or form data
- if ( jsonProp ) {
- s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
- } else if ( s.jsonp !== false ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
- }
-
- // Use data converter to retrieve json after script execution
- s.converters[ "script json" ] = function() {
- if ( !responseContainer ) {
- jQuery.error( callbackName + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // Force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Install callback
- overwritten = window[ callbackName ];
- window[ callbackName ] = function() {
- responseContainer = arguments;
- };
-
- // Clean-up function (fires after converters)
- jqXHR.always( function() {
-
- // If previous value didn't exist - remove it
- if ( overwritten === undefined ) {
- jQuery( window ).removeProp( callbackName );
-
- // Otherwise restore preexisting value
- } else {
- window[ callbackName ] = overwritten;
- }
-
- // Save back as free
- if ( s[ callbackName ] ) {
-
- // Make sure that re-using the options doesn't screw things around
- s.jsonpCallback = originalSettings.jsonpCallback;
-
- // Save the callback name for future use
- oldCallbacks.push( callbackName );
- }
-
- // Call if it was a function and we have a response
- if ( responseContainer && isFunction( overwritten ) ) {
- overwritten( responseContainer[ 0 ] );
- }
-
- responseContainer = overwritten = undefined;
- } );
-
- // Delegate to script
- return "script";
- }
-} );
-
-
-
-
-// Support: Safari 8 only
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-support.createHTMLDocument = ( function() {
- var body = document.implementation.createHTMLDocument( "" ).body;
- body.innerHTML = "<form></form><form></form>";
- return body.childNodes.length === 2;
-} )();
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
- if ( typeof data !== "string" ) {
- return [];
- }
- if ( typeof context === "boolean" ) {
- keepScripts = context;
- context = false;
- }
-
- var base, parsed, scripts;
-
- if ( !context ) {
-
- // Stop scripts or inline event handlers from being executed immediately
- // by using document.implementation
- if ( support.createHTMLDocument ) {
- context = document.implementation.createHTMLDocument( "" );
-
- // Set the base href for the created document
- // so any parsed elements with URLs
- // are based on the document's URL (gh-2965)
- base = context.createElement( "base" );
- base.href = document.location.href;
- context.head.appendChild( base );
- } else {
- context = document;
- }
- }
-
- parsed = rsingleTag.exec( data );
- scripts = !keepScripts && [];
-
- // Single tag
- if ( parsed ) {
- return [ context.createElement( parsed[ 1 ] ) ];
- }
-
- parsed = buildFragment( [ data ], context, scripts );
-
- if ( scripts && scripts.length ) {
- jQuery( scripts ).remove();
- }
-
- return jQuery.merge( [], parsed.childNodes );
-};
-
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
- var selector, type, response,
- self = this,
- off = url.indexOf( " " );
-
- if ( off > -1 ) {
- selector = stripAndCollapse( url.slice( off ) );
- url = url.slice( 0, off );
- }
-
- // If it's a function
- if ( isFunction( params ) ) {
-
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( params && typeof params === "object" ) {
- type = "POST";
- }
-
- // If we have elements to modify, make the request
- if ( self.length > 0 ) {
- jQuery.ajax( {
- url: url,
-
- // If "type" variable is undefined, then "GET" method will be used.
- // Make value of this field explicit since
- // user can override it through ajaxSetup method
- type: type || "GET",
- dataType: "html",
- data: params
- } ).done( function( responseText ) {
-
- // Save response for use in complete callback
- response = arguments;
-
- self.html( selector ?
-
- // If a selector was specified, locate the right elements in a dummy div
- // Exclude scripts to avoid IE 'Permission Denied' errors
- jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
- // Otherwise use the full result
- responseText );
-
- // If the request succeeds, this function gets "data", "status", "jqXHR"
- // but they are ignored because response was set above.
- // If it fails, this function gets "jqXHR", "status", "error"
- } ).always( callback && function( jqXHR, status ) {
- self.each( function() {
- callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
- } );
- } );
- }
-
- return this;
-};
-
-
-
-
-jQuery.expr.pseudos.animated = function( elem ) {
- return jQuery.grep( jQuery.timers, function( fn ) {
- return elem === fn.elem;
- } ).length;
-};
-
-
-
-
-jQuery.offset = {
- setOffset: function( elem, options, i ) {
- var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
- position = jQuery.css( elem, "position" ),
- curElem = jQuery( elem ),
- props = {};
-
- // Set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- curOffset = curElem.offset();
- curCSSTop = jQuery.css( elem, "top" );
- curCSSLeft = jQuery.css( elem, "left" );
- calculatePosition = ( position === "absolute" || position === "fixed" ) &&
- ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
- // Need to be able to calculate position if either
- // top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
-
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( isFunction( options ) ) {
-
- // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
- options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
-
- } else {
- curElem.css( props );
- }
- }
-};
-
-jQuery.fn.extend( {
-
- // offset() relates an element's border box to the document origin
- offset: function( options ) {
-
- // Preserve chaining for setter
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each( function( i ) {
- jQuery.offset.setOffset( this, options, i );
- } );
- }
-
- var rect, win,
- elem = this[ 0 ];
-
- if ( !elem ) {
- return;
- }
-
- // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
- // Support: IE <=11 only
- // Running getBoundingClientRect on a
- // disconnected node in IE throws an error
- if ( !elem.getClientRects().length ) {
- return { top: 0, left: 0 };
- }
-
- // Get document-relative position by adding viewport scroll to viewport-relative gBCR
- rect = elem.getBoundingClientRect();
- win = elem.ownerDocument.defaultView;
- return {
- top: rect.top + win.pageYOffset,
- left: rect.left + win.pageXOffset
- };
- },
-
- // position() relates an element's margin box to its offset parent's padding box
- // This corresponds to the behavior of CSS absolute positioning
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset, doc,
- elem = this[ 0 ],
- parentOffset = { top: 0, left: 0 };
-
- // position:fixed elements are offset from the viewport, which itself always has zero offset
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
- // Assume position:fixed implies availability of getBoundingClientRect
- offset = elem.getBoundingClientRect();
-
- } else {
- offset = this.offset();
-
- // Account for the *real* offset parent, which can be the document or its root element
- // when a statically positioned element is identified
- doc = elem.ownerDocument;
- offsetParent = elem.offsetParent || doc.documentElement;
- while ( offsetParent &&
- ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
- jQuery.css( offsetParent, "position" ) === "static" ) {
-
- offsetParent = offsetParent.parentNode;
- }
- if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
-
- // Incorporate borders into its offset, since they are outside its content origin
- parentOffset = jQuery( offsetParent ).offset();
- parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
- parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
- }
- }
-
- // Subtract parent offsets and element margins
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
- };
- },
-
- // This method will return documentElement in the following cases:
- // 1) For the element inside the iframe without offsetParent, this method will return
- // documentElement of the parent window
- // 2) For the hidden or detached element
- // 3) For body or html element, i.e. in case of the html node - it will return itself
- //
- // but those exceptions were never presented as a real life use-cases
- // and might be considered as more preferable results.
- //
- // This logic, however, is not guaranteed and can change at any point in the future
- offsetParent: function() {
- return this.map( function() {
- var offsetParent = this.offsetParent;
-
- while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
- offsetParent = offsetParent.offsetParent;
- }
-
- return offsetParent || documentElement;
- } );
- }
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
- var top = "pageYOffset" === prop;
-
- jQuery.fn[ method ] = function( val ) {
- return access( this, function( elem, method, val ) {
-
- // Coalesce documents and windows
- var win;
- if ( isWindow( elem ) ) {
- win = elem;
- } else if ( elem.nodeType === 9 ) {
- win = elem.defaultView;
- }
-
- if ( val === undefined ) {
- return win ? win[ prop ] : elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : win.pageXOffset,
- top ? val : win.pageYOffset
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length );
- };
-} );
-
-// Support: Safari <=7 - 9.1, Chrome <=37 - 49
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( _i, prop ) {
- jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
- function( elem, computed ) {
- if ( computed ) {
- computed = curCSS( elem, prop );
-
- // If curCSS returns percentage, fallback to offset
- return rnumnonpx.test( computed ) ?
- jQuery( elem ).position()[ prop ] + "px" :
- computed;
- }
- }
- );
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( {
- padding: "inner" + name,
- content: type,
- "": "outer" + name
- }, function( defaultExtra, funcName ) {
-
- // Margin is only for outerHeight, outerWidth
- jQuery.fn[ funcName ] = function( margin, value ) {
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
- return access( this, function( elem, type, value ) {
- var doc;
-
- if ( isWindow( elem ) ) {
-
- // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
- return funcName.indexOf( "outer" ) === 0 ?
- elem[ "inner" + name ] :
- elem.document.documentElement[ "client" + name ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- doc = elem.documentElement;
-
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
- // whichever is greatest
- return Math.max(
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
- elem.body[ "offset" + name ], doc[ "offset" + name ],
- doc[ "client" + name ]
- );
- }
-
- return value === undefined ?
-
- // Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, extra ) :
-
- // Set width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, chainable ? margin : undefined, chainable );
- };
- } );
-} );
-
-
-jQuery.each( [
- "ajaxStart",
- "ajaxStop",
- "ajaxComplete",
- "ajaxError",
- "ajaxSuccess",
- "ajaxSend"
-], function( _i, type ) {
- jQuery.fn[ type ] = function( fn ) {
- return this.on( type, fn );
- };
-} );
-
-
-
-
-jQuery.fn.extend( {
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
-
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ?
- this.off( selector, "**" ) :
- this.off( types, selector || "**", fn );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-} );
-
-jQuery.each(
- ( "blur focus focusin focusout resize scroll click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
- function( _i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
- }
-);
-
-
-
-
-// Support: Android <=4.0 only
-// Make sure we trim BOM and NBSP
-var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
-
-// Bind a function to a context, optionally partially applying any
-// arguments.
-// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
-// However, it is not slated for removal any time soon
-jQuery.proxy = function( fn, context ) {
- var tmp, args, proxy;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
- return proxy;
-};
-
-jQuery.holdReady = function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
-};
-jQuery.isArray = Array.isArray;
-jQuery.parseJSON = JSON.parse;
-jQuery.nodeName = nodeName;
-jQuery.isFunction = isFunction;
-jQuery.isWindow = isWindow;
-jQuery.camelCase = camelCase;
-jQuery.type = toType;
-
-jQuery.now = Date.now;
-
-jQuery.isNumeric = function( obj ) {
-
- // As of jQuery 3.0, isNumeric is limited to
- // strings and numbers (primitives or objects)
- // that can be coerced to finite numbers (gh-2662)
- var type = jQuery.type( obj );
- return ( type === "number" || type === "string" ) &&
-
- // parseFloat NaNs numeric-cast false positives ("")
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
- // subtraction forces infinities to NaN
- !isNaN( obj - parseFloat( obj ) );
-};
-
-jQuery.trim = function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
-};
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function() {
- return jQuery;
- } );
-}
-
-
-
-
-var
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$;
-
-jQuery.noConflict = function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( typeof noGlobal === "undefined" ) {
- window.jQuery = window.$ = jQuery;
-}
-
-
-
-
-return jQuery;
-} );
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_444444_256x240.png b/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_444444_256x240.png
deleted file mode 100644
index 07e4ea06..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_444444_256x240.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_555555_256x240.png b/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_555555_256x240.png
deleted file mode 100644
index 5e33fddf..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_555555_256x240.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777620_256x240.png b/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777620_256x240.png
deleted file mode 100644
index 1d096c1a..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777620_256x240.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777777_256x240.png b/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777777_256x240.png
deleted file mode 100644
index ff0994dd..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_777777_256x240.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_cc0000_256x240.png b/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_cc0000_256x240.png
deleted file mode 100644
index 6bba8fae..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_cc0000_256x240.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_ffffff_256x240.png b/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_ffffff_256x240.png
deleted file mode 100644
index 1e82dad8..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/images/ui-icons_ffffff_256x240.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-3.6.0.min.js b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-3.6.0.min.js
deleted file mode 100644
index c4c6022f..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-3.6.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-migrate-3.4.0.min.js b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-migrate-3.4.0.min.js
deleted file mode 100644
index f535eb19..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-migrate-3.4.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Migrate v3.4.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
-"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e,window)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use strict";function e(e){return 0<=function(e,t){for(var r=/^(\d+)\.(\d+)\.(\d+)/,n=r.exec(e)||[],o=r.exec(t)||[],a=1;a<=3;a++){if(+n[a]>+o[a])return 1;if(+n[a]<+o[a])return-1}return 0}(s.fn.jquery,e)}s.migrateVersion="3.4.0";var t=Object.create(null),o=(s.migrateDisablePatches=function(){for(var e=0;e<arguments.length;e++)t[arguments[e]]=!0},s.migrateEnablePatches=function(){for(var e=0;e<arguments.length;e++)delete t[arguments[e]]},s.migrateIsPatchEnabled=function(e){return!t[e]},n.console&&n.console.log&&(s&&e("3.0.0")||n.console.log("JQMIGRATE: jQuery 3.0.0+ REQUIRED"),s.migrateWarnings&&n.console.log("JQMIGRATE: Migrate plugin loaded multiple times"),n.console.log("JQMIGRATE: Migrate is installed"+(s.migrateMute?"":" with logging active")+", version "+s.migrateVersion)),{});function i(e,t){var r=n.console;!s.migrateIsPatchEnabled(e)||s.migrateDeduplicateWarnings&&o[t]||(o[t]=!0,s.migrateWarnings.push(t+" ["+e+"]"),r&&r.warn&&!s.migrateMute&&(r.warn("JQMIGRATE: "+t),s.migrateTrace&&r.trace&&r.trace()))}function r(e,t,r,n,o){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return i(n,o),r},set:function(e){i(n,o),r=e}})}function a(e,t,r,n,o){var a=e[t];e[t]=function(){return o&&i(n,o),(s.migrateIsPatchEnabled(n)?r:a||s.noop).apply(this,arguments)}}function u(e,t,r,n,o){if(!o)throw new Error("No warning message provided");a(e,t,r,n,o)}function d(e,t,r,n){a(e,t,r,n)}s.migrateDeduplicateWarnings=!0,s.migrateWarnings=[],void 0===s.migrateTrace&&(s.migrateTrace=!0),s.migrateReset=function(){o={},s.migrateWarnings.length=0},"BackCompat"===n.document.compatMode&&i("quirks","jQuery is not compatible with Quirks Mode");var c,l,p,f={},m=s.fn.init,y=s.find,h=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,g=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,v=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;for(c in d(s.fn,"init",function(e){var t=Array.prototype.slice.call(arguments);return s.migrateIsPatchEnabled("selector-empty-id")&&"string"==typeof e&&"#"===e&&(i("selector-empty-id","jQuery( '#' ) is not a valid selector"),t[0]=[]),m.apply(this,t)},"selector-empty-id"),s.fn.init.prototype=s.fn,d(s,"find",function(t){var r=Array.prototype.slice.call(arguments);if("string"==typeof t&&h.test(t))try{n.document.querySelector(t)}catch(e){t=t.replace(g,function(e,t,r,n){return"["+t+r+'"'+n+'"]'});try{n.document.querySelector(t),i("selector-hash","Attribute selector with '#' must be quoted: "+r[0]),r[0]=t}catch(e){i("selector-hash","Attribute selector with '#' was not fixed: "+r[0])}}return y.apply(this,r)},"selector-hash"),y)Object.prototype.hasOwnProperty.call(y,c)&&(s.find[c]=y[c]);u(s.fn,"size",function(){return this.length},"size","jQuery.fn.size() is deprecated and removed; use the .length property"),u(s,"parseJSON",function(){return JSON.parse.apply(null,arguments)},"parseJSON","jQuery.parseJSON is deprecated; use JSON.parse"),u(s,"holdReady",s.holdReady,"holdReady","jQuery.holdReady is deprecated"),u(s,"unique",s.uniqueSort,"unique","jQuery.unique is deprecated; use jQuery.uniqueSort"),r(s.expr,"filters",s.expr.pseudos,"expr-pre-pseudos","jQuery.expr.filters is deprecated; use jQuery.expr.pseudos"),r(s.expr,":",s.expr.pseudos,"expr-pre-pseudos","jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos"),e("3.1.1")&&u(s,"trim",function(e){return null==e?"":(e+"").replace(v,"")},"trim","jQuery.trim is deprecated; use String.prototype.trim"),e("3.2.0")&&(u(s,"nodeName",function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},"nodeName","jQuery.nodeName is deprecated"),u(s,"isArray",Array.isArray,"isArray","jQuery.isArray is deprecated; use Array.isArray")),e("3.3.0")&&(u(s,"isNumeric",function(e){var t=typeof e;return("number"==t||"string"==t)&&!isNaN(e-parseFloat(e))},"isNumeric","jQuery.isNumeric() is deprecated"),s.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){f["[object "+t+"]"]=t.toLowerCase()}),u(s,"type",function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?f[Object.prototype.toString.call(e)]||"object":typeof e},"type","jQuery.type is deprecated"),u(s,"isFunction",function(e){return"function"==typeof e},"isFunction","jQuery.isFunction() is deprecated"),u(s,"isWindow",function(e){return null!=e&&e===e.window},"isWindow","jQuery.isWindow() is deprecated")),s.ajax&&(l=s.ajax,p=/(=)\?(?=&|$)|\?\?/,d(s,"ajax",function(){var e=l.apply(this,arguments);return e.promise&&(u(e,"success",e.done,"jqXHR-methods","jQXHR.success is deprecated and removed"),u(e,"error",e.fail,"jqXHR-methods","jQXHR.error is deprecated and removed"),u(e,"complete",e.always,"jqXHR-methods","jQXHR.complete is deprecated and removed")),e},"jqXHR-methods"),e("4.0.0")||s.ajaxPrefilter("+json",function(e){!1!==e.jsonp&&(p.test(e.url)||"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&p.test(e.data))&&i("jsonp-promotion","JSON-to-JSONP auto-promotion is deprecated")}));var j=s.fn.removeAttr,b=s.fn.toggleClass,w=/\S+/g;function Q(e){return e.replace(/-([a-z])/g,function(e,t){return t.toUpperCase()})}d(s.fn,"removeAttr",function(e){var r=this;return s.each(e.match(w),function(e,t){s.expr.match.bool.test(t)&&(i("removeAttr-bool","jQuery.fn.removeAttr no longer sets boolean properties: "+t),r.prop(t,!1))}),j.apply(this,arguments)},"removeAttr-bool"),d(s.fn,"toggleClass",function(t){return void 0!==t&&"boolean"!=typeof t?b.apply(this,arguments):(i("toggleClass-bool","jQuery.fn.toggleClass( boolean ) is deprecated"),this.each(function(){var e=this.getAttribute&&this.getAttribute("class")||"";e&&s.data(this,"__className__",e),this.setAttribute&&this.setAttribute("class",!e&&!1!==t&&s.data(this,"__className__")||"")}))},"toggleClass-bool");var x,A=!1,R=/^[a-z]/,T=/^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;s.swap&&s.each(["height","width","reliableMarginRight"],function(e,t){var r=s.cssHooks[t]&&s.cssHooks[t].get;r&&(s.cssHooks[t].get=function(){var e;return A=!0,e=r.apply(this,arguments),A=!1,e})}),d(s,"swap",function(e,t,r,n){var o,a={};for(o in A||i("swap","jQuery.swap() is undocumented and deprecated"),t)a[o]=e.style[o],e.style[o]=t[o];for(o in r=r.apply(e,n||[]),t)e.style[o]=a[o];return r},"swap"),e("3.4.0")&&"undefined"!=typeof Proxy&&(s.cssProps=new Proxy(s.cssProps||{},{set:function(){return i("cssProps","jQuery.cssProps is deprecated"),Reflect.set.apply(this,arguments)}})),e("4.0.0")&&"undefined"!=typeof Proxy&&(s.cssNumber=new Proxy({animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},{get:function(){return i("css-number","jQuery.cssNumber is deprecated"),Reflect.get.apply(this,arguments)},set:function(){return i("css-number","jQuery.cssNumber is deprecated"),Reflect.set.apply(this,arguments)}})),x=s.fn.css,d(s.fn,"css",function(e,t){var r,n=this;return e&&"object"==typeof e&&!Array.isArray(e)?(s.each(e,function(e,t){s.fn.css.call(n,e,t)}),this):("number"==typeof t&&(t=Q(e),r=t,R.test(r)&&T.test(r[0].toUpperCase()+r.slice(1))||s.cssNumber[t]||i("css-number",'Number-typed values are deprecated for jQuery.fn.css( "'+e+'", value )')),x.apply(this,arguments))},"css-number");function C(e){var t=n.document.implementation.createHTMLDocument("");return t.body.innerHTML=e,t.body&&t.body.innerHTML}var S,N,P,k,H,E,M,q=s.data,D=(d(s,"data",function(e,t,r){var n,o,a;if(t&&"object"==typeof t&&2===arguments.length){for(a in n=s.hasData(e)&&q.call(this,e),o={},t)a!==Q(a)?(i("data-camelCase","jQuery.data() always sets/gets camelCased names: "+a),n[a]=t[a]):o[a]=t[a];return q.call(this,e,o),t}return t&&"string"==typeof t&&t!==Q(t)&&(n=s.hasData(e)&&q.call(this,e))&&t in n?(i("data-camelCase","jQuery.data() always sets/gets camelCased names: "+t),2<arguments.length&&(n[t]=r),n[t]):q.apply(this,arguments)},"data-camelCase"),s.fx&&(P=s.Tween.prototype.run,k=function(e){return e},d(s.Tween.prototype,"run",function(){1<s.easing[this.easing].length&&(i("easing-one-arg","'jQuery.easing."+this.easing.toString()+"' should use only one argument"),s.easing[this.easing]=k),P.apply(this,arguments)},"easing-one-arg"),S=s.fx.interval,N="jQuery.fx.interval is deprecated",n.requestAnimationFrame&&Object.defineProperty(s.fx,"interval",{configurable:!0,enumerable:!0,get:function(){return n.document.hidden||i("fx-interval",N),s.migrateIsPatchEnabled("fx-interval")&&void 0===S?13:S},set:function(e){i("fx-interval",N),S=e}})),s.fn.load),F=s.event.add,W=s.event.fix,O=(s.event.props=[],s.event.fixHooks={},r(s.event.props,"concat",s.event.props.concat,"event-old-patch","jQuery.event.props.concat() is deprecated and removed"),d(s.event,"fix",function(e){var t=e.type,r=this.fixHooks[t],n=s.event.props;if(n.length){i("event-old-patch","jQuery.event.props are deprecated and removed: "+n.join());while(n.length)s.event.addProp(n.pop())}if(r&&!r._migrated_&&(r._migrated_=!0,i("event-old-patch","jQuery.event.fixHooks are deprecated and removed: "+t),(n=r.props)&&n.length))while(n.length)s.event.addProp(n.pop());return t=W.call(this,e),r&&r.filter?r.filter(t,e):t},"event-old-patch"),d(s.event,"add",function(e,t){return e===n&&"load"===t&&"complete"===n.document.readyState&&i("load-after-event","jQuery(window).on('load'...) called after load event occurred"),F.apply(this,arguments)},"load-after-event"),s.each(["load","unload","error"],function(e,t){d(s.fn,t,function(){var e=Array.prototype.slice.call(arguments,0);return"load"===t&&"string"==typeof e[0]?D.apply(this,e):(i("shorthand-removed-v3","jQuery.fn."+t+"() is deprecated"),e.splice(0,0,t),arguments.length?this.on.apply(this,e):(this.triggerHandler.apply(this,e),this))},"shorthand-removed-v3")}),s.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,r){u(s.fn,r,function(e,t){return 0<arguments.length?this.on(r,null,e,t):this.trigger(r)},"shorthand-deprecated-v3","jQuery.fn."+r+"() event shorthand is deprecated")}),s(function(){s(n.document).triggerHandler("ready")}),s.event.special.ready={setup:function(){this===n.document&&i("ready-event","'ready' event is deprecated")}},u(s.fn,"bind",function(e,t,r){return this.on(e,null,t,r)},"pre-on-methods","jQuery.fn.bind() is deprecated"),u(s.fn,"unbind",function(e,t){return this.off(e,null,t)},"pre-on-methods","jQuery.fn.unbind() is deprecated"),u(s.fn,"delegate",function(e,t,r,n){return this.on(t,e,r,n)},"pre-on-methods","jQuery.fn.delegate() is deprecated"),u(s.fn,"undelegate",function(e,t,r){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",r)},"pre-on-methods","jQuery.fn.undelegate() is deprecated"),u(s.fn,"hover",function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)},"pre-on-methods","jQuery.fn.hover() is deprecated"),/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi),_=(s.UNSAFE_restoreLegacyHtmlPrefilter=function(){s.migrateEnablePatches("self-closed-tags")},d(s,"htmlPrefilter",function(e){var t,r;return(r=(t=e).replace(O,"<$1></$2>"))!==t&&C(t)!==C(r)&&i("self-closed-tags","HTML tags must be properly nested and closed: "+t),e.replace(O,"<$1></$2>")},"self-closed-tags"),s.migrateDisablePatches("self-closed-tags"),s.fn.offset);return d(s.fn,"offset",function(){var e=this[0];return!e||e.nodeType&&e.getBoundingClientRect?_.apply(this,arguments):(i("offset-valid-elem","jQuery.fn.offset() requires a valid DOM element"),arguments.length?this:void 0)},"offset-valid-elem"),s.ajax&&(H=s.param,d(s,"param",function(e,t){var r=s.ajaxSettings&&s.ajaxSettings.traditional;return void 0===t&&r&&(i("param-ajax-traditional","jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),t=r),H.call(this,e,t)},"param-ajax-traditional")),u(s.fn,"andSelf",s.fn.addBack,"andSelf","jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"),s.Deferred&&(E=s.Deferred,M=[["resolve","done",s.Callbacks("once memory"),s.Callbacks("once memory"),"resolved"],["reject","fail",s.Callbacks("once memory"),s.Callbacks("once memory"),"rejected"],["notify","progress",s.Callbacks("memory"),s.Callbacks("memory")]],d(s,"Deferred",function(e){var a=E(),i=a.promise();function t(){var o=arguments;return s.Deferred(function(n){s.each(M,function(e,t){var r="function"==typeof o[e]&&o[e];a[t[1]](function(){var e=r&&r.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[t[0]+"With"](this===i?n.promise():this,r?[e]:arguments)})}),o=null}).promise()}return u(a,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),u(i,"pipe",t,"deferred-pipe","deferred.pipe() is deprecated"),e&&e.call(a,a),a},"deferred-pipe"),s.Deferred.exceptionHook=E.exceptionHook),s});
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.css b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.css
deleted file mode 100644
index 2f0601a6..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.css
+++ /dev/null
@@ -1,1315 +0,0 @@
-/*! jQuery UI - v1.13.1 - 2022-01-20
-* http://jqueryui.com
-* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- -ms-filter: "alpha(opacity=0)"; /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
- pointer-events: none;
-}
-
-
-/* Icons
-----------------------------------*/
-.ui-icon {
- display: inline-block;
- vertical-align: middle;
- margin-top: -.25em;
- position: relative;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-.ui-widget-icon-block {
- left: 50%;
- margin-left: -8px;
- display: block;
-}
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: 0;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- margin: 0;
- cursor: pointer;
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-item-wrapper {
- position: relative;
- padding: 3px 1em 3px .4em;
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item-wrapper {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-button {
- padding: .4em 1em;
- display: inline-block;
- position: relative;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- /* Support: IE <= 11 */
- overflow: visible;
-}
-
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2em;
- box-sizing: border-box;
- text-indent: -9999px;
- white-space: nowrap;
-}
-
-/* no icon support for input elements */
-input.ui-button.ui-button-icon-only {
- text-indent: 0;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon {
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -8px;
- margin-left: -8px;
-}
-
-.ui-button.ui-icon-notext .ui-icon {
- padding: 0;
- width: 2.1em;
- height: 2.1em;
- text-indent: -9999px;
- white-space: nowrap;
-
-}
-
-input.ui-button.ui-icon-notext .ui-icon {
- width: auto;
- height: auto;
- text-indent: 0;
- white-space: normal;
- padding: .4em 1em;
-}
-
-/* workarounds */
-/* Support: Firefox 5 - 40 */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-controlgroup {
- vertical-align: middle;
- display: inline-block;
-}
-.ui-controlgroup > .ui-controlgroup-item {
- float: left;
- margin-left: 0;
- margin-right: 0;
-}
-.ui-controlgroup > .ui-controlgroup-item:focus,
-.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
- z-index: 9999;
-}
-.ui-controlgroup-vertical > .ui-controlgroup-item {
- display: block;
- float: none;
- width: 100%;
- margin-top: 0;
- margin-bottom: 0;
- text-align: left;
-}
-.ui-controlgroup-vertical .ui-controlgroup-item {
- box-sizing: border-box;
-}
-.ui-controlgroup .ui-controlgroup-label {
- padding: .4em 1em;
-}
-.ui-controlgroup .ui-controlgroup-label span {
- font-size: 80%;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
- border-left: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
- border-top: none;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
- border-right: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
- border-bottom: none;
-}
-
-/* Spinner specific style fixes */
-.ui-controlgroup-vertical .ui-spinner-input {
-
- /* Support: IE8 only, Android < 4.4 only */
- width: 75%;
- width: calc( 100% - 2.4em );
-}
-.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
- border-top-style: solid;
-}
-
-.ui-checkboxradio-label .ui-icon-background {
- box-shadow: inset 1px 1px 1px #ccc;
- border-radius: .12em;
- border: none;
-}
-.ui-checkboxradio-radio-label .ui-icon-background {
- width: 16px;
- height: 16px;
- border-radius: 1em;
- overflow: visible;
- border: none;
-}
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
- background-image: none;
- width: 8px;
- height: 8px;
- border-width: 4px;
- border-style: solid;
-}
-.ui-checkboxradio-disabled {
- pointer-events: none;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-
-/* Icons */
-.ui-datepicker .ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
- left: .5em;
- top: .3em;
-}
-.ui-dialog {
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-n {
- height: 2px;
- top: 0;
-}
-.ui-dialog .ui-resizable-e {
- width: 2px;
- right: 0;
-}
-.ui-dialog .ui-resizable-s {
- height: 2px;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-w {
- width: 2px;
- left: 0;
-}
-.ui-dialog .ui-resizable-se,
-.ui-dialog .ui-resizable-sw,
-.ui-dialog .ui-resizable-ne,
-.ui-dialog .ui-resizable-nw {
- width: 7px;
- height: 7px;
-}
-.ui-dialog .ui-resizable-se {
- right: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-sw {
- left: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-ne {
- right: 0;
- top: 0;
-}
-.ui-dialog .ui-resizable-nw {
- left: 0;
- top: 0;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- -ms-filter: "alpha(opacity=25)"; /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-text {
- display: block;
- margin-right: 20px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-selectmenu-button.ui-button {
- text-align: left;
- white-space: nowrap;
- width: 14em;
-}
-.ui-selectmenu-icon.ui-icon {
- float: right;
- margin-top: 0;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: pointer;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: .222em 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 2em;
-}
-.ui-spinner-button {
- width: 1.6em;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top-style: none;
- border-bottom-style: none;
- border-right-style: none;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Arial,Helvetica,sans-serif;
- font-size: 1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Arial,Helvetica,sans-serif;
- font-size: 1em;
-}
-.ui-widget.ui-widget-content {
- border: 1px solid #c5c5c5;
-}
-.ui-widget-content {
- border: 1px solid #dddddd;
- background: #ffffff;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #dddddd;
- background: #e9e9e9;
- color: #333333;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #333333;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default,
-.ui-button,
-
-/* We use html here because we need a greater specificity to make sure disabled
-works properly when clicked or hovered */
-html .ui-button.ui-state-disabled:hover,
-html .ui-button.ui-state-disabled:active {
- border: 1px solid #c5c5c5;
- background: #f6f6f6;
- font-weight: normal;
- color: #454545;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited,
-a.ui-button,
-a:link.ui-button,
-a:visited.ui-button,
-.ui-button {
- color: #454545;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus,
-.ui-button:hover,
-.ui-button:focus {
- border: 1px solid #cccccc;
- background: #ededed;
- font-weight: normal;
- color: #2b2b2b;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited,
-a.ui-button:hover,
-a.ui-button:focus {
- color: #2b2b2b;
- text-decoration: none;
-}
-
-.ui-visual-focus {
- box-shadow: 0 0 3px 1px rgb(94, 158, 214);
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active,
-a.ui-button:active,
-.ui-button:active,
-.ui-button.ui-state-active:hover {
- border: 1px solid #003eff;
- background: #007fff;
- font-weight: normal;
- color: #ffffff;
-}
-.ui-icon-background,
-.ui-state-active .ui-icon-background {
- border: #003eff;
- background-color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #dad55e;
- background: #fffa90;
- color: #777620;
-}
-.ui-state-checked {
- border: 1px solid #dad55e;
- background: #fffa90;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #777620;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #f1a899;
- background: #fddfdf;
- color: #5f3f3f;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #5f3f3f;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #5f3f3f;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- -ms-filter: "alpha(opacity=70)"; /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- -ms-filter: "alpha(opacity=35)"; /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- -ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon,
-.ui-button:hover .ui-icon,
-.ui-button:focus .ui-icon {
- background-image: url("images/ui-icons_555555_256x240.png");
-}
-.ui-state-active .ui-icon,
-.ui-button:active .ui-icon {
- background-image: url("images/ui-icons_ffffff_256x240.png");
-}
-.ui-state-highlight .ui-icon,
-.ui-button .ui-state-highlight.ui-icon {
- background-image: url("images/ui-icons_777620_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("images/ui-icons_cc0000_256x240.png");
-}
-.ui-button .ui-icon {
- background-image: url("images/ui-icons_777777_256x240.png");
-}
-
-/* positioning */
-/* Three classes needed to override `.ui-button:hover .ui-icon` */
-.ui-icon-blank.ui-icon-blank.ui-icon-blank {
- background-image: none;
-}
-.ui-icon-caret-1-n { background-position: 0 0; }
-.ui-icon-caret-1-ne { background-position: -16px 0; }
-.ui-icon-caret-1-e { background-position: -32px 0; }
-.ui-icon-caret-1-se { background-position: -48px 0; }
-.ui-icon-caret-1-s { background-position: -65px 0; }
-.ui-icon-caret-1-sw { background-position: -80px 0; }
-.ui-icon-caret-1-w { background-position: -96px 0; }
-.ui-icon-caret-1-nw { background-position: -112px 0; }
-.ui-icon-caret-2-n-s { background-position: -128px 0; }
-.ui-icon-caret-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -65px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -65px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 3px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #aaaaaa;
- opacity: .003;
- -ms-filter: Alpha(Opacity=.3); /* support: IE8 */
-}
-.ui-widget-shadow {
- -webkit-box-shadow: 0px 0px 5px #666666;
- box-shadow: 0px 0px 5px #666666;
-}
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.js b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.js
deleted file mode 100644
index 5d9bfa2f..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.js
+++ /dev/null
@@ -1,19057 +0,0 @@
-/*! jQuery UI - v1.13.1 - 2022-01-20
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-( function( factory ) {
- "use strict";
-
- if ( typeof define === "function" && define.amd ) {
-
- // AMD. Register as an anonymous module.
- define( [ "jquery" ], factory );
- } else {
-
- // Browser globals
- factory( jQuery );
- }
-} )( function( $ ) {
-"use strict";
-
-$.ui = $.ui || {};
-
-var version = $.ui.version = "1.13.1";
-
-
-/*!
- * jQuery UI Widget 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Widget
-//>>group: Core
-//>>description: Provides a factory for creating stateful widgets with a common API.
-//>>docs: http://api.jqueryui.com/jQuery.widget/
-//>>demos: http://jqueryui.com/widget/
-
-
-var widgetUuid = 0;
-var widgetHasOwnProperty = Array.prototype.hasOwnProperty;
-var widgetSlice = Array.prototype.slice;
-
-$.cleanData = ( function( orig ) {
- return function( elems ) {
- var events, elem, i;
- for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
-
- // Only trigger remove when necessary to save time
- events = $._data( elem, "events" );
- if ( events && events.remove ) {
- $( elem ).triggerHandler( "remove" );
- }
- }
- orig( elems );
- };
-} )( $.cleanData );
-
-$.widget = function( name, base, prototype ) {
- var existingConstructor, constructor, basePrototype;
-
- // ProxiedPrototype allows the provided prototype to remain unmodified
- // so that it can be used as a mixin for multiple widgets (#8876)
- var proxiedPrototype = {};
-
- var namespace = name.split( "." )[ 0 ];
- name = name.split( "." )[ 1 ];
- var fullName = namespace + "-" + name;
-
- if ( !prototype ) {
- prototype = base;
- base = $.Widget;
- }
-
- if ( Array.isArray( prototype ) ) {
- prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
- }
-
- // Create selector for plugin
- $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {
- return !!$.data( elem, fullName );
- };
-
- $[ namespace ] = $[ namespace ] || {};
- existingConstructor = $[ namespace ][ name ];
- constructor = $[ namespace ][ name ] = function( options, element ) {
-
- // Allow instantiation without "new" keyword
- if ( !this || !this._createWidget ) {
- return new constructor( options, element );
- }
-
- // Allow instantiation without initializing for simple inheritance
- // must use "new" keyword (the code above always passes args)
- if ( arguments.length ) {
- this._createWidget( options, element );
- }
- };
-
- // Extend with the existing constructor to carry over any static properties
- $.extend( constructor, existingConstructor, {
- version: prototype.version,
-
- // Copy the object used to create the prototype in case we need to
- // redefine the widget later
- _proto: $.extend( {}, prototype ),
-
- // Track widgets that inherit from this widget in case this widget is
- // redefined after a widget inherits from it
- _childConstructors: []
- } );
-
- basePrototype = new base();
-
- // We need to make the options hash a property directly on the new instance
- // otherwise we'll modify the options hash on the prototype that we're
- // inheriting from
- basePrototype.options = $.widget.extend( {}, basePrototype.options );
- $.each( prototype, function( prop, value ) {
- if ( typeof value !== "function" ) {
- proxiedPrototype[ prop ] = value;
- return;
- }
- proxiedPrototype[ prop ] = ( function() {
- function _super() {
- return base.prototype[ prop ].apply( this, arguments );
- }
-
- function _superApply( args ) {
- return base.prototype[ prop ].apply( this, args );
- }
-
- return function() {
- var __super = this._super;
- var __superApply = this._superApply;
- var returnValue;
-
- this._super = _super;
- this._superApply = _superApply;
-
- returnValue = value.apply( this, arguments );
-
- this._super = __super;
- this._superApply = __superApply;
-
- return returnValue;
- };
- } )();
- } );
- constructor.prototype = $.widget.extend( basePrototype, {
-
- // TODO: remove support for widgetEventPrefix
- // always use the name + a colon as the prefix, e.g., draggable:start
- // don't prefix for widgets that aren't DOM-based
- widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
- }, proxiedPrototype, {
- constructor: constructor,
- namespace: namespace,
- widgetName: name,
- widgetFullName: fullName
- } );
-
- // If this widget is being redefined then we need to find all widgets that
- // are inheriting from it and redefine all of them so that they inherit from
- // the new version of this widget. We're essentially trying to replace one
- // level in the prototype chain.
- if ( existingConstructor ) {
- $.each( existingConstructor._childConstructors, function( i, child ) {
- var childPrototype = child.prototype;
-
- // Redefine the child widget using the same prototype that was
- // originally used, but inherit from the new version of the base
- $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
- child._proto );
- } );
-
- // Remove the list of existing child constructors from the old constructor
- // so the old child constructors can be garbage collected
- delete existingConstructor._childConstructors;
- } else {
- base._childConstructors.push( constructor );
- }
-
- $.widget.bridge( name, constructor );
-
- return constructor;
-};
-
-$.widget.extend = function( target ) {
- var input = widgetSlice.call( arguments, 1 );
- var inputIndex = 0;
- var inputLength = input.length;
- var key;
- var value;
-
- for ( ; inputIndex < inputLength; inputIndex++ ) {
- for ( key in input[ inputIndex ] ) {
- value = input[ inputIndex ][ key ];
- if ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) {
-
- // Clone objects
- if ( $.isPlainObject( value ) ) {
- target[ key ] = $.isPlainObject( target[ key ] ) ?
- $.widget.extend( {}, target[ key ], value ) :
-
- // Don't extend strings, arrays, etc. with objects
- $.widget.extend( {}, value );
-
- // Copy everything else by reference
- } else {
- target[ key ] = value;
- }
- }
- }
- }
- return target;
-};
-
-$.widget.bridge = function( name, object ) {
- var fullName = object.prototype.widgetFullName || name;
- $.fn[ name ] = function( options ) {
- var isMethodCall = typeof options === "string";
- var args = widgetSlice.call( arguments, 1 );
- var returnValue = this;
-
- if ( isMethodCall ) {
-
- // If this is an empty collection, we need to have the instance method
- // return undefined instead of the jQuery instance
- if ( !this.length && options === "instance" ) {
- returnValue = undefined;
- } else {
- this.each( function() {
- var methodValue;
- var instance = $.data( this, fullName );
-
- if ( options === "instance" ) {
- returnValue = instance;
- return false;
- }
-
- if ( !instance ) {
- return $.error( "cannot call methods on " + name +
- " prior to initialization; " +
- "attempted to call method '" + options + "'" );
- }
-
- if ( typeof instance[ options ] !== "function" ||
- options.charAt( 0 ) === "_" ) {
- return $.error( "no such method '" + options + "' for " + name +
- " widget instance" );
- }
-
- methodValue = instance[ options ].apply( instance, args );
-
- if ( methodValue !== instance && methodValue !== undefined ) {
- returnValue = methodValue && methodValue.jquery ?
- returnValue.pushStack( methodValue.get() ) :
- methodValue;
- return false;
- }
- } );
- }
- } else {
-
- // Allow multiple hashes to be passed on init
- if ( args.length ) {
- options = $.widget.extend.apply( null, [ options ].concat( args ) );
- }
-
- this.each( function() {
- var instance = $.data( this, fullName );
- if ( instance ) {
- instance.option( options || {} );
- if ( instance._init ) {
- instance._init();
- }
- } else {
- $.data( this, fullName, new object( options, this ) );
- }
- } );
- }
-
- return returnValue;
- };
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
- widgetName: "widget",
- widgetEventPrefix: "",
- defaultElement: "<div>",
-
- options: {
- classes: {},
- disabled: false,
-
- // Callbacks
- create: null
- },
-
- _createWidget: function( options, element ) {
- element = $( element || this.defaultElement || this )[ 0 ];
- this.element = $( element );
- this.uuid = widgetUuid++;
- this.eventNamespace = "." + this.widgetName + this.uuid;
-
- this.bindings = $();
- this.hoverable = $();
- this.focusable = $();
- this.classesElementLookup = {};
-
- if ( element !== this ) {
- $.data( element, this.widgetFullName, this );
- this._on( true, this.element, {
- remove: function( event ) {
- if ( event.target === element ) {
- this.destroy();
- }
- }
- } );
- this.document = $( element.style ?
-
- // Element within the document
- element.ownerDocument :
-
- // Element is window or document
- element.document || element );
- this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
- }
-
- this.options = $.widget.extend( {},
- this.options,
- this._getCreateOptions(),
- options );
-
- this._create();
-
- if ( this.options.disabled ) {
- this._setOptionDisabled( this.options.disabled );
- }
-
- this._trigger( "create", null, this._getCreateEventData() );
- this._init();
- },
-
- _getCreateOptions: function() {
- return {};
- },
-
- _getCreateEventData: $.noop,
-
- _create: $.noop,
-
- _init: $.noop,
-
- destroy: function() {
- var that = this;
-
- this._destroy();
- $.each( this.classesElementLookup, function( key, value ) {
- that._removeClass( value, key );
- } );
-
- // We can probably remove the unbind calls in 2.0
- // all event bindings should go through this._on()
- this.element
- .off( this.eventNamespace )
- .removeData( this.widgetFullName );
- this.widget()
- .off( this.eventNamespace )
- .removeAttr( "aria-disabled" );
-
- // Clean up events and states
- this.bindings.off( this.eventNamespace );
- },
-
- _destroy: $.noop,
-
- widget: function() {
- return this.element;
- },
-
- option: function( key, value ) {
- var options = key;
- var parts;
- var curOption;
- var i;
-
- if ( arguments.length === 0 ) {
-
- // Don't return a reference to the internal hash
- return $.widget.extend( {}, this.options );
- }
-
- if ( typeof key === "string" ) {
-
- // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
- options = {};
- parts = key.split( "." );
- key = parts.shift();
- if ( parts.length ) {
- curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
- for ( i = 0; i < parts.length - 1; i++ ) {
- curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
- curOption = curOption[ parts[ i ] ];
- }
- key = parts.pop();
- if ( arguments.length === 1 ) {
- return curOption[ key ] === undefined ? null : curOption[ key ];
- }
- curOption[ key ] = value;
- } else {
- if ( arguments.length === 1 ) {
- return this.options[ key ] === undefined ? null : this.options[ key ];
- }
- options[ key ] = value;
- }
- }
-
- this._setOptions( options );
-
- return this;
- },
-
- _setOptions: function( options ) {
- var key;
-
- for ( key in options ) {
- this._setOption( key, options[ key ] );
- }
-
- return this;
- },
-
- _setOption: function( key, value ) {
- if ( key === "classes" ) {
- this._setOptionClasses( value );
- }
-
- this.options[ key ] = value;
-
- if ( key === "disabled" ) {
- this._setOptionDisabled( value );
- }
-
- return this;
- },
-
- _setOptionClasses: function( value ) {
- var classKey, elements, currentElements;
-
- for ( classKey in value ) {
- currentElements = this.classesElementLookup[ classKey ];
- if ( value[ classKey ] === this.options.classes[ classKey ] ||
- !currentElements ||
- !currentElements.length ) {
- continue;
- }
-
- // We are doing this to create a new jQuery object because the _removeClass() call
- // on the next line is going to destroy the reference to the current elements being
- // tracked. We need to save a copy of this collection so that we can add the new classes
- // below.
- elements = $( currentElements.get() );
- this._removeClass( currentElements, classKey );
-
- // We don't use _addClass() here, because that uses this.options.classes
- // for generating the string of classes. We want to use the value passed in from
- // _setOption(), this is the new value of the classes option which was passed to
- // _setOption(). We pass this value directly to _classes().
- elements.addClass( this._classes( {
- element: elements,
- keys: classKey,
- classes: value,
- add: true
- } ) );
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
-
- // If the widget is becoming disabled, then nothing is interactive
- if ( value ) {
- this._removeClass( this.hoverable, null, "ui-state-hover" );
- this._removeClass( this.focusable, null, "ui-state-focus" );
- }
- },
-
- enable: function() {
- return this._setOptions( { disabled: false } );
- },
-
- disable: function() {
- return this._setOptions( { disabled: true } );
- },
-
- _classes: function( options ) {
- var full = [];
- var that = this;
-
- options = $.extend( {
- element: this.element,
- classes: this.options.classes || {}
- }, options );
-
- function bindRemoveEvent() {
- var nodesToBind = [];
-
- options.element.each( function( _, element ) {
- var isTracked = $.map( that.classesElementLookup, function( elements ) {
- return elements;
- } )
- .some( function( elements ) {
- return elements.is( element );
- } );
-
- if ( !isTracked ) {
- nodesToBind.push( element );
- }
- } );
-
- that._on( $( nodesToBind ), {
- remove: "_untrackClassesElement"
- } );
- }
-
- function processClassString( classes, checkOption ) {
- var current, i;
- for ( i = 0; i < classes.length; i++ ) {
- current = that.classesElementLookup[ classes[ i ] ] || $();
- if ( options.add ) {
- bindRemoveEvent();
- current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );
- } else {
- current = $( current.not( options.element ).get() );
- }
- that.classesElementLookup[ classes[ i ] ] = current;
- full.push( classes[ i ] );
- if ( checkOption && options.classes[ classes[ i ] ] ) {
- full.push( options.classes[ classes[ i ] ] );
- }
- }
- }
-
- if ( options.keys ) {
- processClassString( options.keys.match( /\S+/g ) || [], true );
- }
- if ( options.extra ) {
- processClassString( options.extra.match( /\S+/g ) || [] );
- }
-
- return full.join( " " );
- },
-
- _untrackClassesElement: function( event ) {
- var that = this;
- $.each( that.classesElementLookup, function( key, value ) {
- if ( $.inArray( event.target, value ) !== -1 ) {
- that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
- }
- } );
-
- this._off( $( event.target ) );
- },
-
- _removeClass: function( element, keys, extra ) {
- return this._toggleClass( element, keys, extra, false );
- },
-
- _addClass: function( element, keys, extra ) {
- return this._toggleClass( element, keys, extra, true );
- },
-
- _toggleClass: function( element, keys, extra, add ) {
- add = ( typeof add === "boolean" ) ? add : extra;
- var shift = ( typeof element === "string" || element === null ),
- options = {
- extra: shift ? keys : extra,
- keys: shift ? element : keys,
- element: shift ? this.element : element,
- add: add
- };
- options.element.toggleClass( this._classes( options ), add );
- return this;
- },
-
- _on: function( suppressDisabledCheck, element, handlers ) {
- var delegateElement;
- var instance = this;
-
- // No suppressDisabledCheck flag, shuffle arguments
- if ( typeof suppressDisabledCheck !== "boolean" ) {
- handlers = element;
- element = suppressDisabledCheck;
- suppressDisabledCheck = false;
- }
-
- // No element argument, shuffle and use this.element
- if ( !handlers ) {
- handlers = element;
- element = this.element;
- delegateElement = this.widget();
- } else {
- element = delegateElement = $( element );
- this.bindings = this.bindings.add( element );
- }
-
- $.each( handlers, function( event, handler ) {
- function handlerProxy() {
-
- // Allow widgets to customize the disabled handling
- // - disabled as an array instead of boolean
- // - disabled class as method for disabling individual parts
- if ( !suppressDisabledCheck &&
- ( instance.options.disabled === true ||
- $( this ).hasClass( "ui-state-disabled" ) ) ) {
- return;
- }
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
-
- // Copy the guid so direct unbinding works
- if ( typeof handler !== "string" ) {
- handlerProxy.guid = handler.guid =
- handler.guid || handlerProxy.guid || $.guid++;
- }
-
- var match = event.match( /^([\w:-]*)\s*(.*)$/ );
- var eventName = match[ 1 ] + instance.eventNamespace;
- var selector = match[ 2 ];
-
- if ( selector ) {
- delegateElement.on( eventName, selector, handlerProxy );
- } else {
- element.on( eventName, handlerProxy );
- }
- } );
- },
-
- _off: function( element, eventName ) {
- eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
- this.eventNamespace;
- element.off( eventName );
-
- // Clear the stack to avoid memory leaks (#10056)
- this.bindings = $( this.bindings.not( element ).get() );
- this.focusable = $( this.focusable.not( element ).get() );
- this.hoverable = $( this.hoverable.not( element ).get() );
- },
-
- _delay: function( handler, delay ) {
- function handlerProxy() {
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
- var instance = this;
- return setTimeout( handlerProxy, delay || 0 );
- },
-
- _hoverable: function( element ) {
- this.hoverable = this.hoverable.add( element );
- this._on( element, {
- mouseenter: function( event ) {
- this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
- },
- mouseleave: function( event ) {
- this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
- }
- } );
- },
-
- _focusable: function( element ) {
- this.focusable = this.focusable.add( element );
- this._on( element, {
- focusin: function( event ) {
- this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
- },
- focusout: function( event ) {
- this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
- }
- } );
- },
-
- _trigger: function( type, event, data ) {
- var prop, orig;
- var callback = this.options[ type ];
-
- data = data || {};
- event = $.Event( event );
- event.type = ( type === this.widgetEventPrefix ?
- type :
- this.widgetEventPrefix + type ).toLowerCase();
-
- // The original event may come from any element
- // so we need to reset the target on the new event
- event.target = this.element[ 0 ];
-
- // Copy original event properties over to the new event
- orig = event.originalEvent;
- if ( orig ) {
- for ( prop in orig ) {
- if ( !( prop in event ) ) {
- event[ prop ] = orig[ prop ];
- }
- }
- }
-
- this.element.trigger( event, data );
- return !( typeof callback === "function" &&
- callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
- event.isDefaultPrevented() );
- }
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
- $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
- if ( typeof options === "string" ) {
- options = { effect: options };
- }
-
- var hasOptions;
- var effectName = !options ?
- method :
- options === true || typeof options === "number" ?
- defaultEffect :
- options.effect || defaultEffect;
-
- options = options || {};
- if ( typeof options === "number" ) {
- options = { duration: options };
- } else if ( options === true ) {
- options = {};
- }
-
- hasOptions = !$.isEmptyObject( options );
- options.complete = callback;
-
- if ( options.delay ) {
- element.delay( options.delay );
- }
-
- if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
- element[ method ]( options );
- } else if ( effectName !== method && element[ effectName ] ) {
- element[ effectName ]( options.duration, options.easing, callback );
- } else {
- element.queue( function( next ) {
- $( this )[ method ]();
- if ( callback ) {
- callback.call( element[ 0 ] );
- }
- next();
- } );
- }
- };
-} );
-
-var widget = $.widget;
-
-
-/*!
- * jQuery UI Position 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/position/
- */
-
-//>>label: Position
-//>>group: Core
-//>>description: Positions elements relative to other elements.
-//>>docs: http://api.jqueryui.com/position/
-//>>demos: http://jqueryui.com/position/
-
-
-( function() {
-var cachedScrollbarWidth,
- max = Math.max,
- abs = Math.abs,
- rhorizontal = /left|center|right/,
- rvertical = /top|center|bottom/,
- roffset = /[\+\-]\d+(\.[\d]+)?%?/,
- rposition = /^\w+/,
- rpercent = /%$/,
- _position = $.fn.position;
-
-function getOffsets( offsets, width, height ) {
- return [
- parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
- parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
- ];
-}
-
-function parseCss( element, property ) {
- return parseInt( $.css( element, property ), 10 ) || 0;
-}
-
-function isWindow( obj ) {
- return obj != null && obj === obj.window;
-}
-
-function getDimensions( elem ) {
- var raw = elem[ 0 ];
- if ( raw.nodeType === 9 ) {
- return {
- width: elem.width(),
- height: elem.height(),
- offset: { top: 0, left: 0 }
- };
- }
- if ( isWindow( raw ) ) {
- return {
- width: elem.width(),
- height: elem.height(),
- offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
- };
- }
- if ( raw.preventDefault ) {
- return {
- width: 0,
- height: 0,
- offset: { top: raw.pageY, left: raw.pageX }
- };
- }
- return {
- width: elem.outerWidth(),
- height: elem.outerHeight(),
- offset: elem.offset()
- };
-}
-
-$.position = {
- scrollbarWidth: function() {
- if ( cachedScrollbarWidth !== undefined ) {
- return cachedScrollbarWidth;
- }
- var w1, w2,
- div = $( "<div style=" +
- "'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>" +
- "<div style='height:300px;width:auto;'></div></div>" ),
- innerDiv = div.children()[ 0 ];
-
- $( "body" ).append( div );
- w1 = innerDiv.offsetWidth;
- div.css( "overflow", "scroll" );
-
- w2 = innerDiv.offsetWidth;
-
- if ( w1 === w2 ) {
- w2 = div[ 0 ].clientWidth;
- }
-
- div.remove();
-
- return ( cachedScrollbarWidth = w1 - w2 );
- },
- getScrollInfo: function( within ) {
- var overflowX = within.isWindow || within.isDocument ? "" :
- within.element.css( "overflow-x" ),
- overflowY = within.isWindow || within.isDocument ? "" :
- within.element.css( "overflow-y" ),
- hasOverflowX = overflowX === "scroll" ||
- ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
- hasOverflowY = overflowY === "scroll" ||
- ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
- return {
- width: hasOverflowY ? $.position.scrollbarWidth() : 0,
- height: hasOverflowX ? $.position.scrollbarWidth() : 0
- };
- },
- getWithinInfo: function( element ) {
- var withinElement = $( element || window ),
- isElemWindow = isWindow( withinElement[ 0 ] ),
- isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
- hasOffset = !isElemWindow && !isDocument;
- return {
- element: withinElement,
- isWindow: isElemWindow,
- isDocument: isDocument,
- offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
- scrollLeft: withinElement.scrollLeft(),
- scrollTop: withinElement.scrollTop(),
- width: withinElement.outerWidth(),
- height: withinElement.outerHeight()
- };
- }
-};
-
-$.fn.position = function( options ) {
- if ( !options || !options.of ) {
- return _position.apply( this, arguments );
- }
-
- // Make a copy, we don't want to modify arguments
- options = $.extend( {}, options );
-
- var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
-
- // Make sure string options are treated as CSS selectors
- target = typeof options.of === "string" ?
- $( document ).find( options.of ) :
- $( options.of ),
-
- within = $.position.getWithinInfo( options.within ),
- scrollInfo = $.position.getScrollInfo( within ),
- collision = ( options.collision || "flip" ).split( " " ),
- offsets = {};
-
- dimensions = getDimensions( target );
- if ( target[ 0 ].preventDefault ) {
-
- // Force left top to allow flipping
- options.at = "left top";
- }
- targetWidth = dimensions.width;
- targetHeight = dimensions.height;
- targetOffset = dimensions.offset;
-
- // Clone to reuse original targetOffset later
- basePosition = $.extend( {}, targetOffset );
-
- // Force my and at to have valid horizontal and vertical positions
- // if a value is missing or invalid, it will be converted to center
- $.each( [ "my", "at" ], function() {
- var pos = ( options[ this ] || "" ).split( " " ),
- horizontalOffset,
- verticalOffset;
-
- if ( pos.length === 1 ) {
- pos = rhorizontal.test( pos[ 0 ] ) ?
- pos.concat( [ "center" ] ) :
- rvertical.test( pos[ 0 ] ) ?
- [ "center" ].concat( pos ) :
- [ "center", "center" ];
- }
- pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
- pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
-
- // Calculate offsets
- horizontalOffset = roffset.exec( pos[ 0 ] );
- verticalOffset = roffset.exec( pos[ 1 ] );
- offsets[ this ] = [
- horizontalOffset ? horizontalOffset[ 0 ] : 0,
- verticalOffset ? verticalOffset[ 0 ] : 0
- ];
-
- // Reduce to just the positions without the offsets
- options[ this ] = [
- rposition.exec( pos[ 0 ] )[ 0 ],
- rposition.exec( pos[ 1 ] )[ 0 ]
- ];
- } );
-
- // Normalize collision option
- if ( collision.length === 1 ) {
- collision[ 1 ] = collision[ 0 ];
- }
-
- if ( options.at[ 0 ] === "right" ) {
- basePosition.left += targetWidth;
- } else if ( options.at[ 0 ] === "center" ) {
- basePosition.left += targetWidth / 2;
- }
-
- if ( options.at[ 1 ] === "bottom" ) {
- basePosition.top += targetHeight;
- } else if ( options.at[ 1 ] === "center" ) {
- basePosition.top += targetHeight / 2;
- }
-
- atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
- basePosition.left += atOffset[ 0 ];
- basePosition.top += atOffset[ 1 ];
-
- return this.each( function() {
- var collisionPosition, using,
- elem = $( this ),
- elemWidth = elem.outerWidth(),
- elemHeight = elem.outerHeight(),
- marginLeft = parseCss( this, "marginLeft" ),
- marginTop = parseCss( this, "marginTop" ),
- collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
- scrollInfo.width,
- collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
- scrollInfo.height,
- position = $.extend( {}, basePosition ),
- myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
-
- if ( options.my[ 0 ] === "right" ) {
- position.left -= elemWidth;
- } else if ( options.my[ 0 ] === "center" ) {
- position.left -= elemWidth / 2;
- }
-
- if ( options.my[ 1 ] === "bottom" ) {
- position.top -= elemHeight;
- } else if ( options.my[ 1 ] === "center" ) {
- position.top -= elemHeight / 2;
- }
-
- position.left += myOffset[ 0 ];
- position.top += myOffset[ 1 ];
-
- collisionPosition = {
- marginLeft: marginLeft,
- marginTop: marginTop
- };
-
- $.each( [ "left", "top" ], function( i, dir ) {
- if ( $.ui.position[ collision[ i ] ] ) {
- $.ui.position[ collision[ i ] ][ dir ]( position, {
- targetWidth: targetWidth,
- targetHeight: targetHeight,
- elemWidth: elemWidth,
- elemHeight: elemHeight,
- collisionPosition: collisionPosition,
- collisionWidth: collisionWidth,
- collisionHeight: collisionHeight,
- offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
- my: options.my,
- at: options.at,
- within: within,
- elem: elem
- } );
- }
- } );
-
- if ( options.using ) {
-
- // Adds feedback as second argument to using callback, if present
- using = function( props ) {
- var left = targetOffset.left - position.left,
- right = left + targetWidth - elemWidth,
- top = targetOffset.top - position.top,
- bottom = top + targetHeight - elemHeight,
- feedback = {
- target: {
- element: target,
- left: targetOffset.left,
- top: targetOffset.top,
- width: targetWidth,
- height: targetHeight
- },
- element: {
- element: elem,
- left: position.left,
- top: position.top,
- width: elemWidth,
- height: elemHeight
- },
- horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
- vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
- };
- if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
- feedback.horizontal = "center";
- }
- if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
- feedback.vertical = "middle";
- }
- if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
- feedback.important = "horizontal";
- } else {
- feedback.important = "vertical";
- }
- options.using.call( this, props, feedback );
- };
- }
-
- elem.offset( $.extend( position, { using: using } ) );
- } );
-};
-
-$.ui.position = {
- fit: {
- left: function( position, data ) {
- var within = data.within,
- withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
- outerWidth = within.width,
- collisionPosLeft = position.left - data.collisionPosition.marginLeft,
- overLeft = withinOffset - collisionPosLeft,
- overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
- newOverRight;
-
- // Element is wider than within
- if ( data.collisionWidth > outerWidth ) {
-
- // Element is initially over the left side of within
- if ( overLeft > 0 && overRight <= 0 ) {
- newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
- withinOffset;
- position.left += overLeft - newOverRight;
-
- // Element is initially over right side of within
- } else if ( overRight > 0 && overLeft <= 0 ) {
- position.left = withinOffset;
-
- // Element is initially over both left and right sides of within
- } else {
- if ( overLeft > overRight ) {
- position.left = withinOffset + outerWidth - data.collisionWidth;
- } else {
- position.left = withinOffset;
- }
- }
-
- // Too far left -> align with left edge
- } else if ( overLeft > 0 ) {
- position.left += overLeft;
-
- // Too far right -> align with right edge
- } else if ( overRight > 0 ) {
- position.left -= overRight;
-
- // Adjust based on position and margin
- } else {
- position.left = max( position.left - collisionPosLeft, position.left );
- }
- },
- top: function( position, data ) {
- var within = data.within,
- withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
- outerHeight = data.within.height,
- collisionPosTop = position.top - data.collisionPosition.marginTop,
- overTop = withinOffset - collisionPosTop,
- overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
- newOverBottom;
-
- // Element is taller than within
- if ( data.collisionHeight > outerHeight ) {
-
- // Element is initially over the top of within
- if ( overTop > 0 && overBottom <= 0 ) {
- newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
- withinOffset;
- position.top += overTop - newOverBottom;
-
- // Element is initially over bottom of within
- } else if ( overBottom > 0 && overTop <= 0 ) {
- position.top = withinOffset;
-
- // Element is initially over both top and bottom of within
- } else {
- if ( overTop > overBottom ) {
- position.top = withinOffset + outerHeight - data.collisionHeight;
- } else {
- position.top = withinOffset;
- }
- }
-
- // Too far up -> align with top
- } else if ( overTop > 0 ) {
- position.top += overTop;
-
- // Too far down -> align with bottom edge
- } else if ( overBottom > 0 ) {
- position.top -= overBottom;
-
- // Adjust based on position and margin
- } else {
- position.top = max( position.top - collisionPosTop, position.top );
- }
- }
- },
- flip: {
- left: function( position, data ) {
- var within = data.within,
- withinOffset = within.offset.left + within.scrollLeft,
- outerWidth = within.width,
- offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
- collisionPosLeft = position.left - data.collisionPosition.marginLeft,
- overLeft = collisionPosLeft - offsetLeft,
- overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
- myOffset = data.my[ 0 ] === "left" ?
- -data.elemWidth :
- data.my[ 0 ] === "right" ?
- data.elemWidth :
- 0,
- atOffset = data.at[ 0 ] === "left" ?
- data.targetWidth :
- data.at[ 0 ] === "right" ?
- -data.targetWidth :
- 0,
- offset = -2 * data.offset[ 0 ],
- newOverRight,
- newOverLeft;
-
- if ( overLeft < 0 ) {
- newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
- outerWidth - withinOffset;
- if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
- position.left += myOffset + atOffset + offset;
- }
- } else if ( overRight > 0 ) {
- newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
- atOffset + offset - offsetLeft;
- if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
- position.left += myOffset + atOffset + offset;
- }
- }
- },
- top: function( position, data ) {
- var within = data.within,
- withinOffset = within.offset.top + within.scrollTop,
- outerHeight = within.height,
- offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
- collisionPosTop = position.top - data.collisionPosition.marginTop,
- overTop = collisionPosTop - offsetTop,
- overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
- top = data.my[ 1 ] === "top",
- myOffset = top ?
- -data.elemHeight :
- data.my[ 1 ] === "bottom" ?
- data.elemHeight :
- 0,
- atOffset = data.at[ 1 ] === "top" ?
- data.targetHeight :
- data.at[ 1 ] === "bottom" ?
- -data.targetHeight :
- 0,
- offset = -2 * data.offset[ 1 ],
- newOverTop,
- newOverBottom;
- if ( overTop < 0 ) {
- newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
- outerHeight - withinOffset;
- if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
- position.top += myOffset + atOffset + offset;
- }
- } else if ( overBottom > 0 ) {
- newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
- offset - offsetTop;
- if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
- position.top += myOffset + atOffset + offset;
- }
- }
- }
- },
- flipfit: {
- left: function() {
- $.ui.position.flip.left.apply( this, arguments );
- $.ui.position.fit.left.apply( this, arguments );
- },
- top: function() {
- $.ui.position.flip.top.apply( this, arguments );
- $.ui.position.fit.top.apply( this, arguments );
- }
- }
-};
-
-} )();
-
-var position = $.ui.position;
-
-
-/*!
- * jQuery UI :data 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :data Selector
-//>>group: Core
-//>>description: Selects elements which have data stored under the specified key.
-//>>docs: http://api.jqueryui.com/data-selector/
-
-
-var data = $.extend( $.expr.pseudos, {
- data: $.expr.createPseudo ?
- $.expr.createPseudo( function( dataName ) {
- return function( elem ) {
- return !!$.data( elem, dataName );
- };
- } ) :
-
- // Support: jQuery <1.8
- function( elem, i, match ) {
- return !!$.data( elem, match[ 3 ] );
- }
-} );
-
-/*!
- * jQuery UI Disable Selection 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: disableSelection
-//>>group: Core
-//>>description: Disable selection of text content within the set of matched elements.
-//>>docs: http://api.jqueryui.com/disableSelection/
-
-// This file is deprecated
-
-var disableSelection = $.fn.extend( {
- disableSelection: ( function() {
- var eventType = "onselectstart" in document.createElement( "div" ) ?
- "selectstart" :
- "mousedown";
-
- return function() {
- return this.on( eventType + ".ui-disableSelection", function( event ) {
- event.preventDefault();
- } );
- };
- } )(),
-
- enableSelection: function() {
- return this.off( ".ui-disableSelection" );
- }
-} );
-
-
-
-// Create a local jQuery because jQuery Color relies on it and the
-// global may not exist with AMD and a custom build (#10199).
-// This module is a noop if used as a regular AMD module.
-// eslint-disable-next-line no-unused-vars
-var jQuery = $;
-
-
-/*!
- * jQuery Color Animations v2.2.0
- * https://github.com/jquery/jquery-color
- *
- * Copyright OpenJS Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * Date: Sun May 10 09:02:36 2020 +0200
- */
-
-
-
- var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
- "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
-
- class2type = {},
- toString = class2type.toString,
-
- // plusequals test for += 100 -= 100
- rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
-
- // a set of RE's that can match strings and generate color tuples.
- stringParsers = [ {
- re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
- parse: function( execResult ) {
- return [
- execResult[ 1 ],
- execResult[ 2 ],
- execResult[ 3 ],
- execResult[ 4 ]
- ];
- }
- }, {
- re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
- parse: function( execResult ) {
- return [
- execResult[ 1 ] * 2.55,
- execResult[ 2 ] * 2.55,
- execResult[ 3 ] * 2.55,
- execResult[ 4 ]
- ];
- }
- }, {
-
- // this regex ignores A-F because it's compared against an already lowercased string
- re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/,
- parse: function( execResult ) {
- return [
- parseInt( execResult[ 1 ], 16 ),
- parseInt( execResult[ 2 ], 16 ),
- parseInt( execResult[ 3 ], 16 ),
- execResult[ 4 ] ?
- ( parseInt( execResult[ 4 ], 16 ) / 255 ).toFixed( 2 ) :
- 1
- ];
- }
- }, {
-
- // this regex ignores A-F because it's compared against an already lowercased string
- re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,
- parse: function( execResult ) {
- return [
- parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
- parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
- parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ),
- execResult[ 4 ] ?
- ( parseInt( execResult[ 4 ] + execResult[ 4 ], 16 ) / 255 )
- .toFixed( 2 ) :
- 1
- ];
- }
- }, {
- re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
- space: "hsla",
- parse: function( execResult ) {
- return [
- execResult[ 1 ],
- execResult[ 2 ] / 100,
- execResult[ 3 ] / 100,
- execResult[ 4 ]
- ];
- }
- } ],
-
- // jQuery.Color( )
- color = jQuery.Color = function( color, green, blue, alpha ) {
- return new jQuery.Color.fn.parse( color, green, blue, alpha );
- },
- spaces = {
- rgba: {
- props: {
- red: {
- idx: 0,
- type: "byte"
- },
- green: {
- idx: 1,
- type: "byte"
- },
- blue: {
- idx: 2,
- type: "byte"
- }
- }
- },
-
- hsla: {
- props: {
- hue: {
- idx: 0,
- type: "degrees"
- },
- saturation: {
- idx: 1,
- type: "percent"
- },
- lightness: {
- idx: 2,
- type: "percent"
- }
- }
- }
- },
- propTypes = {
- "byte": {
- floor: true,
- max: 255
- },
- "percent": {
- max: 1
- },
- "degrees": {
- mod: 360,
- floor: true
- }
- },
- support = color.support = {},
-
- // element for support tests
- supportElem = jQuery( "<p>" )[ 0 ],
-
- // colors = jQuery.Color.names
- colors,
-
- // local aliases of functions called often
- each = jQuery.each;
-
-// determine rgba support immediately
-supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
-support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
-
-// define cache name and alpha properties
-// for rgba and hsla spaces
-each( spaces, function( spaceName, space ) {
- space.cache = "_" + spaceName;
- space.props.alpha = {
- idx: 3,
- type: "percent",
- def: 1
- };
-} );
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
- function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
- } );
-
-function getType( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
-
- return typeof obj === "object" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
-}
-
-function clamp( value, prop, allowEmpty ) {
- var type = propTypes[ prop.type ] || {};
-
- if ( value == null ) {
- return ( allowEmpty || !prop.def ) ? null : prop.def;
- }
-
- // ~~ is an short way of doing floor for positive numbers
- value = type.floor ? ~~value : parseFloat( value );
-
- // IE will pass in empty strings as value for alpha,
- // which will hit this case
- if ( isNaN( value ) ) {
- return prop.def;
- }
-
- if ( type.mod ) {
-
- // we add mod before modding to make sure that negatives values
- // get converted properly: -10 -> 350
- return ( value + type.mod ) % type.mod;
- }
-
- // for now all property types without mod have min and max
- return Math.min( type.max, Math.max( 0, value ) );
-}
-
-function stringParse( string ) {
- var inst = color(),
- rgba = inst._rgba = [];
-
- string = string.toLowerCase();
-
- each( stringParsers, function( _i, parser ) {
- var parsed,
- match = parser.re.exec( string ),
- values = match && parser.parse( match ),
- spaceName = parser.space || "rgba";
-
- if ( values ) {
- parsed = inst[ spaceName ]( values );
-
- // if this was an rgba parse the assignment might happen twice
- // oh well....
- inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
- rgba = inst._rgba = parsed._rgba;
-
- // exit each( stringParsers ) here because we matched
- return false;
- }
- } );
-
- // Found a stringParser that handled it
- if ( rgba.length ) {
-
- // if this came from a parsed string, force "transparent" when alpha is 0
- // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
- if ( rgba.join() === "0,0,0,0" ) {
- jQuery.extend( rgba, colors.transparent );
- }
- return inst;
- }
-
- // named colors
- return colors[ string ];
-}
-
-color.fn = jQuery.extend( color.prototype, {
- parse: function( red, green, blue, alpha ) {
- if ( red === undefined ) {
- this._rgba = [ null, null, null, null ];
- return this;
- }
- if ( red.jquery || red.nodeType ) {
- red = jQuery( red ).css( green );
- green = undefined;
- }
-
- var inst = this,
- type = getType( red ),
- rgba = this._rgba = [];
-
- // more than 1 argument specified - assume ( red, green, blue, alpha )
- if ( green !== undefined ) {
- red = [ red, green, blue, alpha ];
- type = "array";
- }
-
- if ( type === "string" ) {
- return this.parse( stringParse( red ) || colors._default );
- }
-
- if ( type === "array" ) {
- each( spaces.rgba.props, function( _key, prop ) {
- rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
- } );
- return this;
- }
-
- if ( type === "object" ) {
- if ( red instanceof color ) {
- each( spaces, function( _spaceName, space ) {
- if ( red[ space.cache ] ) {
- inst[ space.cache ] = red[ space.cache ].slice();
- }
- } );
- } else {
- each( spaces, function( _spaceName, space ) {
- var cache = space.cache;
- each( space.props, function( key, prop ) {
-
- // if the cache doesn't exist, and we know how to convert
- if ( !inst[ cache ] && space.to ) {
-
- // if the value was null, we don't need to copy it
- // if the key was alpha, we don't need to copy it either
- if ( key === "alpha" || red[ key ] == null ) {
- return;
- }
- inst[ cache ] = space.to( inst._rgba );
- }
-
- // this is the only case where we allow nulls for ALL properties.
- // call clamp with alwaysAllowEmpty
- inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
- } );
-
- // everything defined but alpha?
- if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
-
- // use the default of 1
- if ( inst[ cache ][ 3 ] == null ) {
- inst[ cache ][ 3 ] = 1;
- }
-
- if ( space.from ) {
- inst._rgba = space.from( inst[ cache ] );
- }
- }
- } );
- }
- return this;
- }
- },
- is: function( compare ) {
- var is = color( compare ),
- same = true,
- inst = this;
-
- each( spaces, function( _, space ) {
- var localCache,
- isCache = is[ space.cache ];
- if ( isCache ) {
- localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
- each( space.props, function( _, prop ) {
- if ( isCache[ prop.idx ] != null ) {
- same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
- return same;
- }
- } );
- }
- return same;
- } );
- return same;
- },
- _space: function() {
- var used = [],
- inst = this;
- each( spaces, function( spaceName, space ) {
- if ( inst[ space.cache ] ) {
- used.push( spaceName );
- }
- } );
- return used.pop();
- },
- transition: function( other, distance ) {
- var end = color( other ),
- spaceName = end._space(),
- space = spaces[ spaceName ],
- startColor = this.alpha() === 0 ? color( "transparent" ) : this,
- start = startColor[ space.cache ] || space.to( startColor._rgba ),
- result = start.slice();
-
- end = end[ space.cache ];
- each( space.props, function( _key, prop ) {
- var index = prop.idx,
- startValue = start[ index ],
- endValue = end[ index ],
- type = propTypes[ prop.type ] || {};
-
- // if null, don't override start value
- if ( endValue === null ) {
- return;
- }
-
- // if null - use end
- if ( startValue === null ) {
- result[ index ] = endValue;
- } else {
- if ( type.mod ) {
- if ( endValue - startValue > type.mod / 2 ) {
- startValue += type.mod;
- } else if ( startValue - endValue > type.mod / 2 ) {
- startValue -= type.mod;
- }
- }
- result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
- }
- } );
- return this[ spaceName ]( result );
- },
- blend: function( opaque ) {
-
- // if we are already opaque - return ourself
- if ( this._rgba[ 3 ] === 1 ) {
- return this;
- }
-
- var rgb = this._rgba.slice(),
- a = rgb.pop(),
- blend = color( opaque )._rgba;
-
- return color( jQuery.map( rgb, function( v, i ) {
- return ( 1 - a ) * blend[ i ] + a * v;
- } ) );
- },
- toRgbaString: function() {
- var prefix = "rgba(",
- rgba = jQuery.map( this._rgba, function( v, i ) {
- if ( v != null ) {
- return v;
- }
- return i > 2 ? 1 : 0;
- } );
-
- if ( rgba[ 3 ] === 1 ) {
- rgba.pop();
- prefix = "rgb(";
- }
-
- return prefix + rgba.join() + ")";
- },
- toHslaString: function() {
- var prefix = "hsla(",
- hsla = jQuery.map( this.hsla(), function( v, i ) {
- if ( v == null ) {
- v = i > 2 ? 1 : 0;
- }
-
- // catch 1 and 2
- if ( i && i < 3 ) {
- v = Math.round( v * 100 ) + "%";
- }
- return v;
- } );
-
- if ( hsla[ 3 ] === 1 ) {
- hsla.pop();
- prefix = "hsl(";
- }
- return prefix + hsla.join() + ")";
- },
- toHexString: function( includeAlpha ) {
- var rgba = this._rgba.slice(),
- alpha = rgba.pop();
-
- if ( includeAlpha ) {
- rgba.push( ~~( alpha * 255 ) );
- }
-
- return "#" + jQuery.map( rgba, function( v ) {
-
- // default to 0 when nulls exist
- v = ( v || 0 ).toString( 16 );
- return v.length === 1 ? "0" + v : v;
- } ).join( "" );
- },
- toString: function() {
- return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
- }
-} );
-color.fn.parse.prototype = color.fn;
-
-// hsla conversions adapted from:
-// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
-
-function hue2rgb( p, q, h ) {
- h = ( h + 1 ) % 1;
- if ( h * 6 < 1 ) {
- return p + ( q - p ) * h * 6;
- }
- if ( h * 2 < 1 ) {
- return q;
- }
- if ( h * 3 < 2 ) {
- return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
- }
- return p;
-}
-
-spaces.hsla.to = function( rgba ) {
- if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
- return [ null, null, null, rgba[ 3 ] ];
- }
- var r = rgba[ 0 ] / 255,
- g = rgba[ 1 ] / 255,
- b = rgba[ 2 ] / 255,
- a = rgba[ 3 ],
- max = Math.max( r, g, b ),
- min = Math.min( r, g, b ),
- diff = max - min,
- add = max + min,
- l = add * 0.5,
- h, s;
-
- if ( min === max ) {
- h = 0;
- } else if ( r === max ) {
- h = ( 60 * ( g - b ) / diff ) + 360;
- } else if ( g === max ) {
- h = ( 60 * ( b - r ) / diff ) + 120;
- } else {
- h = ( 60 * ( r - g ) / diff ) + 240;
- }
-
- // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
- // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
- if ( diff === 0 ) {
- s = 0;
- } else if ( l <= 0.5 ) {
- s = diff / add;
- } else {
- s = diff / ( 2 - add );
- }
- return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
-};
-
-spaces.hsla.from = function( hsla ) {
- if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
- return [ null, null, null, hsla[ 3 ] ];
- }
- var h = hsla[ 0 ] / 360,
- s = hsla[ 1 ],
- l = hsla[ 2 ],
- a = hsla[ 3 ],
- q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
- p = 2 * l - q;
-
- return [
- Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
- Math.round( hue2rgb( p, q, h ) * 255 ),
- Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
- a
- ];
-};
-
-
-each( spaces, function( spaceName, space ) {
- var props = space.props,
- cache = space.cache,
- to = space.to,
- from = space.from;
-
- // makes rgba() and hsla()
- color.fn[ spaceName ] = function( value ) {
-
- // generate a cache for this space if it doesn't exist
- if ( to && !this[ cache ] ) {
- this[ cache ] = to( this._rgba );
- }
- if ( value === undefined ) {
- return this[ cache ].slice();
- }
-
- var ret,
- type = getType( value ),
- arr = ( type === "array" || type === "object" ) ? value : arguments,
- local = this[ cache ].slice();
-
- each( props, function( key, prop ) {
- var val = arr[ type === "object" ? key : prop.idx ];
- if ( val == null ) {
- val = local[ prop.idx ];
- }
- local[ prop.idx ] = clamp( val, prop );
- } );
-
- if ( from ) {
- ret = color( from( local ) );
- ret[ cache ] = local;
- return ret;
- } else {
- return color( local );
- }
- };
-
- // makes red() green() blue() alpha() hue() saturation() lightness()
- each( props, function( key, prop ) {
-
- // alpha is included in more than one space
- if ( color.fn[ key ] ) {
- return;
- }
- color.fn[ key ] = function( value ) {
- var local, cur, match, fn,
- vtype = getType( value );
-
- if ( key === "alpha" ) {
- fn = this._hsla ? "hsla" : "rgba";
- } else {
- fn = spaceName;
- }
- local = this[ fn ]();
- cur = local[ prop.idx ];
-
- if ( vtype === "undefined" ) {
- return cur;
- }
-
- if ( vtype === "function" ) {
- value = value.call( this, cur );
- vtype = getType( value );
- }
- if ( value == null && prop.empty ) {
- return this;
- }
- if ( vtype === "string" ) {
- match = rplusequals.exec( value );
- if ( match ) {
- value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
- }
- }
- local[ prop.idx ] = value;
- return this[ fn ]( local );
- };
- } );
-} );
-
-// add cssHook and .fx.step function for each named hook.
-// accept a space separated string of properties
-color.hook = function( hook ) {
- var hooks = hook.split( " " );
- each( hooks, function( _i, hook ) {
- jQuery.cssHooks[ hook ] = {
- set: function( elem, value ) {
- var parsed, curElem,
- backgroundColor = "";
-
- if ( value !== "transparent" && ( getType( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
- value = color( parsed || value );
- if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
- curElem = hook === "backgroundColor" ? elem.parentNode : elem;
- while (
- ( backgroundColor === "" || backgroundColor === "transparent" ) &&
- curElem && curElem.style
- ) {
- try {
- backgroundColor = jQuery.css( curElem, "backgroundColor" );
- curElem = curElem.parentNode;
- } catch ( e ) {
- }
- }
-
- value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
- backgroundColor :
- "_default" );
- }
-
- value = value.toRgbaString();
- }
- try {
- elem.style[ hook ] = value;
- } catch ( e ) {
-
- // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
- }
- }
- };
- jQuery.fx.step[ hook ] = function( fx ) {
- if ( !fx.colorInit ) {
- fx.start = color( fx.elem, hook );
- fx.end = color( fx.end );
- fx.colorInit = true;
- }
- jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
- };
- } );
-
-};
-
-color.hook( stepHooks );
-
-jQuery.cssHooks.borderColor = {
- expand: function( value ) {
- var expanded = {};
-
- each( [ "Top", "Right", "Bottom", "Left" ], function( _i, part ) {
- expanded[ "border" + part + "Color" ] = value;
- } );
- return expanded;
- }
-};
-
-// Basic color names only.
-// Usage of any of the other color names requires adding yourself or including
-// jquery.color.svg-names.js.
-colors = jQuery.Color.names = {
-
- // 4.1. Basic color keywords
- aqua: "#00ffff",
- black: "#000000",
- blue: "#0000ff",
- fuchsia: "#ff00ff",
- gray: "#808080",
- green: "#008000",
- lime: "#00ff00",
- maroon: "#800000",
- navy: "#000080",
- olive: "#808000",
- purple: "#800080",
- red: "#ff0000",
- silver: "#c0c0c0",
- teal: "#008080",
- white: "#ffffff",
- yellow: "#ffff00",
-
- // 4.2.3. "transparent" color keyword
- transparent: [ null, null, null, 0 ],
-
- _default: "#ffffff"
-};
-
-
-/*!
- * jQuery UI Effects 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Effects Core
-//>>group: Effects
-/* eslint-disable max-len */
-//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
-/* eslint-enable max-len */
-//>>docs: http://api.jqueryui.com/category/effects-core/
-//>>demos: http://jqueryui.com/effect/
-
-
-var dataSpace = "ui-effects-",
- dataSpaceStyle = "ui-effects-style",
- dataSpaceAnimated = "ui-effects-animated";
-
-$.effects = {
- effect: {}
-};
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-( function() {
-
-var classAnimationActions = [ "add", "remove", "toggle" ],
- shorthandStyles = {
- border: 1,
- borderBottom: 1,
- borderColor: 1,
- borderLeft: 1,
- borderRight: 1,
- borderTop: 1,
- borderWidth: 1,
- margin: 1,
- padding: 1
- };
-
-$.each(
- [ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
- function( _, prop ) {
- $.fx.step[ prop ] = function( fx ) {
- if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
- jQuery.style( fx.elem, prop, fx.end );
- fx.setAttr = true;
- }
- };
- }
-);
-
-function camelCase( string ) {
- return string.replace( /-([\da-z])/gi, function( all, letter ) {
- return letter.toUpperCase();
- } );
-}
-
-function getElementStyles( elem ) {
- var key, len,
- style = elem.ownerDocument.defaultView ?
- elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
- elem.currentStyle,
- styles = {};
-
- if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
- len = style.length;
- while ( len-- ) {
- key = style[ len ];
- if ( typeof style[ key ] === "string" ) {
- styles[ camelCase( key ) ] = style[ key ];
- }
- }
-
- // Support: Opera, IE <9
- } else {
- for ( key in style ) {
- if ( typeof style[ key ] === "string" ) {
- styles[ key ] = style[ key ];
- }
- }
- }
-
- return styles;
-}
-
-function styleDifference( oldStyle, newStyle ) {
- var diff = {},
- name, value;
-
- for ( name in newStyle ) {
- value = newStyle[ name ];
- if ( oldStyle[ name ] !== value ) {
- if ( !shorthandStyles[ name ] ) {
- if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
- diff[ name ] = value;
- }
- }
- }
- }
-
- return diff;
-}
-
-// Support: jQuery <1.8
-if ( !$.fn.addBack ) {
- $.fn.addBack = function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- };
-}
-
-$.effects.animateClass = function( value, duration, easing, callback ) {
- var o = $.speed( duration, easing, callback );
-
- return this.queue( function() {
- var animated = $( this ),
- baseClass = animated.attr( "class" ) || "",
- applyClassChange,
- allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
-
- // Map the animated objects to store the original styles.
- allAnimations = allAnimations.map( function() {
- var el = $( this );
- return {
- el: el,
- start: getElementStyles( this )
- };
- } );
-
- // Apply class change
- applyClassChange = function() {
- $.each( classAnimationActions, function( i, action ) {
- if ( value[ action ] ) {
- animated[ action + "Class" ]( value[ action ] );
- }
- } );
- };
- applyClassChange();
-
- // Map all animated objects again - calculate new styles and diff
- allAnimations = allAnimations.map( function() {
- this.end = getElementStyles( this.el[ 0 ] );
- this.diff = styleDifference( this.start, this.end );
- return this;
- } );
-
- // Apply original class
- animated.attr( "class", baseClass );
-
- // Map all animated objects again - this time collecting a promise
- allAnimations = allAnimations.map( function() {
- var styleInfo = this,
- dfd = $.Deferred(),
- opts = $.extend( {}, o, {
- queue: false,
- complete: function() {
- dfd.resolve( styleInfo );
- }
- } );
-
- this.el.animate( this.diff, opts );
- return dfd.promise();
- } );
-
- // Once all animations have completed:
- $.when.apply( $, allAnimations.get() ).done( function() {
-
- // Set the final class
- applyClassChange();
-
- // For each animated element,
- // clear all css properties that were animated
- $.each( arguments, function() {
- var el = this.el;
- $.each( this.diff, function( key ) {
- el.css( key, "" );
- } );
- } );
-
- // This is guarnteed to be there if you use jQuery.speed()
- // it also handles dequeuing the next anim...
- o.complete.call( animated[ 0 ] );
- } );
- } );
-};
-
-$.fn.extend( {
- addClass: ( function( orig ) {
- return function( classNames, speed, easing, callback ) {
- return speed ?
- $.effects.animateClass.call( this,
- { add: classNames }, speed, easing, callback ) :
- orig.apply( this, arguments );
- };
- } )( $.fn.addClass ),
-
- removeClass: ( function( orig ) {
- return function( classNames, speed, easing, callback ) {
- return arguments.length > 1 ?
- $.effects.animateClass.call( this,
- { remove: classNames }, speed, easing, callback ) :
- orig.apply( this, arguments );
- };
- } )( $.fn.removeClass ),
-
- toggleClass: ( function( orig ) {
- return function( classNames, force, speed, easing, callback ) {
- if ( typeof force === "boolean" || force === undefined ) {
- if ( !speed ) {
-
- // Without speed parameter
- return orig.apply( this, arguments );
- } else {
- return $.effects.animateClass.call( this,
- ( force ? { add: classNames } : { remove: classNames } ),
- speed, easing, callback );
- }
- } else {
-
- // Without force parameter
- return $.effects.animateClass.call( this,
- { toggle: classNames }, force, speed, easing );
- }
- };
- } )( $.fn.toggleClass ),
-
- switchClass: function( remove, add, speed, easing, callback ) {
- return $.effects.animateClass.call( this, {
- add: add,
- remove: remove
- }, speed, easing, callback );
- }
-} );
-
-} )();
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-( function() {
-
-if ( $.expr && $.expr.pseudos && $.expr.pseudos.animated ) {
- $.expr.pseudos.animated = ( function( orig ) {
- return function( elem ) {
- return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
- };
- } )( $.expr.pseudos.animated );
-}
-
-if ( $.uiBackCompat !== false ) {
- $.extend( $.effects, {
-
- // Saves a set of properties in a data storage
- save: function( element, set ) {
- var i = 0, length = set.length;
- for ( ; i < length; i++ ) {
- if ( set[ i ] !== null ) {
- element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
- }
- }
- },
-
- // Restores a set of previously saved properties from a data storage
- restore: function( element, set ) {
- var val, i = 0, length = set.length;
- for ( ; i < length; i++ ) {
- if ( set[ i ] !== null ) {
- val = element.data( dataSpace + set[ i ] );
- element.css( set[ i ], val );
- }
- }
- },
-
- setMode: function( el, mode ) {
- if ( mode === "toggle" ) {
- mode = el.is( ":hidden" ) ? "show" : "hide";
- }
- return mode;
- },
-
- // Wraps the element around a wrapper that copies position properties
- createWrapper: function( element ) {
-
- // If the element is already wrapped, return it
- if ( element.parent().is( ".ui-effects-wrapper" ) ) {
- return element.parent();
- }
-
- // Wrap the element
- var props = {
- width: element.outerWidth( true ),
- height: element.outerHeight( true ),
- "float": element.css( "float" )
- },
- wrapper = $( "<div></div>" )
- .addClass( "ui-effects-wrapper" )
- .css( {
- fontSize: "100%",
- background: "transparent",
- border: "none",
- margin: 0,
- padding: 0
- } ),
-
- // Store the size in case width/height are defined in % - Fixes #5245
- size = {
- width: element.width(),
- height: element.height()
- },
- active = document.activeElement;
-
- // Support: Firefox
- // Firefox incorrectly exposes anonymous content
- // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
- try {
- // eslint-disable-next-line no-unused-expressions
- active.id;
- } catch ( e ) {
- active = document.body;
- }
-
- element.wrap( wrapper );
-
- // Fixes #7595 - Elements lose focus when wrapped.
- if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
- $( active ).trigger( "focus" );
- }
-
- // Hotfix for jQuery 1.4 since some change in wrap() seems to actually
- // lose the reference to the wrapped element
- wrapper = element.parent();
-
- // Transfer positioning properties to the wrapper
- if ( element.css( "position" ) === "static" ) {
- wrapper.css( { position: "relative" } );
- element.css( { position: "relative" } );
- } else {
- $.extend( props, {
- position: element.css( "position" ),
- zIndex: element.css( "z-index" )
- } );
- $.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
- props[ pos ] = element.css( pos );
- if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
- props[ pos ] = "auto";
- }
- } );
- element.css( {
- position: "relative",
- top: 0,
- left: 0,
- right: "auto",
- bottom: "auto"
- } );
- }
- element.css( size );
-
- return wrapper.css( props ).show();
- },
-
- removeWrapper: function( element ) {
- var active = document.activeElement;
-
- if ( element.parent().is( ".ui-effects-wrapper" ) ) {
- element.parent().replaceWith( element );
-
- // Fixes #7595 - Elements lose focus when wrapped.
- if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
- $( active ).trigger( "focus" );
- }
- }
-
- return element;
- }
- } );
-}
-
-$.extend( $.effects, {
- version: "1.13.1",
-
- define: function( name, mode, effect ) {
- if ( !effect ) {
- effect = mode;
- mode = "effect";
- }
-
- $.effects.effect[ name ] = effect;
- $.effects.effect[ name ].mode = mode;
-
- return effect;
- },
-
- scaledDimensions: function( element, percent, direction ) {
- if ( percent === 0 ) {
- return {
- height: 0,
- width: 0,
- outerHeight: 0,
- outerWidth: 0
- };
- }
-
- var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
- y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
-
- return {
- height: element.height() * y,
- width: element.width() * x,
- outerHeight: element.outerHeight() * y,
- outerWidth: element.outerWidth() * x
- };
-
- },
-
- clipToBox: function( animation ) {
- return {
- width: animation.clip.right - animation.clip.left,
- height: animation.clip.bottom - animation.clip.top,
- left: animation.clip.left,
- top: animation.clip.top
- };
- },
-
- // Injects recently queued functions to be first in line (after "inprogress")
- unshift: function( element, queueLength, count ) {
- var queue = element.queue();
-
- if ( queueLength > 1 ) {
- queue.splice.apply( queue,
- [ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
- }
- element.dequeue();
- },
-
- saveStyle: function( element ) {
- element.data( dataSpaceStyle, element[ 0 ].style.cssText );
- },
-
- restoreStyle: function( element ) {
- element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
- element.removeData( dataSpaceStyle );
- },
-
- mode: function( element, mode ) {
- var hidden = element.is( ":hidden" );
-
- if ( mode === "toggle" ) {
- mode = hidden ? "show" : "hide";
- }
- if ( hidden ? mode === "hide" : mode === "show" ) {
- mode = "none";
- }
- return mode;
- },
-
- // Translates a [top,left] array into a baseline value
- getBaseline: function( origin, original ) {
- var y, x;
-
- switch ( origin[ 0 ] ) {
- case "top":
- y = 0;
- break;
- case "middle":
- y = 0.5;
- break;
- case "bottom":
- y = 1;
- break;
- default:
- y = origin[ 0 ] / original.height;
- }
-
- switch ( origin[ 1 ] ) {
- case "left":
- x = 0;
- break;
- case "center":
- x = 0.5;
- break;
- case "right":
- x = 1;
- break;
- default:
- x = origin[ 1 ] / original.width;
- }
-
- return {
- x: x,
- y: y
- };
- },
-
- // Creates a placeholder element so that the original element can be made absolute
- createPlaceholder: function( element ) {
- var placeholder,
- cssPosition = element.css( "position" ),
- position = element.position();
-
- // Lock in margins first to account for form elements, which
- // will change margin if you explicitly set height
- // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
- // Support: Safari
- element.css( {
- marginTop: element.css( "marginTop" ),
- marginBottom: element.css( "marginBottom" ),
- marginLeft: element.css( "marginLeft" ),
- marginRight: element.css( "marginRight" )
- } )
- .outerWidth( element.outerWidth() )
- .outerHeight( element.outerHeight() );
-
- if ( /^(static|relative)/.test( cssPosition ) ) {
- cssPosition = "absolute";
-
- placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
-
- // Convert inline to inline block to account for inline elements
- // that turn to inline block based on content (like img)
- display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
- "inline-block" :
- "block",
- visibility: "hidden",
-
- // Margins need to be set to account for margin collapse
- marginTop: element.css( "marginTop" ),
- marginBottom: element.css( "marginBottom" ),
- marginLeft: element.css( "marginLeft" ),
- marginRight: element.css( "marginRight" ),
- "float": element.css( "float" )
- } )
- .outerWidth( element.outerWidth() )
- .outerHeight( element.outerHeight() )
- .addClass( "ui-effects-placeholder" );
-
- element.data( dataSpace + "placeholder", placeholder );
- }
-
- element.css( {
- position: cssPosition,
- left: position.left,
- top: position.top
- } );
-
- return placeholder;
- },
-
- removePlaceholder: function( element ) {
- var dataKey = dataSpace + "placeholder",
- placeholder = element.data( dataKey );
-
- if ( placeholder ) {
- placeholder.remove();
- element.removeData( dataKey );
- }
- },
-
- // Removes a placeholder if it exists and restores
- // properties that were modified during placeholder creation
- cleanUp: function( element ) {
- $.effects.restoreStyle( element );
- $.effects.removePlaceholder( element );
- },
-
- setTransition: function( element, list, factor, value ) {
- value = value || {};
- $.each( list, function( i, x ) {
- var unit = element.cssUnit( x );
- if ( unit[ 0 ] > 0 ) {
- value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
- }
- } );
- return value;
- }
-} );
-
-// Return an effect options object for the given parameters:
-function _normalizeArguments( effect, options, speed, callback ) {
-
- // Allow passing all options as the first parameter
- if ( $.isPlainObject( effect ) ) {
- options = effect;
- effect = effect.effect;
- }
-
- // Convert to an object
- effect = { effect: effect };
-
- // Catch (effect, null, ...)
- if ( options == null ) {
- options = {};
- }
-
- // Catch (effect, callback)
- if ( typeof options === "function" ) {
- callback = options;
- speed = null;
- options = {};
- }
-
- // Catch (effect, speed, ?)
- if ( typeof options === "number" || $.fx.speeds[ options ] ) {
- callback = speed;
- speed = options;
- options = {};
- }
-
- // Catch (effect, options, callback)
- if ( typeof speed === "function" ) {
- callback = speed;
- speed = null;
- }
-
- // Add options to effect
- if ( options ) {
- $.extend( effect, options );
- }
-
- speed = speed || options.duration;
- effect.duration = $.fx.off ? 0 :
- typeof speed === "number" ? speed :
- speed in $.fx.speeds ? $.fx.speeds[ speed ] :
- $.fx.speeds._default;
-
- effect.complete = callback || options.complete;
-
- return effect;
-}
-
-function standardAnimationOption( option ) {
-
- // Valid standard speeds (nothing, number, named speed)
- if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
- return true;
- }
-
- // Invalid strings - treat as "normal" speed
- if ( typeof option === "string" && !$.effects.effect[ option ] ) {
- return true;
- }
-
- // Complete callback
- if ( typeof option === "function" ) {
- return true;
- }
-
- // Options hash (but not naming an effect)
- if ( typeof option === "object" && !option.effect ) {
- return true;
- }
-
- // Didn't match any standard API
- return false;
-}
-
-$.fn.extend( {
- effect: function( /* effect, options, speed, callback */ ) {
- var args = _normalizeArguments.apply( this, arguments ),
- effectMethod = $.effects.effect[ args.effect ],
- defaultMode = effectMethod.mode,
- queue = args.queue,
- queueName = queue || "fx",
- complete = args.complete,
- mode = args.mode,
- modes = [],
- prefilter = function( next ) {
- var el = $( this ),
- normalizedMode = $.effects.mode( el, mode ) || defaultMode;
-
- // Sentinel for duck-punching the :animated pseudo-selector
- el.data( dataSpaceAnimated, true );
-
- // Save effect mode for later use,
- // we can't just call $.effects.mode again later,
- // as the .show() below destroys the initial state
- modes.push( normalizedMode );
-
- // See $.uiBackCompat inside of run() for removal of defaultMode in 1.14
- if ( defaultMode && ( normalizedMode === "show" ||
- ( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
- el.show();
- }
-
- if ( !defaultMode || normalizedMode !== "none" ) {
- $.effects.saveStyle( el );
- }
-
- if ( typeof next === "function" ) {
- next();
- }
- };
-
- if ( $.fx.off || !effectMethod ) {
-
- // Delegate to the original method (e.g., .show()) if possible
- if ( mode ) {
- return this[ mode ]( args.duration, complete );
- } else {
- return this.each( function() {
- if ( complete ) {
- complete.call( this );
- }
- } );
- }
- }
-
- function run( next ) {
- var elem = $( this );
-
- function cleanup() {
- elem.removeData( dataSpaceAnimated );
-
- $.effects.cleanUp( elem );
-
- if ( args.mode === "hide" ) {
- elem.hide();
- }
-
- done();
- }
-
- function done() {
- if ( typeof complete === "function" ) {
- complete.call( elem[ 0 ] );
- }
-
- if ( typeof next === "function" ) {
- next();
- }
- }
-
- // Override mode option on a per element basis,
- // as toggle can be either show or hide depending on element state
- args.mode = modes.shift();
-
- if ( $.uiBackCompat !== false && !defaultMode ) {
- if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-
- // Call the core method to track "olddisplay" properly
- elem[ mode ]();
- done();
- } else {
- effectMethod.call( elem[ 0 ], args, done );
- }
- } else {
- if ( args.mode === "none" ) {
-
- // Call the core method to track "olddisplay" properly
- elem[ mode ]();
- done();
- } else {
- effectMethod.call( elem[ 0 ], args, cleanup );
- }
- }
- }
-
- // Run prefilter on all elements first to ensure that
- // any showing or hiding happens before placeholder creation,
- // which ensures that any layout changes are correctly captured.
- return queue === false ?
- this.each( prefilter ).each( run ) :
- this.queue( queueName, prefilter ).queue( queueName, run );
- },
-
- show: ( function( orig ) {
- return function( option ) {
- if ( standardAnimationOption( option ) ) {
- return orig.apply( this, arguments );
- } else {
- var args = _normalizeArguments.apply( this, arguments );
- args.mode = "show";
- return this.effect.call( this, args );
- }
- };
- } )( $.fn.show ),
-
- hide: ( function( orig ) {
- return function( option ) {
- if ( standardAnimationOption( option ) ) {
- return orig.apply( this, arguments );
- } else {
- var args = _normalizeArguments.apply( this, arguments );
- args.mode = "hide";
- return this.effect.call( this, args );
- }
- };
- } )( $.fn.hide ),
-
- toggle: ( function( orig ) {
- return function( option ) {
- if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
- return orig.apply( this, arguments );
- } else {
- var args = _normalizeArguments.apply( this, arguments );
- args.mode = "toggle";
- return this.effect.call( this, args );
- }
- };
- } )( $.fn.toggle ),
-
- cssUnit: function( key ) {
- var style = this.css( key ),
- val = [];
-
- $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
- if ( style.indexOf( unit ) > 0 ) {
- val = [ parseFloat( style ), unit ];
- }
- } );
- return val;
- },
-
- cssClip: function( clipObj ) {
- if ( clipObj ) {
- return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
- clipObj.bottom + "px " + clipObj.left + "px)" );
- }
- return parseClip( this.css( "clip" ), this );
- },
-
- transfer: function( options, done ) {
- var element = $( this ),
- target = $( options.to ),
- targetFixed = target.css( "position" ) === "fixed",
- body = $( "body" ),
- fixTop = targetFixed ? body.scrollTop() : 0,
- fixLeft = targetFixed ? body.scrollLeft() : 0,
- endPosition = target.offset(),
- animation = {
- top: endPosition.top - fixTop,
- left: endPosition.left - fixLeft,
- height: target.innerHeight(),
- width: target.innerWidth()
- },
- startPosition = element.offset(),
- transfer = $( "<div class='ui-effects-transfer'></div>" );
-
- transfer
- .appendTo( "body" )
- .addClass( options.className )
- .css( {
- top: startPosition.top - fixTop,
- left: startPosition.left - fixLeft,
- height: element.innerHeight(),
- width: element.innerWidth(),
- position: targetFixed ? "fixed" : "absolute"
- } )
- .animate( animation, options.duration, options.easing, function() {
- transfer.remove();
- if ( typeof done === "function" ) {
- done();
- }
- } );
- }
-} );
-
-function parseClip( str, element ) {
- var outerWidth = element.outerWidth(),
- outerHeight = element.outerHeight(),
- clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
- values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
-
- return {
- top: parseFloat( values[ 1 ] ) || 0,
- right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
- bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
- left: parseFloat( values[ 4 ] ) || 0
- };
-}
-
-$.fx.step.clip = function( fx ) {
- if ( !fx.clipInit ) {
- fx.start = $( fx.elem ).cssClip();
- if ( typeof fx.end === "string" ) {
- fx.end = parseClip( fx.end, fx.elem );
- }
- fx.clipInit = true;
- }
-
- $( fx.elem ).cssClip( {
- top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
- right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
- bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
- left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
- } );
-};
-
-} )();
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-( function() {
-
-// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
- baseEasings[ name ] = function( p ) {
- return Math.pow( p, i + 2 );
- };
-} );
-
-$.extend( baseEasings, {
- Sine: function( p ) {
- return 1 - Math.cos( p * Math.PI / 2 );
- },
- Circ: function( p ) {
- return 1 - Math.sqrt( 1 - p * p );
- },
- Elastic: function( p ) {
- return p === 0 || p === 1 ? p :
- -Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
- },
- Back: function( p ) {
- return p * p * ( 3 * p - 2 );
- },
- Bounce: function( p ) {
- var pow2,
- bounce = 4;
-
- while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
- return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
- }
-} );
-
-$.each( baseEasings, function( name, easeIn ) {
- $.easing[ "easeIn" + name ] = easeIn;
- $.easing[ "easeOut" + name ] = function( p ) {
- return 1 - easeIn( 1 - p );
- };
- $.easing[ "easeInOut" + name ] = function( p ) {
- return p < 0.5 ?
- easeIn( p * 2 ) / 2 :
- 1 - easeIn( p * -2 + 2 ) / 2;
- };
-} );
-
-} )();
-
-var effect = $.effects;
-
-
-/*!
- * jQuery UI Effects Blind 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Blind Effect
-//>>group: Effects
-//>>description: Blinds the element.
-//>>docs: http://api.jqueryui.com/blind-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
- var map = {
- up: [ "bottom", "top" ],
- vertical: [ "bottom", "top" ],
- down: [ "top", "bottom" ],
- left: [ "right", "left" ],
- horizontal: [ "right", "left" ],
- right: [ "left", "right" ]
- },
- element = $( this ),
- direction = options.direction || "up",
- start = element.cssClip(),
- animate = { clip: $.extend( {}, start ) },
- placeholder = $.effects.createPlaceholder( element );
-
- animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
-
- if ( options.mode === "show" ) {
- element.cssClip( animate.clip );
- if ( placeholder ) {
- placeholder.css( $.effects.clipToBox( animate ) );
- }
-
- animate.clip = start;
- }
-
- if ( placeholder ) {
- placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
- }
-
- element.animate( animate, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Bounce 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Bounce Effect
-//>>group: Effects
-//>>description: Bounces an element horizontally or vertically n times.
-//>>docs: http://api.jqueryui.com/bounce-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
- var upAnim, downAnim, refValue,
- element = $( this ),
-
- // Defaults:
- mode = options.mode,
- hide = mode === "hide",
- show = mode === "show",
- direction = options.direction || "up",
- distance = options.distance,
- times = options.times || 5,
-
- // Number of internal animations
- anims = times * 2 + ( show || hide ? 1 : 0 ),
- speed = options.duration / anims,
- easing = options.easing,
-
- // Utility:
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- motion = ( direction === "up" || direction === "left" ),
- i = 0,
-
- queuelen = element.queue().length;
-
- $.effects.createPlaceholder( element );
-
- refValue = element.css( ref );
-
- // Default distance for the BIGGEST bounce is the outer Distance / 3
- if ( !distance ) {
- distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
- }
-
- if ( show ) {
- downAnim = { opacity: 1 };
- downAnim[ ref ] = refValue;
-
- // If we are showing, force opacity 0 and set the initial position
- // then do the "first" animation
- element
- .css( "opacity", 0 )
- .css( ref, motion ? -distance * 2 : distance * 2 )
- .animate( downAnim, speed, easing );
- }
-
- // Start at the smallest distance if we are hiding
- if ( hide ) {
- distance = distance / Math.pow( 2, times - 1 );
- }
-
- downAnim = {};
- downAnim[ ref ] = refValue;
-
- // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
- for ( ; i < times; i++ ) {
- upAnim = {};
- upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
- element
- .animate( upAnim, speed, easing )
- .animate( downAnim, speed, easing );
-
- distance = hide ? distance * 2 : distance / 2;
- }
-
- // Last Bounce when Hiding
- if ( hide ) {
- upAnim = { opacity: 0 };
- upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
- element.animate( upAnim, speed, easing );
- }
-
- element.queue( done );
-
- $.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Clip 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Clip Effect
-//>>group: Effects
-//>>description: Clips the element on and off like an old TV.
-//>>docs: http://api.jqueryui.com/clip-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
- var start,
- animate = {},
- element = $( this ),
- direction = options.direction || "vertical",
- both = direction === "both",
- horizontal = both || direction === "horizontal",
- vertical = both || direction === "vertical";
-
- start = element.cssClip();
- animate.clip = {
- top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
- right: horizontal ? ( start.right - start.left ) / 2 : start.right,
- bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
- left: horizontal ? ( start.right - start.left ) / 2 : start.left
- };
-
- $.effects.createPlaceholder( element );
-
- if ( options.mode === "show" ) {
- element.cssClip( animate.clip );
- animate.clip = start;
- }
-
- element.animate( animate, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-
-} );
-
-
-/*!
- * jQuery UI Effects Drop 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Drop Effect
-//>>group: Effects
-//>>description: Moves an element in one direction and hides it at the same time.
-//>>docs: http://api.jqueryui.com/drop-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
-
- var distance,
- element = $( this ),
- mode = options.mode,
- show = mode === "show",
- direction = options.direction || "left",
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
- oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
- animation = {
- opacity: 0
- };
-
- $.effects.createPlaceholder( element );
-
- distance = options.distance ||
- element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
-
- animation[ ref ] = motion + distance;
-
- if ( show ) {
- element.css( animation );
-
- animation[ ref ] = oppositeMotion + distance;
- animation.opacity = 1;
- }
-
- // Animate
- element.animate( animation, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Explode 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Explode Effect
-//>>group: Effects
-/* eslint-disable max-len */
-//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
-/* eslint-enable max-len */
-//>>docs: http://api.jqueryui.com/explode-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
-
- var i, j, left, top, mx, my,
- rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
- cells = rows,
- element = $( this ),
- mode = options.mode,
- show = mode === "show",
-
- // Show and then visibility:hidden the element before calculating offset
- offset = element.show().css( "visibility", "hidden" ).offset(),
-
- // Width and height of a piece
- width = Math.ceil( element.outerWidth() / cells ),
- height = Math.ceil( element.outerHeight() / rows ),
- pieces = [];
-
- // Children animate complete:
- function childComplete() {
- pieces.push( this );
- if ( pieces.length === rows * cells ) {
- animComplete();
- }
- }
-
- // Clone the element for each row and cell.
- for ( i = 0; i < rows; i++ ) { // ===>
- top = offset.top + i * height;
- my = i - ( rows - 1 ) / 2;
-
- for ( j = 0; j < cells; j++ ) { // |||
- left = offset.left + j * width;
- mx = j - ( cells - 1 ) / 2;
-
- // Create a clone of the now hidden main element that will be absolute positioned
- // within a wrapper div off the -left and -top equal to size of our pieces
- element
- .clone()
- .appendTo( "body" )
- .wrap( "<div></div>" )
- .css( {
- position: "absolute",
- visibility: "visible",
- left: -j * width,
- top: -i * height
- } )
-
- // Select the wrapper - make it overflow: hidden and absolute positioned based on
- // where the original was located +left and +top equal to the size of pieces
- .parent()
- .addClass( "ui-effects-explode" )
- .css( {
- position: "absolute",
- overflow: "hidden",
- width: width,
- height: height,
- left: left + ( show ? mx * width : 0 ),
- top: top + ( show ? my * height : 0 ),
- opacity: show ? 0 : 1
- } )
- .animate( {
- left: left + ( show ? 0 : mx * width ),
- top: top + ( show ? 0 : my * height ),
- opacity: show ? 1 : 0
- }, options.duration || 500, options.easing, childComplete );
- }
- }
-
- function animComplete() {
- element.css( {
- visibility: "visible"
- } );
- $( pieces ).remove();
- done();
- }
-} );
-
-
-/*!
- * jQuery UI Effects Fade 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Fade Effect
-//>>group: Effects
-//>>description: Fades the element.
-//>>docs: http://api.jqueryui.com/fade-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
- var show = options.mode === "show";
-
- $( this )
- .css( "opacity", show ? 0 : 1 )
- .animate( {
- opacity: show ? 1 : 0
- }, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Fold 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Fold Effect
-//>>group: Effects
-//>>description: Folds an element first horizontally and then vertically.
-//>>docs: http://api.jqueryui.com/fold-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
-
- // Create element
- var element = $( this ),
- mode = options.mode,
- show = mode === "show",
- hide = mode === "hide",
- size = options.size || 15,
- percent = /([0-9]+)%/.exec( size ),
- horizFirst = !!options.horizFirst,
- ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
- duration = options.duration / 2,
-
- placeholder = $.effects.createPlaceholder( element ),
-
- start = element.cssClip(),
- animation1 = { clip: $.extend( {}, start ) },
- animation2 = { clip: $.extend( {}, start ) },
-
- distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
-
- queuelen = element.queue().length;
-
- if ( percent ) {
- size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
- }
- animation1.clip[ ref[ 0 ] ] = size;
- animation2.clip[ ref[ 0 ] ] = size;
- animation2.clip[ ref[ 1 ] ] = 0;
-
- if ( show ) {
- element.cssClip( animation2.clip );
- if ( placeholder ) {
- placeholder.css( $.effects.clipToBox( animation2 ) );
- }
-
- animation2.clip = start;
- }
-
- // Animate
- element
- .queue( function( next ) {
- if ( placeholder ) {
- placeholder
- .animate( $.effects.clipToBox( animation1 ), duration, options.easing )
- .animate( $.effects.clipToBox( animation2 ), duration, options.easing );
- }
-
- next();
- } )
- .animate( animation1, duration, options.easing )
- .animate( animation2, duration, options.easing )
- .queue( done );
-
- $.effects.unshift( element, queuelen, 4 );
-} );
-
-
-/*!
- * jQuery UI Effects Highlight 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Highlight Effect
-//>>group: Effects
-//>>description: Highlights the background of an element in a defined color for a custom duration.
-//>>docs: http://api.jqueryui.com/highlight-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
- var element = $( this ),
- animation = {
- backgroundColor: element.css( "backgroundColor" )
- };
-
- if ( options.mode === "hide" ) {
- animation.opacity = 0;
- }
-
- $.effects.saveStyle( element );
-
- element
- .css( {
- backgroundImage: "none",
- backgroundColor: options.color || "#ffff99"
- } )
- .animate( animation, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Size 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Size Effect
-//>>group: Effects
-//>>description: Resize an element to a specified width and height.
-//>>docs: http://api.jqueryui.com/size-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectSize = $.effects.define( "size", function( options, done ) {
-
- // Create element
- var baseline, factor, temp,
- element = $( this ),
-
- // Copy for children
- cProps = [ "fontSize" ],
- vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
- hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
-
- // Set options
- mode = options.mode,
- restore = mode !== "effect",
- scale = options.scale || "both",
- origin = options.origin || [ "middle", "center" ],
- position = element.css( "position" ),
- pos = element.position(),
- original = $.effects.scaledDimensions( element ),
- from = options.from || original,
- to = options.to || $.effects.scaledDimensions( element, 0 );
-
- $.effects.createPlaceholder( element );
-
- if ( mode === "show" ) {
- temp = from;
- from = to;
- to = temp;
- }
-
- // Set scaling factor
- factor = {
- from: {
- y: from.height / original.height,
- x: from.width / original.width
- },
- to: {
- y: to.height / original.height,
- x: to.width / original.width
- }
- };
-
- // Scale the css box
- if ( scale === "box" || scale === "both" ) {
-
- // Vertical props scaling
- if ( factor.from.y !== factor.to.y ) {
- from = $.effects.setTransition( element, vProps, factor.from.y, from );
- to = $.effects.setTransition( element, vProps, factor.to.y, to );
- }
-
- // Horizontal props scaling
- if ( factor.from.x !== factor.to.x ) {
- from = $.effects.setTransition( element, hProps, factor.from.x, from );
- to = $.effects.setTransition( element, hProps, factor.to.x, to );
- }
- }
-
- // Scale the content
- if ( scale === "content" || scale === "both" ) {
-
- // Vertical props scaling
- if ( factor.from.y !== factor.to.y ) {
- from = $.effects.setTransition( element, cProps, factor.from.y, from );
- to = $.effects.setTransition( element, cProps, factor.to.y, to );
- }
- }
-
- // Adjust the position properties based on the provided origin points
- if ( origin ) {
- baseline = $.effects.getBaseline( origin, original );
- from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
- from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
- to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
- to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
- }
- delete from.outerHeight;
- delete from.outerWidth;
- element.css( from );
-
- // Animate the children if desired
- if ( scale === "content" || scale === "both" ) {
-
- vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
- hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
-
- // Only animate children with width attributes specified
- // TODO: is this right? should we include anything with css width specified as well
- element.find( "*[width]" ).each( function() {
- var child = $( this ),
- childOriginal = $.effects.scaledDimensions( child ),
- childFrom = {
- height: childOriginal.height * factor.from.y,
- width: childOriginal.width * factor.from.x,
- outerHeight: childOriginal.outerHeight * factor.from.y,
- outerWidth: childOriginal.outerWidth * factor.from.x
- },
- childTo = {
- height: childOriginal.height * factor.to.y,
- width: childOriginal.width * factor.to.x,
- outerHeight: childOriginal.height * factor.to.y,
- outerWidth: childOriginal.width * factor.to.x
- };
-
- // Vertical props scaling
- if ( factor.from.y !== factor.to.y ) {
- childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
- childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
- }
-
- // Horizontal props scaling
- if ( factor.from.x !== factor.to.x ) {
- childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
- childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
- }
-
- if ( restore ) {
- $.effects.saveStyle( child );
- }
-
- // Animate children
- child.css( childFrom );
- child.animate( childTo, options.duration, options.easing, function() {
-
- // Restore children
- if ( restore ) {
- $.effects.restoreStyle( child );
- }
- } );
- } );
- }
-
- // Animate
- element.animate( to, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: function() {
-
- var offset = element.offset();
-
- if ( to.opacity === 0 ) {
- element.css( "opacity", from.opacity );
- }
-
- if ( !restore ) {
- element
- .css( "position", position === "static" ? "relative" : position )
- .offset( offset );
-
- // Need to save style here so that automatic style restoration
- // doesn't restore to the original styles from before the animation.
- $.effects.saveStyle( element );
- }
-
- done();
- }
- } );
-
-} );
-
-
-/*!
- * jQuery UI Effects Scale 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Scale Effect
-//>>group: Effects
-//>>description: Grows or shrinks an element and its content.
-//>>docs: http://api.jqueryui.com/scale-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
-
- // Create element
- var el = $( this ),
- mode = options.mode,
- percent = parseInt( options.percent, 10 ) ||
- ( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
-
- newOptions = $.extend( true, {
- from: $.effects.scaledDimensions( el ),
- to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
- origin: options.origin || [ "middle", "center" ]
- }, options );
-
- // Fade option to support puff
- if ( options.fade ) {
- newOptions.from.opacity = 1;
- newOptions.to.opacity = 0;
- }
-
- $.effects.effect.size.call( this, newOptions, done );
-} );
-
-
-/*!
- * jQuery UI Effects Puff 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Puff Effect
-//>>group: Effects
-//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
-//>>docs: http://api.jqueryui.com/puff-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
- var newOptions = $.extend( true, {}, options, {
- fade: true,
- percent: parseInt( options.percent, 10 ) || 150
- } );
-
- $.effects.effect.scale.call( this, newOptions, done );
-} );
-
-
-/*!
- * jQuery UI Effects Pulsate 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Pulsate Effect
-//>>group: Effects
-//>>description: Pulsates an element n times by changing the opacity to zero and back.
-//>>docs: http://api.jqueryui.com/pulsate-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
- var element = $( this ),
- mode = options.mode,
- show = mode === "show",
- hide = mode === "hide",
- showhide = show || hide,
-
- // Showing or hiding leaves off the "last" animation
- anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
- duration = options.duration / anims,
- animateTo = 0,
- i = 1,
- queuelen = element.queue().length;
-
- if ( show || !element.is( ":visible" ) ) {
- element.css( "opacity", 0 ).show();
- animateTo = 1;
- }
-
- // Anims - 1 opacity "toggles"
- for ( ; i < anims; i++ ) {
- element.animate( { opacity: animateTo }, duration, options.easing );
- animateTo = 1 - animateTo;
- }
-
- element.animate( { opacity: animateTo }, duration, options.easing );
-
- element.queue( done );
-
- $.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Shake 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Shake Effect
-//>>group: Effects
-//>>description: Shakes an element horizontally or vertically n times.
-//>>docs: http://api.jqueryui.com/shake-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
-
- var i = 1,
- element = $( this ),
- direction = options.direction || "left",
- distance = options.distance || 20,
- times = options.times || 3,
- anims = times * 2 + 1,
- speed = Math.round( options.duration / anims ),
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- positiveMotion = ( direction === "up" || direction === "left" ),
- animation = {},
- animation1 = {},
- animation2 = {},
-
- queuelen = element.queue().length;
-
- $.effects.createPlaceholder( element );
-
- // Animation
- animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
- animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
- animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
-
- // Animate
- element.animate( animation, speed, options.easing );
-
- // Shakes
- for ( ; i < times; i++ ) {
- element
- .animate( animation1, speed, options.easing )
- .animate( animation2, speed, options.easing );
- }
-
- element
- .animate( animation1, speed, options.easing )
- .animate( animation, speed / 2, options.easing )
- .queue( done );
-
- $.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Slide 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Slide Effect
-//>>group: Effects
-//>>description: Slides an element in and out of the viewport.
-//>>docs: http://api.jqueryui.com/slide-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
- var startClip, startRef,
- element = $( this ),
- map = {
- up: [ "bottom", "top" ],
- down: [ "top", "bottom" ],
- left: [ "right", "left" ],
- right: [ "left", "right" ]
- },
- mode = options.mode,
- direction = options.direction || "left",
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- positiveMotion = ( direction === "up" || direction === "left" ),
- distance = options.distance ||
- element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
- animation = {};
-
- $.effects.createPlaceholder( element );
-
- startClip = element.cssClip();
- startRef = element.position()[ ref ];
-
- // Define hide animation
- animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
- animation.clip = element.cssClip();
- animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
-
- // Reverse the animation if we're showing
- if ( mode === "show" ) {
- element.cssClip( animation.clip );
- element.css( ref, animation[ ref ] );
- animation.clip = startClip;
- animation[ ref ] = startRef;
- }
-
- // Actually animate
- element.animate( animation, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Transfer 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Transfer Effect
-//>>group: Effects
-//>>description: Displays a transfer effect from one element to another.
-//>>docs: http://api.jqueryui.com/transfer-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-var effect;
-if ( $.uiBackCompat !== false ) {
- effect = $.effects.define( "transfer", function( options, done ) {
- $( this ).transfer( options, done );
- } );
-}
-var effectsEffectTransfer = effect;
-
-
-/*!
- * jQuery UI Focusable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :focusable Selector
-//>>group: Core
-//>>description: Selects elements which can be focused.
-//>>docs: http://api.jqueryui.com/focusable-selector/
-
-
-// Selectors
-$.ui.focusable = function( element, hasTabindex ) {
- var map, mapName, img, focusableIfVisible, fieldset,
- nodeName = element.nodeName.toLowerCase();
-
- if ( "area" === nodeName ) {
- map = element.parentNode;
- mapName = map.name;
- if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
- return false;
- }
- img = $( "img[usemap='#" + mapName + "']" );
- return img.length > 0 && img.is( ":visible" );
- }
-
- if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
- focusableIfVisible = !element.disabled;
-
- if ( focusableIfVisible ) {
-
- // Form controls within a disabled fieldset are disabled.
- // However, controls within the fieldset's legend do not get disabled.
- // Since controls generally aren't placed inside legends, we skip
- // this portion of the check.
- fieldset = $( element ).closest( "fieldset" )[ 0 ];
- if ( fieldset ) {
- focusableIfVisible = !fieldset.disabled;
- }
- }
- } else if ( "a" === nodeName ) {
- focusableIfVisible = element.href || hasTabindex;
- } else {
- focusableIfVisible = hasTabindex;
- }
-
- return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
-};
-
-// Support: IE 8 only
-// IE 8 doesn't resolve inherit to visible/hidden for computed values
-function visible( element ) {
- var visibility = element.css( "visibility" );
- while ( visibility === "inherit" ) {
- element = element.parent();
- visibility = element.css( "visibility" );
- }
- return visibility === "visible";
-}
-
-$.extend( $.expr.pseudos, {
- focusable: function( element ) {
- return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
- }
-} );
-
-var focusable = $.ui.focusable;
-
-
-
-// Support: IE8 Only
-// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
-// with a string, so we need to find the proper form.
-var form = $.fn._form = function() {
- return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
-};
-
-
-/*!
- * jQuery UI Form Reset Mixin 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Form Reset Mixin
-//>>group: Core
-//>>description: Refresh input widgets when their form is reset
-//>>docs: http://api.jqueryui.com/form-reset-mixin/
-
-
-var formResetMixin = $.ui.formResetMixin = {
- _formResetHandler: function() {
- var form = $( this );
-
- // Wait for the form reset to actually happen before refreshing
- setTimeout( function() {
- var instances = form.data( "ui-form-reset-instances" );
- $.each( instances, function() {
- this.refresh();
- } );
- } );
- },
-
- _bindFormResetHandler: function() {
- this.form = this.element._form();
- if ( !this.form.length ) {
- return;
- }
-
- var instances = this.form.data( "ui-form-reset-instances" ) || [];
- if ( !instances.length ) {
-
- // We don't use _on() here because we use a single event handler per form
- this.form.on( "reset.ui-form-reset", this._formResetHandler );
- }
- instances.push( this );
- this.form.data( "ui-form-reset-instances", instances );
- },
-
- _unbindFormResetHandler: function() {
- if ( !this.form.length ) {
- return;
- }
-
- var instances = this.form.data( "ui-form-reset-instances" );
- instances.splice( $.inArray( this, instances ), 1 );
- if ( instances.length ) {
- this.form.data( "ui-form-reset-instances", instances );
- } else {
- this.form
- .removeData( "ui-form-reset-instances" )
- .off( "reset.ui-form-reset" );
- }
- }
-};
-
-
-/*!
- * jQuery UI Support for jQuery core 1.8.x and newer 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- */
-
-//>>label: jQuery 1.8+ Support
-//>>group: Core
-//>>description: Support version 1.8.x and newer of jQuery core
-
-
-// Support: jQuery 1.9.x or older
-// $.expr[ ":" ] is deprecated.
-if ( !$.expr.pseudos ) {
- $.expr.pseudos = $.expr[ ":" ];
-}
-
-// Support: jQuery 1.11.x or older
-// $.unique has been renamed to $.uniqueSort
-if ( !$.uniqueSort ) {
- $.uniqueSort = $.unique;
-}
-
-// Support: jQuery 2.2.x or older.
-// This method has been defined in jQuery 3.0.0.
-// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js
-if ( !$.escapeSelector ) {
-
- // CSS string/identifier serialization
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
- var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
-
- var fcssescape = function( ch, asCodePoint ) {
- if ( asCodePoint ) {
-
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
- if ( ch === "\0" ) {
- return "\uFFFD";
- }
-
- // Control characters and (dependent upon position) numbers get escaped as code points
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
- }
-
- // Other potentially-special ASCII characters get backslash-escaped
- return "\\" + ch;
- };
-
- $.escapeSelector = function( sel ) {
- return ( sel + "" ).replace( rcssescape, fcssescape );
- };
-}
-
-// Support: jQuery 3.4.x or older
-// These methods have been defined in jQuery 3.5.0.
-if ( !$.fn.even || !$.fn.odd ) {
- $.fn.extend( {
- even: function() {
- return this.filter( function( i ) {
- return i % 2 === 0;
- } );
- },
- odd: function() {
- return this.filter( function( i ) {
- return i % 2 === 1;
- } );
- }
- } );
-}
-
-;
-/*!
- * jQuery UI Keycode 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Keycode
-//>>group: Core
-//>>description: Provide keycodes as keynames
-//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
-
-
-var keycode = $.ui.keyCode = {
- BACKSPACE: 8,
- COMMA: 188,
- DELETE: 46,
- DOWN: 40,
- END: 35,
- ENTER: 13,
- ESCAPE: 27,
- HOME: 36,
- LEFT: 37,
- PAGE_DOWN: 34,
- PAGE_UP: 33,
- PERIOD: 190,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38
-};
-
-
-/*!
- * jQuery UI Labels 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: labels
-//>>group: Core
-//>>description: Find all the labels associated with a given input
-//>>docs: http://api.jqueryui.com/labels/
-
-
-var labels = $.fn.labels = function() {
- var ancestor, selector, id, labels, ancestors;
-
- if ( !this.length ) {
- return this.pushStack( [] );
- }
-
- // Check control.labels first
- if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
- return this.pushStack( this[ 0 ].labels );
- }
-
- // Support: IE <= 11, FF <= 37, Android <= 2.3 only
- // Above browsers do not support control.labels. Everything below is to support them
- // as well as document fragments. control.labels does not work on document fragments
- labels = this.eq( 0 ).parents( "label" );
-
- // Look for the label based on the id
- id = this.attr( "id" );
- if ( id ) {
-
- // We don't search against the document in case the element
- // is disconnected from the DOM
- ancestor = this.eq( 0 ).parents().last();
-
- // Get a full set of top level ancestors
- ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
-
- // Create a selector for the label based on the id
- selector = "label[for='" + $.escapeSelector( id ) + "']";
-
- labels = labels.add( ancestors.find( selector ).addBack( selector ) );
-
- }
-
- // Return whatever we have found for labels
- return this.pushStack( labels );
-};
-
-
-/*!
- * jQuery UI Scroll Parent 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: scrollParent
-//>>group: Core
-//>>description: Get the closest ancestor element that is scrollable.
-//>>docs: http://api.jqueryui.com/scrollParent/
-
-
-var scrollParent = $.fn.scrollParent = function( includeHidden ) {
- var position = this.css( "position" ),
- excludeStaticParent = position === "absolute",
- overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
- scrollParent = this.parents().filter( function() {
- var parent = $( this );
- if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
- return false;
- }
- return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
- parent.css( "overflow-x" ) );
- } ).eq( 0 );
-
- return position === "fixed" || !scrollParent.length ?
- $( this[ 0 ].ownerDocument || document ) :
- scrollParent;
-};
-
-
-/*!
- * jQuery UI Tabbable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :tabbable Selector
-//>>group: Core
-//>>description: Selects elements which can be tabbed to.
-//>>docs: http://api.jqueryui.com/tabbable-selector/
-
-
-var tabbable = $.extend( $.expr.pseudos, {
- tabbable: function( element ) {
- var tabIndex = $.attr( element, "tabindex" ),
- hasTabindex = tabIndex != null;
- return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
- }
-} );
-
-
-/*!
- * jQuery UI Unique ID 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: uniqueId
-//>>group: Core
-//>>description: Functions to generate and remove uniqueId's
-//>>docs: http://api.jqueryui.com/uniqueId/
-
-
-var uniqueId = $.fn.extend( {
- uniqueId: ( function() {
- var uuid = 0;
-
- return function() {
- return this.each( function() {
- if ( !this.id ) {
- this.id = "ui-id-" + ( ++uuid );
- }
- } );
- };
- } )(),
-
- removeUniqueId: function() {
- return this.each( function() {
- if ( /^ui-id-\d+$/.test( this.id ) ) {
- $( this ).removeAttr( "id" );
- }
- } );
- }
-} );
-
-
-/*!
- * jQuery UI Accordion 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Accordion
-//>>group: Widgets
-/* eslint-disable max-len */
-//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
-/* eslint-enable max-len */
-//>>docs: http://api.jqueryui.com/accordion/
-//>>demos: http://jqueryui.com/accordion/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/accordion.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var widgetsAccordion = $.widget( "ui.accordion", {
- version: "1.13.1",
- options: {
- active: 0,
- animate: {},
- classes: {
- "ui-accordion-header": "ui-corner-top",
- "ui-accordion-header-collapsed": "ui-corner-all",
- "ui-accordion-content": "ui-corner-bottom"
- },
- collapsible: false,
- event: "click",
- header: function( elem ) {
- return elem.find( "> li > :first-child" ).add( elem.find( "> :not(li)" ).even() );
- },
- heightStyle: "auto",
- icons: {
- activeHeader: "ui-icon-triangle-1-s",
- header: "ui-icon-triangle-1-e"
- },
-
- // Callbacks
- activate: null,
- beforeActivate: null
- },
-
- hideProps: {
- borderTopWidth: "hide",
- borderBottomWidth: "hide",
- paddingTop: "hide",
- paddingBottom: "hide",
- height: "hide"
- },
-
- showProps: {
- borderTopWidth: "show",
- borderBottomWidth: "show",
- paddingTop: "show",
- paddingBottom: "show",
- height: "show"
- },
-
- _create: function() {
- var options = this.options;
-
- this.prevShow = this.prevHide = $();
- this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
- this.element.attr( "role", "tablist" );
-
- // Don't allow collapsible: false and active: false / null
- if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
- options.active = 0;
- }
-
- this._processPanels();
-
- // handle negative values
- if ( options.active < 0 ) {
- options.active += this.headers.length;
- }
- this._refresh();
- },
-
- _getCreateEventData: function() {
- return {
- header: this.active,
- panel: !this.active.length ? $() : this.active.next()
- };
- },
-
- _createIcons: function() {
- var icon, children,
- icons = this.options.icons;
-
- if ( icons ) {
- icon = $( "<span>" );
- this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
- icon.prependTo( this.headers );
- children = this.active.children( ".ui-accordion-header-icon" );
- this._removeClass( children, icons.header )
- ._addClass( children, null, icons.activeHeader )
- ._addClass( this.headers, "ui-accordion-icons" );
- }
- },
-
- _destroyIcons: function() {
- this._removeClass( this.headers, "ui-accordion-icons" );
- this.headers.children( ".ui-accordion-header-icon" ).remove();
- },
-
- _destroy: function() {
- var contents;
-
- // Clean up main element
- this.element.removeAttr( "role" );
-
- // Clean up headers
- this.headers
- .removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
- .removeUniqueId();
-
- this._destroyIcons();
-
- // Clean up content panels
- contents = this.headers.next()
- .css( "display", "" )
- .removeAttr( "role aria-hidden aria-labelledby" )
- .removeUniqueId();
-
- if ( this.options.heightStyle !== "content" ) {
- contents.css( "height", "" );
- }
- },
-
- _setOption: function( key, value ) {
- if ( key === "active" ) {
-
- // _activate() will handle invalid values and update this.options
- this._activate( value );
- return;
- }
-
- if ( key === "event" ) {
- if ( this.options.event ) {
- this._off( this.headers, this.options.event );
- }
- this._setupEvents( value );
- }
-
- this._super( key, value );
-
- // Setting collapsible: false while collapsed; open first panel
- if ( key === "collapsible" && !value && this.options.active === false ) {
- this._activate( 0 );
- }
-
- if ( key === "icons" ) {
- this._destroyIcons();
- if ( value ) {
- this._createIcons();
- }
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.element.attr( "aria-disabled", value );
-
- // Support: IE8 Only
- // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
- // so we need to add the disabled class to the headers and panels
- this._toggleClass( null, "ui-state-disabled", !!value );
- this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
- !!value );
- },
-
- _keydown: function( event ) {
- if ( event.altKey || event.ctrlKey ) {
- return;
- }
-
- var keyCode = $.ui.keyCode,
- length = this.headers.length,
- currentIndex = this.headers.index( event.target ),
- toFocus = false;
-
- switch ( event.keyCode ) {
- case keyCode.RIGHT:
- case keyCode.DOWN:
- toFocus = this.headers[ ( currentIndex + 1 ) % length ];
- break;
- case keyCode.LEFT:
- case keyCode.UP:
- toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
- break;
- case keyCode.SPACE:
- case keyCode.ENTER:
- this._eventHandler( event );
- break;
- case keyCode.HOME:
- toFocus = this.headers[ 0 ];
- break;
- case keyCode.END:
- toFocus = this.headers[ length - 1 ];
- break;
- }
-
- if ( toFocus ) {
- $( event.target ).attr( "tabIndex", -1 );
- $( toFocus ).attr( "tabIndex", 0 );
- $( toFocus ).trigger( "focus" );
- event.preventDefault();
- }
- },
-
- _panelKeyDown: function( event ) {
- if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
- $( event.currentTarget ).prev().trigger( "focus" );
- }
- },
-
- refresh: function() {
- var options = this.options;
- this._processPanels();
-
- // Was collapsed or no panel
- if ( ( options.active === false && options.collapsible === true ) ||
- !this.headers.length ) {
- options.active = false;
- this.active = $();
-
- // active false only when collapsible is true
- } else if ( options.active === false ) {
- this._activate( 0 );
-
- // was active, but active panel is gone
- } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
-
- // all remaining panel are disabled
- if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
- options.active = false;
- this.active = $();
-
- // activate previous panel
- } else {
- this._activate( Math.max( 0, options.active - 1 ) );
- }
-
- // was active, active panel still exists
- } else {
-
- // make sure active index is correct
- options.active = this.headers.index( this.active );
- }
-
- this._destroyIcons();
-
- this._refresh();
- },
-
- _processPanels: function() {
- var prevHeaders = this.headers,
- prevPanels = this.panels;
-
- if ( typeof this.options.header === "function" ) {
- this.headers = this.options.header( this.element );
- } else {
- this.headers = this.element.find( this.options.header );
- }
- this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
- "ui-state-default" );
-
- this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
- this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
-
- // Avoid memory leaks (#10056)
- if ( prevPanels ) {
- this._off( prevHeaders.not( this.headers ) );
- this._off( prevPanels.not( this.panels ) );
- }
- },
-
- _refresh: function() {
- var maxHeight,
- options = this.options,
- heightStyle = options.heightStyle,
- parent = this.element.parent();
-
- this.active = this._findActive( options.active );
- this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
- ._removeClass( this.active, "ui-accordion-header-collapsed" );
- this._addClass( this.active.next(), "ui-accordion-content-active" );
- this.active.next().show();
-
- this.headers
- .attr( "role", "tab" )
- .each( function() {
- var header = $( this ),
- headerId = header.uniqueId().attr( "id" ),
- panel = header.next(),
- panelId = panel.uniqueId().attr( "id" );
- header.attr( "aria-controls", panelId );
- panel.attr( "aria-labelledby", headerId );
- } )
- .next()
- .attr( "role", "tabpanel" );
-
- this.headers
- .not( this.active )
- .attr( {
- "aria-selected": "false",
- "aria-expanded": "false",
- tabIndex: -1
- } )
- .next()
- .attr( {
- "aria-hidden": "true"
- } )
- .hide();
-
- // Make sure at least one header is in the tab order
- if ( !this.active.length ) {
- this.headers.eq( 0 ).attr( "tabIndex", 0 );
- } else {
- this.active.attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } )
- .next()
- .attr( {
- "aria-hidden": "false"
- } );
- }
-
- this._createIcons();
-
- this._setupEvents( options.event );
-
- if ( heightStyle === "fill" ) {
- maxHeight = parent.height();
- this.element.siblings( ":visible" ).each( function() {
- var elem = $( this ),
- position = elem.css( "position" );
-
- if ( position === "absolute" || position === "fixed" ) {
- return;
- }
- maxHeight -= elem.outerHeight( true );
- } );
-
- this.headers.each( function() {
- maxHeight -= $( this ).outerHeight( true );
- } );
-
- this.headers.next()
- .each( function() {
- $( this ).height( Math.max( 0, maxHeight -
- $( this ).innerHeight() + $( this ).height() ) );
- } )
- .css( "overflow", "auto" );
- } else if ( heightStyle === "auto" ) {
- maxHeight = 0;
- this.headers.next()
- .each( function() {
- var isVisible = $( this ).is( ":visible" );
- if ( !isVisible ) {
- $( this ).show();
- }
- maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
- if ( !isVisible ) {
- $( this ).hide();
- }
- } )
- .height( maxHeight );
- }
- },
-
- _activate: function( index ) {
- var active = this._findActive( index )[ 0 ];
-
- // Trying to activate the already active panel
- if ( active === this.active[ 0 ] ) {
- return;
- }
-
- // Trying to collapse, simulate a click on the currently active header
- active = active || this.active[ 0 ];
-
- this._eventHandler( {
- target: active,
- currentTarget: active,
- preventDefault: $.noop
- } );
- },
-
- _findActive: function( selector ) {
- return typeof selector === "number" ? this.headers.eq( selector ) : $();
- },
-
- _setupEvents: function( event ) {
- var events = {
- keydown: "_keydown"
- };
- if ( event ) {
- $.each( event.split( " " ), function( index, eventName ) {
- events[ eventName ] = "_eventHandler";
- } );
- }
-
- this._off( this.headers.add( this.headers.next() ) );
- this._on( this.headers, events );
- this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
- this._hoverable( this.headers );
- this._focusable( this.headers );
- },
-
- _eventHandler: function( event ) {
- var activeChildren, clickedChildren,
- options = this.options,
- active = this.active,
- clicked = $( event.currentTarget ),
- clickedIsActive = clicked[ 0 ] === active[ 0 ],
- collapsing = clickedIsActive && options.collapsible,
- toShow = collapsing ? $() : clicked.next(),
- toHide = active.next(),
- eventData = {
- oldHeader: active,
- oldPanel: toHide,
- newHeader: collapsing ? $() : clicked,
- newPanel: toShow
- };
-
- event.preventDefault();
-
- if (
-
- // click on active header, but not collapsible
- ( clickedIsActive && !options.collapsible ) ||
-
- // allow canceling activation
- ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
- return;
- }
-
- options.active = collapsing ? false : this.headers.index( clicked );
-
- // When the call to ._toggle() comes after the class changes
- // it causes a very odd bug in IE 8 (see #6720)
- this.active = clickedIsActive ? $() : clicked;
- this._toggle( eventData );
-
- // Switch classes
- // corner classes on the previously active header stay after the animation
- this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
- if ( options.icons ) {
- activeChildren = active.children( ".ui-accordion-header-icon" );
- this._removeClass( activeChildren, null, options.icons.activeHeader )
- ._addClass( activeChildren, null, options.icons.header );
- }
-
- if ( !clickedIsActive ) {
- this._removeClass( clicked, "ui-accordion-header-collapsed" )
- ._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
- if ( options.icons ) {
- clickedChildren = clicked.children( ".ui-accordion-header-icon" );
- this._removeClass( clickedChildren, null, options.icons.header )
- ._addClass( clickedChildren, null, options.icons.activeHeader );
- }
-
- this._addClass( clicked.next(), "ui-accordion-content-active" );
- }
- },
-
- _toggle: function( data ) {
- var toShow = data.newPanel,
- toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
-
- // Handle activating a panel during the animation for another activation
- this.prevShow.add( this.prevHide ).stop( true, true );
- this.prevShow = toShow;
- this.prevHide = toHide;
-
- if ( this.options.animate ) {
- this._animate( toShow, toHide, data );
- } else {
- toHide.hide();
- toShow.show();
- this._toggleComplete( data );
- }
-
- toHide.attr( {
- "aria-hidden": "true"
- } );
- toHide.prev().attr( {
- "aria-selected": "false",
- "aria-expanded": "false"
- } );
-
- // if we're switching panels, remove the old header from the tab order
- // if we're opening from collapsed state, remove the previous header from the tab order
- // if we're collapsing, then keep the collapsing header in the tab order
- if ( toShow.length && toHide.length ) {
- toHide.prev().attr( {
- "tabIndex": -1,
- "aria-expanded": "false"
- } );
- } else if ( toShow.length ) {
- this.headers.filter( function() {
- return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
- } )
- .attr( "tabIndex", -1 );
- }
-
- toShow
- .attr( "aria-hidden", "false" )
- .prev()
- .attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } );
- },
-
- _animate: function( toShow, toHide, data ) {
- var total, easing, duration,
- that = this,
- adjust = 0,
- boxSizing = toShow.css( "box-sizing" ),
- down = toShow.length &&
- ( !toHide.length || ( toShow.index() < toHide.index() ) ),
- animate = this.options.animate || {},
- options = down && animate.down || animate,
- complete = function() {
- that._toggleComplete( data );
- };
-
- if ( typeof options === "number" ) {
- duration = options;
- }
- if ( typeof options === "string" ) {
- easing = options;
- }
-
- // fall back from options to animation in case of partial down settings
- easing = easing || options.easing || animate.easing;
- duration = duration || options.duration || animate.duration;
-
- if ( !toHide.length ) {
- return toShow.animate( this.showProps, duration, easing, complete );
- }
- if ( !toShow.length ) {
- return toHide.animate( this.hideProps, duration, easing, complete );
- }
-
- total = toShow.show().outerHeight();
- toHide.animate( this.hideProps, {
- duration: duration,
- easing: easing,
- step: function( now, fx ) {
- fx.now = Math.round( now );
- }
- } );
- toShow
- .hide()
- .animate( this.showProps, {
- duration: duration,
- easing: easing,
- complete: complete,
- step: function( now, fx ) {
- fx.now = Math.round( now );
- if ( fx.prop !== "height" ) {
- if ( boxSizing === "content-box" ) {
- adjust += fx.now;
- }
- } else if ( that.options.heightStyle !== "content" ) {
- fx.now = Math.round( total - toHide.outerHeight() - adjust );
- adjust = 0;
- }
- }
- } );
- },
-
- _toggleComplete: function( data ) {
- var toHide = data.oldPanel,
- prev = toHide.prev();
-
- this._removeClass( toHide, "ui-accordion-content-active" );
- this._removeClass( prev, "ui-accordion-header-active" )
- ._addClass( prev, "ui-accordion-header-collapsed" );
-
- // Work around for rendering bug in IE (#5421)
- if ( toHide.length ) {
- toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
- }
- this._trigger( "activate", null, data );
- }
-} );
-
-
-
-var safeActiveElement = $.ui.safeActiveElement = function( document ) {
- var activeElement;
-
- // Support: IE 9 only
- // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
- try {
- activeElement = document.activeElement;
- } catch ( error ) {
- activeElement = document.body;
- }
-
- // Support: IE 9 - 11 only
- // IE may return null instead of an element
- // Interestingly, this only seems to occur when NOT in an iframe
- if ( !activeElement ) {
- activeElement = document.body;
- }
-
- // Support: IE 11 only
- // IE11 returns a seemingly empty object in some cases when accessing
- // document.activeElement from an <iframe>
- if ( !activeElement.nodeName ) {
- activeElement = document.body;
- }
-
- return activeElement;
-};
-
-
-/*!
- * jQuery UI Menu 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Menu
-//>>group: Widgets
-//>>description: Creates nestable menus.
-//>>docs: http://api.jqueryui.com/menu/
-//>>demos: http://jqueryui.com/menu/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/menu.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var widgetsMenu = $.widget( "ui.menu", {
- version: "1.13.1",
- defaultElement: "<ul>",
- delay: 300,
- options: {
- icons: {
- submenu: "ui-icon-caret-1-e"
- },
- items: "> *",
- menus: "ul",
- position: {
- my: "left top",
- at: "right top"
- },
- role: "menu",
-
- // Callbacks
- blur: null,
- focus: null,
- select: null
- },
-
- _create: function() {
- this.activeMenu = this.element;
-
- // Flag used to prevent firing of the click handler
- // as the event bubbles up through nested menus
- this.mouseHandled = false;
- this.lastMousePosition = { x: null, y: null };
- this.element
- .uniqueId()
- .attr( {
- role: this.options.role,
- tabIndex: 0
- } );
-
- this._addClass( "ui-menu", "ui-widget ui-widget-content" );
- this._on( {
-
- // Prevent focus from sticking to links inside menu after clicking
- // them (focus should always stay on UL during navigation).
- "mousedown .ui-menu-item": function( event ) {
- event.preventDefault();
-
- this._activateItem( event );
- },
- "click .ui-menu-item": function( event ) {
- var target = $( event.target );
- var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
- if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
- this.select( event );
-
- // Only set the mouseHandled flag if the event will bubble, see #9469.
- if ( !event.isPropagationStopped() ) {
- this.mouseHandled = true;
- }
-
- // Open submenu on click
- if ( target.has( ".ui-menu" ).length ) {
- this.expand( event );
- } else if ( !this.element.is( ":focus" ) &&
- active.closest( ".ui-menu" ).length ) {
-
- // Redirect focus to the menu
- this.element.trigger( "focus", [ true ] );
-
- // If the active item is on the top level, let it stay active.
- // Otherwise, blur the active item since it is no longer visible.
- if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
- clearTimeout( this.timer );
- }
- }
- }
- },
- "mouseenter .ui-menu-item": "_activateItem",
- "mousemove .ui-menu-item": "_activateItem",
- mouseleave: "collapseAll",
- "mouseleave .ui-menu": "collapseAll",
- focus: function( event, keepActiveItem ) {
-
- // If there's already an active item, keep it active
- // If not, activate the first item
- var item = this.active || this._menuItems().first();
-
- if ( !keepActiveItem ) {
- this.focus( event, item );
- }
- },
- blur: function( event ) {
- this._delay( function() {
- var notContained = !$.contains(
- this.element[ 0 ],
- $.ui.safeActiveElement( this.document[ 0 ] )
- );
- if ( notContained ) {
- this.collapseAll( event );
- }
- } );
- },
- keydown: "_keydown"
- } );
-
- this.refresh();
-
- // Clicks outside of a menu collapse any open menus
- this._on( this.document, {
- click: function( event ) {
- if ( this._closeOnDocumentClick( event ) ) {
- this.collapseAll( event, true );
- }
-
- // Reset the mouseHandled flag
- this.mouseHandled = false;
- }
- } );
- },
-
- _activateItem: function( event ) {
-
- // Ignore mouse events while typeahead is active, see #10458.
- // Prevents focusing the wrong item when typeahead causes a scroll while the mouse
- // is over an item in the menu
- if ( this.previousFilter ) {
- return;
- }
-
- // If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)
- if ( event.clientX === this.lastMousePosition.x &&
- event.clientY === this.lastMousePosition.y ) {
- return;
- }
-
- this.lastMousePosition = {
- x: event.clientX,
- y: event.clientY
- };
-
- var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
- target = $( event.currentTarget );
-
- // Ignore bubbled events on parent items, see #11641
- if ( actualTarget[ 0 ] !== target[ 0 ] ) {
- return;
- }
-
- // If the item is already active, there's nothing to do
- if ( target.is( ".ui-state-active" ) ) {
- return;
- }
-
- // Remove ui-state-active class from siblings of the newly focused menu item
- // to avoid a jump caused by adjacent elements both having a class with a border
- this._removeClass( target.siblings().children( ".ui-state-active" ),
- null, "ui-state-active" );
- this.focus( event, target );
- },
-
- _destroy: function() {
- var items = this.element.find( ".ui-menu-item" )
- .removeAttr( "role aria-disabled" ),
- submenus = items.children( ".ui-menu-item-wrapper" )
- .removeUniqueId()
- .removeAttr( "tabIndex role aria-haspopup" );
-
- // Destroy (sub)menus
- this.element
- .removeAttr( "aria-activedescendant" )
- .find( ".ui-menu" ).addBack()
- .removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
- "tabIndex" )
- .removeUniqueId()
- .show();
-
- submenus.children().each( function() {
- var elem = $( this );
- if ( elem.data( "ui-menu-submenu-caret" ) ) {
- elem.remove();
- }
- } );
- },
-
- _keydown: function( event ) {
- var match, prev, character, skip,
- preventDefault = true;
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.PAGE_UP:
- this.previousPage( event );
- break;
- case $.ui.keyCode.PAGE_DOWN:
- this.nextPage( event );
- break;
- case $.ui.keyCode.HOME:
- this._move( "first", "first", event );
- break;
- case $.ui.keyCode.END:
- this._move( "last", "last", event );
- break;
- case $.ui.keyCode.UP:
- this.previous( event );
- break;
- case $.ui.keyCode.DOWN:
- this.next( event );
- break;
- case $.ui.keyCode.LEFT:
- this.collapse( event );
- break;
- case $.ui.keyCode.RIGHT:
- if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
- this.expand( event );
- }
- break;
- case $.ui.keyCode.ENTER:
- case $.ui.keyCode.SPACE:
- this._activate( event );
- break;
- case $.ui.keyCode.ESCAPE:
- this.collapse( event );
- break;
- default:
- preventDefault = false;
- prev = this.previousFilter || "";
- skip = false;
-
- // Support number pad values
- character = event.keyCode >= 96 && event.keyCode <= 105 ?
- ( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
-
- clearTimeout( this.filterTimer );
-
- if ( character === prev ) {
- skip = true;
- } else {
- character = prev + character;
- }
-
- match = this._filterMenuItems( character );
- match = skip && match.index( this.active.next() ) !== -1 ?
- this.active.nextAll( ".ui-menu-item" ) :
- match;
-
- // If no matches on the current filter, reset to the last character pressed
- // to move down the menu to the first item that starts with that character
- if ( !match.length ) {
- character = String.fromCharCode( event.keyCode );
- match = this._filterMenuItems( character );
- }
-
- if ( match.length ) {
- this.focus( event, match );
- this.previousFilter = character;
- this.filterTimer = this._delay( function() {
- delete this.previousFilter;
- }, 1000 );
- } else {
- delete this.previousFilter;
- }
- }
-
- if ( preventDefault ) {
- event.preventDefault();
- }
- },
-
- _activate: function( event ) {
- if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
- if ( this.active.children( "[aria-haspopup='true']" ).length ) {
- this.expand( event );
- } else {
- this.select( event );
- }
- }
- },
-
- refresh: function() {
- var menus, items, newSubmenus, newItems, newWrappers,
- that = this,
- icon = this.options.icons.submenu,
- submenus = this.element.find( this.options.menus );
-
- this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
-
- // Initialize nested menus
- newSubmenus = submenus.filter( ":not(.ui-menu)" )
- .hide()
- .attr( {
- role: this.options.role,
- "aria-hidden": "true",
- "aria-expanded": "false"
- } )
- .each( function() {
- var menu = $( this ),
- item = menu.prev(),
- submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
-
- that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
- item
- .attr( "aria-haspopup", "true" )
- .prepend( submenuCaret );
- menu.attr( "aria-labelledby", item.attr( "id" ) );
- } );
-
- this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
-
- menus = submenus.add( this.element );
- items = menus.find( this.options.items );
-
- // Initialize menu-items containing spaces and/or dashes only as dividers
- items.not( ".ui-menu-item" ).each( function() {
- var item = $( this );
- if ( that._isDivider( item ) ) {
- that._addClass( item, "ui-menu-divider", "ui-widget-content" );
- }
- } );
-
- // Don't refresh list items that are already adapted
- newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
- newWrappers = newItems.children()
- .not( ".ui-menu" )
- .uniqueId()
- .attr( {
- tabIndex: -1,
- role: this._itemRole()
- } );
- this._addClass( newItems, "ui-menu-item" )
- ._addClass( newWrappers, "ui-menu-item-wrapper" );
-
- // Add aria-disabled attribute to any disabled menu item
- items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
-
- // If the active item has been removed, blur the menu
- if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
- this.blur();
- }
- },
-
- _itemRole: function() {
- return {
- menu: "menuitem",
- listbox: "option"
- }[ this.options.role ];
- },
-
- _setOption: function( key, value ) {
- if ( key === "icons" ) {
- var icons = this.element.find( ".ui-menu-icon" );
- this._removeClass( icons, null, this.options.icons.submenu )
- ._addClass( icons, null, value.submenu );
- }
- this._super( key, value );
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.element.attr( "aria-disabled", String( value ) );
- this._toggleClass( null, "ui-state-disabled", !!value );
- },
-
- focus: function( event, item ) {
- var nested, focused, activeParent;
- this.blur( event, event && event.type === "focus" );
-
- this._scrollIntoView( item );
-
- this.active = item.first();
-
- focused = this.active.children( ".ui-menu-item-wrapper" );
- this._addClass( focused, null, "ui-state-active" );
-
- // Only update aria-activedescendant if there's a role
- // otherwise we assume focus is managed elsewhere
- if ( this.options.role ) {
- this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
- }
-
- // Highlight active parent menu item, if any
- activeParent = this.active
- .parent()
- .closest( ".ui-menu-item" )
- .children( ".ui-menu-item-wrapper" );
- this._addClass( activeParent, null, "ui-state-active" );
-
- if ( event && event.type === "keydown" ) {
- this._close();
- } else {
- this.timer = this._delay( function() {
- this._close();
- }, this.delay );
- }
-
- nested = item.children( ".ui-menu" );
- if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
- this._startOpening( nested );
- }
- this.activeMenu = item.parent();
-
- this._trigger( "focus", event, { item: item } );
- },
-
- _scrollIntoView: function( item ) {
- var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
- if ( this._hasScroll() ) {
- borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
- paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
- offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
- scroll = this.activeMenu.scrollTop();
- elementHeight = this.activeMenu.height();
- itemHeight = item.outerHeight();
-
- if ( offset < 0 ) {
- this.activeMenu.scrollTop( scroll + offset );
- } else if ( offset + itemHeight > elementHeight ) {
- this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
- }
- }
- },
-
- blur: function( event, fromFocus ) {
- if ( !fromFocus ) {
- clearTimeout( this.timer );
- }
-
- if ( !this.active ) {
- return;
- }
-
- this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
- null, "ui-state-active" );
-
- this._trigger( "blur", event, { item: this.active } );
- this.active = null;
- },
-
- _startOpening: function( submenu ) {
- clearTimeout( this.timer );
-
- // Don't open if already open fixes a Firefox bug that caused a .5 pixel
- // shift in the submenu position when mousing over the caret icon
- if ( submenu.attr( "aria-hidden" ) !== "true" ) {
- return;
- }
-
- this.timer = this._delay( function() {
- this._close();
- this._open( submenu );
- }, this.delay );
- },
-
- _open: function( submenu ) {
- var position = $.extend( {
- of: this.active
- }, this.options.position );
-
- clearTimeout( this.timer );
- this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
- .hide()
- .attr( "aria-hidden", "true" );
-
- submenu
- .show()
- .removeAttr( "aria-hidden" )
- .attr( "aria-expanded", "true" )
- .position( position );
- },
-
- collapseAll: function( event, all ) {
- clearTimeout( this.timer );
- this.timer = this._delay( function() {
-
- // If we were passed an event, look for the submenu that contains the event
- var currentMenu = all ? this.element :
- $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
-
- // If we found no valid submenu ancestor, use the main menu to close all
- // sub menus anyway
- if ( !currentMenu.length ) {
- currentMenu = this.element;
- }
-
- this._close( currentMenu );
-
- this.blur( event );
-
- // Work around active item staying active after menu is blurred
- this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
-
- this.activeMenu = currentMenu;
- }, all ? 0 : this.delay );
- },
-
- // With no arguments, closes the currently active menu - if nothing is active
- // it closes all menus. If passed an argument, it will search for menus BELOW
- _close: function( startMenu ) {
- if ( !startMenu ) {
- startMenu = this.active ? this.active.parent() : this.element;
- }
-
- startMenu.find( ".ui-menu" )
- .hide()
- .attr( "aria-hidden", "true" )
- .attr( "aria-expanded", "false" );
- },
-
- _closeOnDocumentClick: function( event ) {
- return !$( event.target ).closest( ".ui-menu" ).length;
- },
-
- _isDivider: function( item ) {
-
- // Match hyphen, em dash, en dash
- return !/[^\-\u2014\u2013\s]/.test( item.text() );
- },
-
- collapse: function( event ) {
- var newItem = this.active &&
- this.active.parent().closest( ".ui-menu-item", this.element );
- if ( newItem && newItem.length ) {
- this._close();
- this.focus( event, newItem );
- }
- },
-
- expand: function( event ) {
- var newItem = this.active && this._menuItems( this.active.children( ".ui-menu" ) ).first();
-
- if ( newItem && newItem.length ) {
- this._open( newItem.parent() );
-
- // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
- this._delay( function() {
- this.focus( event, newItem );
- } );
- }
- },
-
- next: function( event ) {
- this._move( "next", "first", event );
- },
-
- previous: function( event ) {
- this._move( "prev", "last", event );
- },
-
- isFirstItem: function() {
- return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
- },
-
- isLastItem: function() {
- return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
- },
-
- _menuItems: function( menu ) {
- return ( menu || this.element )
- .find( this.options.items )
- .filter( ".ui-menu-item" );
- },
-
- _move: function( direction, filter, event ) {
- var next;
- if ( this.active ) {
- if ( direction === "first" || direction === "last" ) {
- next = this.active
- [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
- .last();
- } else {
- next = this.active
- [ direction + "All" ]( ".ui-menu-item" )
- .first();
- }
- }
- if ( !next || !next.length || !this.active ) {
- next = this._menuItems( this.activeMenu )[ filter ]();
- }
-
- this.focus( event, next );
- },
-
- nextPage: function( event ) {
- var item, base, height;
-
- if ( !this.active ) {
- this.next( event );
- return;
- }
- if ( this.isLastItem() ) {
- return;
- }
- if ( this._hasScroll() ) {
- base = this.active.offset().top;
- height = this.element.innerHeight();
-
- // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
- if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) {
- height += this.element[ 0 ].offsetHeight - this.element.outerHeight();
- }
-
- this.active.nextAll( ".ui-menu-item" ).each( function() {
- item = $( this );
- return item.offset().top - base - height < 0;
- } );
-
- this.focus( event, item );
- } else {
- this.focus( event, this._menuItems( this.activeMenu )
- [ !this.active ? "first" : "last" ]() );
- }
- },
-
- previousPage: function( event ) {
- var item, base, height;
- if ( !this.active ) {
- this.next( event );
- return;
- }
- if ( this.isFirstItem() ) {
- return;
- }
- if ( this._hasScroll() ) {
- base = this.active.offset().top;
- height = this.element.innerHeight();
-
- // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
- if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) {
- height += this.element[ 0 ].offsetHeight - this.element.outerHeight();
- }
-
- this.active.prevAll( ".ui-menu-item" ).each( function() {
- item = $( this );
- return item.offset().top - base + height > 0;
- } );
-
- this.focus( event, item );
- } else {
- this.focus( event, this._menuItems( this.activeMenu ).first() );
- }
- },
-
- _hasScroll: function() {
- return this.element.outerHeight() < this.element.prop( "scrollHeight" );
- },
-
- select: function( event ) {
-
- // TODO: It should never be possible to not have an active item at this
- // point, but the tests don't trigger mouseenter before click.
- this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
- var ui = { item: this.active };
- if ( !this.active.has( ".ui-menu" ).length ) {
- this.collapseAll( event, true );
- }
- this._trigger( "select", event, ui );
- },
-
- _filterMenuItems: function( character ) {
- var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
- regex = new RegExp( "^" + escapedCharacter, "i" );
-
- return this.activeMenu
- .find( this.options.items )
-
- // Only match on items, not dividers or other content (#10571)
- .filter( ".ui-menu-item" )
- .filter( function() {
- return regex.test(
- String.prototype.trim.call(
- $( this ).children( ".ui-menu-item-wrapper" ).text() ) );
- } );
- }
-} );
-
-
-/*!
- * jQuery UI Autocomplete 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Autocomplete
-//>>group: Widgets
-//>>description: Lists suggested words as the user is typing.
-//>>docs: http://api.jqueryui.com/autocomplete/
-//>>demos: http://jqueryui.com/autocomplete/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/autocomplete.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.autocomplete", {
- version: "1.13.1",
- defaultElement: "<input>",
- options: {
- appendTo: null,
- autoFocus: false,
- delay: 300,
- minLength: 1,
- position: {
- my: "left top",
- at: "left bottom",
- collision: "none"
- },
- source: null,
-
- // Callbacks
- change: null,
- close: null,
- focus: null,
- open: null,
- response: null,
- search: null,
- select: null
- },
-
- requestIndex: 0,
- pending: 0,
- liveRegionTimer: null,
-
- _create: function() {
-
- // Some browsers only repeat keydown events, not keypress events,
- // so we use the suppressKeyPress flag to determine if we've already
- // handled the keydown event. #7269
- // Unfortunately the code for & in keypress is the same as the up arrow,
- // so we use the suppressKeyPressRepeat flag to avoid handling keypress
- // events when we know the keydown event was used to modify the
- // search term. #7799
- var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
- nodeName = this.element[ 0 ].nodeName.toLowerCase(),
- isTextarea = nodeName === "textarea",
- isInput = nodeName === "input";
-
- // Textareas are always multi-line
- // Inputs are always single-line, even if inside a contentEditable element
- // IE also treats inputs as contentEditable
- // All other element types are determined by whether or not they're contentEditable
- this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
-
- this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
- this.isNewMenu = true;
-
- this._addClass( "ui-autocomplete-input" );
- this.element.attr( "autocomplete", "off" );
-
- this._on( this.element, {
- keydown: function( event ) {
- if ( this.element.prop( "readOnly" ) ) {
- suppressKeyPress = true;
- suppressInput = true;
- suppressKeyPressRepeat = true;
- return;
- }
-
- suppressKeyPress = false;
- suppressInput = false;
- suppressKeyPressRepeat = false;
- var keyCode = $.ui.keyCode;
- switch ( event.keyCode ) {
- case keyCode.PAGE_UP:
- suppressKeyPress = true;
- this._move( "previousPage", event );
- break;
- case keyCode.PAGE_DOWN:
- suppressKeyPress = true;
- this._move( "nextPage", event );
- break;
- case keyCode.UP:
- suppressKeyPress = true;
- this._keyEvent( "previous", event );
- break;
- case keyCode.DOWN:
- suppressKeyPress = true;
- this._keyEvent( "next", event );
- break;
- case keyCode.ENTER:
-
- // when menu is open and has focus
- if ( this.menu.active ) {
-
- // #6055 - Opera still allows the keypress to occur
- // which causes forms to submit
- suppressKeyPress = true;
- event.preventDefault();
- this.menu.select( event );
- }
- break;
- case keyCode.TAB:
- if ( this.menu.active ) {
- this.menu.select( event );
- }
- break;
- case keyCode.ESCAPE:
- if ( this.menu.element.is( ":visible" ) ) {
- if ( !this.isMultiLine ) {
- this._value( this.term );
- }
- this.close( event );
-
- // Different browsers have different default behavior for escape
- // Single press can mean undo or clear
- // Double press in IE means clear the whole form
- event.preventDefault();
- }
- break;
- default:
- suppressKeyPressRepeat = true;
-
- // search timeout should be triggered before the input value is changed
- this._searchTimeout( event );
- break;
- }
- },
- keypress: function( event ) {
- if ( suppressKeyPress ) {
- suppressKeyPress = false;
- if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
- event.preventDefault();
- }
- return;
- }
- if ( suppressKeyPressRepeat ) {
- return;
- }
-
- // Replicate some key handlers to allow them to repeat in Firefox and Opera
- var keyCode = $.ui.keyCode;
- switch ( event.keyCode ) {
- case keyCode.PAGE_UP:
- this._move( "previousPage", event );
- break;
- case keyCode.PAGE_DOWN:
- this._move( "nextPage", event );
- break;
- case keyCode.UP:
- this._keyEvent( "previous", event );
- break;
- case keyCode.DOWN:
- this._keyEvent( "next", event );
- break;
- }
- },
- input: function( event ) {
- if ( suppressInput ) {
- suppressInput = false;
- event.preventDefault();
- return;
- }
- this._searchTimeout( event );
- },
- focus: function() {
- this.selectedItem = null;
- this.previous = this._value();
- },
- blur: function( event ) {
- clearTimeout( this.searching );
- this.close( event );
- this._change( event );
- }
- } );
-
- this._initSource();
- this.menu = $( "<ul>" )
- .appendTo( this._appendTo() )
- .menu( {
-
- // disable ARIA support, the live region takes care of that
- role: null
- } )
- .hide()
-
- // Support: IE 11 only, Edge <= 14
- // For other browsers, we preventDefault() on the mousedown event
- // to keep the dropdown from taking focus from the input. This doesn't
- // work for IE/Edge, causing problems with selection and scrolling (#9638)
- // Happily, IE and Edge support an "unselectable" attribute that
- // prevents an element from receiving focus, exactly what we want here.
- .attr( {
- "unselectable": "on"
- } )
- .menu( "instance" );
-
- this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
- this._on( this.menu.element, {
- mousedown: function( event ) {
-
- // Prevent moving focus out of the text field
- event.preventDefault();
- },
- menufocus: function( event, ui ) {
- var label, item;
-
- // support: Firefox
- // Prevent accidental activation of menu items in Firefox (#7024 #9118)
- if ( this.isNewMenu ) {
- this.isNewMenu = false;
- if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
- this.menu.blur();
-
- this.document.one( "mousemove", function() {
- $( event.target ).trigger( event.originalEvent );
- } );
-
- return;
- }
- }
-
- item = ui.item.data( "ui-autocomplete-item" );
- if ( false !== this._trigger( "focus", event, { item: item } ) ) {
-
- // use value to match what will end up in the input, if it was a key event
- if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
- this._value( item.value );
- }
- }
-
- // Announce the value in the liveRegion
- label = ui.item.attr( "aria-label" ) || item.value;
- if ( label && String.prototype.trim.call( label ).length ) {
- clearTimeout( this.liveRegionTimer );
- this.liveRegionTimer = this._delay( function() {
- this.liveRegion.html( $( "<div>" ).text( label ) );
- }, 100 );
- }
- },
- menuselect: function( event, ui ) {
- var item = ui.item.data( "ui-autocomplete-item" ),
- previous = this.previous;
-
- // Only trigger when focus was lost (click on menu)
- if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
- this.element.trigger( "focus" );
- this.previous = previous;
-
- // #6109 - IE triggers two focus events and the second
- // is asynchronous, so we need to reset the previous
- // term synchronously and asynchronously :-(
- this._delay( function() {
- this.previous = previous;
- this.selectedItem = item;
- } );
- }
-
- if ( false !== this._trigger( "select", event, { item: item } ) ) {
- this._value( item.value );
- }
-
- // reset the term after the select event
- // this allows custom select handling to work properly
- this.term = this._value();
-
- this.close( event );
- this.selectedItem = item;
- }
- } );
-
- this.liveRegion = $( "<div>", {
- role: "status",
- "aria-live": "assertive",
- "aria-relevant": "additions"
- } )
- .appendTo( this.document[ 0 ].body );
-
- this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
-
- // Turning off autocomplete prevents the browser from remembering the
- // value when navigating through history, so we re-enable autocomplete
- // if the page is unloaded before the widget is destroyed. #7790
- this._on( this.window, {
- beforeunload: function() {
- this.element.removeAttr( "autocomplete" );
- }
- } );
- },
-
- _destroy: function() {
- clearTimeout( this.searching );
- this.element.removeAttr( "autocomplete" );
- this.menu.element.remove();
- this.liveRegion.remove();
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
- if ( key === "source" ) {
- this._initSource();
- }
- if ( key === "appendTo" ) {
- this.menu.element.appendTo( this._appendTo() );
- }
- if ( key === "disabled" && value && this.xhr ) {
- this.xhr.abort();
- }
- },
-
- _isEventTargetInWidget: function( event ) {
- var menuElement = this.menu.element[ 0 ];
-
- return event.target === this.element[ 0 ] ||
- event.target === menuElement ||
- $.contains( menuElement, event.target );
- },
-
- _closeOnClickOutside: function( event ) {
- if ( !this._isEventTargetInWidget( event ) ) {
- this.close();
- }
- },
-
- _appendTo: function() {
- var element = this.options.appendTo;
-
- if ( element ) {
- element = element.jquery || element.nodeType ?
- $( element ) :
- this.document.find( element ).eq( 0 );
- }
-
- if ( !element || !element[ 0 ] ) {
- element = this.element.closest( ".ui-front, dialog" );
- }
-
- if ( !element.length ) {
- element = this.document[ 0 ].body;
- }
-
- return element;
- },
-
- _initSource: function() {
- var array, url,
- that = this;
- if ( Array.isArray( this.options.source ) ) {
- array = this.options.source;
- this.source = function( request, response ) {
- response( $.ui.autocomplete.filter( array, request.term ) );
- };
- } else if ( typeof this.options.source === "string" ) {
- url = this.options.source;
- this.source = function( request, response ) {
- if ( that.xhr ) {
- that.xhr.abort();
- }
- that.xhr = $.ajax( {
- url: url,
- data: request,
- dataType: "json",
- success: function( data ) {
- response( data );
- },
- error: function() {
- response( [] );
- }
- } );
- };
- } else {
- this.source = this.options.source;
- }
- },
-
- _searchTimeout: function( event ) {
- clearTimeout( this.searching );
- this.searching = this._delay( function() {
-
- // Search if the value has changed, or if the user retypes the same value (see #7434)
- var equalValues = this.term === this._value(),
- menuVisible = this.menu.element.is( ":visible" ),
- modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
-
- if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
- this.selectedItem = null;
- this.search( null, event );
- }
- }, this.options.delay );
- },
-
- search: function( value, event ) {
- value = value != null ? value : this._value();
-
- // Always save the actual value, not the one passed as an argument
- this.term = this._value();
-
- if ( value.length < this.options.minLength ) {
- return this.close( event );
- }
-
- if ( this._trigger( "search", event ) === false ) {
- return;
- }
-
- return this._search( value );
- },
-
- _search: function( value ) {
- this.pending++;
- this._addClass( "ui-autocomplete-loading" );
- this.cancelSearch = false;
-
- this.source( { term: value }, this._response() );
- },
-
- _response: function() {
- var index = ++this.requestIndex;
-
- return function( content ) {
- if ( index === this.requestIndex ) {
- this.__response( content );
- }
-
- this.pending--;
- if ( !this.pending ) {
- this._removeClass( "ui-autocomplete-loading" );
- }
- }.bind( this );
- },
-
- __response: function( content ) {
- if ( content ) {
- content = this._normalize( content );
- }
- this._trigger( "response", null, { content: content } );
- if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
- this._suggest( content );
- this._trigger( "open" );
- } else {
-
- // use ._close() instead of .close() so we don't cancel future searches
- this._close();
- }
- },
-
- close: function( event ) {
- this.cancelSearch = true;
- this._close( event );
- },
-
- _close: function( event ) {
-
- // Remove the handler that closes the menu on outside clicks
- this._off( this.document, "mousedown" );
-
- if ( this.menu.element.is( ":visible" ) ) {
- this.menu.element.hide();
- this.menu.blur();
- this.isNewMenu = true;
- this._trigger( "close", event );
- }
- },
-
- _change: function( event ) {
- if ( this.previous !== this._value() ) {
- this._trigger( "change", event, { item: this.selectedItem } );
- }
- },
-
- _normalize: function( items ) {
-
- // assume all items have the right format when the first item is complete
- if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
- return items;
- }
- return $.map( items, function( item ) {
- if ( typeof item === "string" ) {
- return {
- label: item,
- value: item
- };
- }
- return $.extend( {}, item, {
- label: item.label || item.value,
- value: item.value || item.label
- } );
- } );
- },
-
- _suggest: function( items ) {
- var ul = this.menu.element.empty();
- this._renderMenu( ul, items );
- this.isNewMenu = true;
- this.menu.refresh();
-
- // Size and position menu
- ul.show();
- this._resizeMenu();
- ul.position( $.extend( {
- of: this.element
- }, this.options.position ) );
-
- if ( this.options.autoFocus ) {
- this.menu.next();
- }
-
- // Listen for interactions outside of the widget (#6642)
- this._on( this.document, {
- mousedown: "_closeOnClickOutside"
- } );
- },
-
- _resizeMenu: function() {
- var ul = this.menu.element;
- ul.outerWidth( Math.max(
-
- // Firefox wraps long text (possibly a rounding bug)
- // so we add 1px to avoid the wrapping (#7513)
- ul.width( "" ).outerWidth() + 1,
- this.element.outerWidth()
- ) );
- },
-
- _renderMenu: function( ul, items ) {
- var that = this;
- $.each( items, function( index, item ) {
- that._renderItemData( ul, item );
- } );
- },
-
- _renderItemData: function( ul, item ) {
- return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
- },
-
- _renderItem: function( ul, item ) {
- return $( "<li>" )
- .append( $( "<div>" ).text( item.label ) )
- .appendTo( ul );
- },
-
- _move: function( direction, event ) {
- if ( !this.menu.element.is( ":visible" ) ) {
- this.search( null, event );
- return;
- }
- if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
- this.menu.isLastItem() && /^next/.test( direction ) ) {
-
- if ( !this.isMultiLine ) {
- this._value( this.term );
- }
-
- this.menu.blur();
- return;
- }
- this.menu[ direction ]( event );
- },
-
- widget: function() {
- return this.menu.element;
- },
-
- _value: function() {
- return this.valueMethod.apply( this.element, arguments );
- },
-
- _keyEvent: function( keyEvent, event ) {
- if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
- this._move( keyEvent, event );
-
- // Prevents moving cursor to beginning/end of the text field in some browsers
- event.preventDefault();
- }
- },
-
- // Support: Chrome <=50
- // We should be able to just use this.element.prop( "isContentEditable" )
- // but hidden elements always report false in Chrome.
- // https://code.google.com/p/chromium/issues/detail?id=313082
- _isContentEditable: function( element ) {
- if ( !element.length ) {
- return false;
- }
-
- var editable = element.prop( "contentEditable" );
-
- if ( editable === "inherit" ) {
- return this._isContentEditable( element.parent() );
- }
-
- return editable === "true";
- }
-} );
-
-$.extend( $.ui.autocomplete, {
- escapeRegex: function( value ) {
- return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
- },
- filter: function( array, term ) {
- var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
- return $.grep( array, function( value ) {
- return matcher.test( value.label || value.value || value );
- } );
- }
-} );
-
-// Live region extension, adding a `messages` option
-// NOTE: This is an experimental API. We are still investigating
-// a full solution for string manipulation and internationalization.
-$.widget( "ui.autocomplete", $.ui.autocomplete, {
- options: {
- messages: {
- noResults: "No search results.",
- results: function( amount ) {
- return amount + ( amount > 1 ? " results are" : " result is" ) +
- " available, use up and down arrow keys to navigate.";
- }
- }
- },
-
- __response: function( content ) {
- var message;
- this._superApply( arguments );
- if ( this.options.disabled || this.cancelSearch ) {
- return;
- }
- if ( content && content.length ) {
- message = this.options.messages.results( content.length );
- } else {
- message = this.options.messages.noResults;
- }
- clearTimeout( this.liveRegionTimer );
- this.liveRegionTimer = this._delay( function() {
- this.liveRegion.html( $( "<div>" ).text( message ) );
- }, 100 );
- }
-} );
-
-var widgetsAutocomplete = $.ui.autocomplete;
-
-
-/*!
- * jQuery UI Controlgroup 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Controlgroup
-//>>group: Widgets
-//>>description: Visually groups form control widgets
-//>>docs: http://api.jqueryui.com/controlgroup/
-//>>demos: http://jqueryui.com/controlgroup/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/controlgroup.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
-
-var widgetsControlgroup = $.widget( "ui.controlgroup", {
- version: "1.13.1",
- defaultElement: "<div>",
- options: {
- direction: "horizontal",
- disabled: null,
- onlyVisible: true,
- items: {
- "button": "input[type=button], input[type=submit], input[type=reset], button, a",
- "controlgroupLabel": ".ui-controlgroup-label",
- "checkboxradio": "input[type='checkbox'], input[type='radio']",
- "selectmenu": "select",
- "spinner": ".ui-spinner-input"
- }
- },
-
- _create: function() {
- this._enhance();
- },
-
- // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
- _enhance: function() {
- this.element.attr( "role", "toolbar" );
- this.refresh();
- },
-
- _destroy: function() {
- this._callChildMethod( "destroy" );
- this.childWidgets.removeData( "ui-controlgroup-data" );
- this.element.removeAttr( "role" );
- if ( this.options.items.controlgroupLabel ) {
- this.element
- .find( this.options.items.controlgroupLabel )
- .find( ".ui-controlgroup-label-contents" )
- .contents().unwrap();
- }
- },
-
- _initWidgets: function() {
- var that = this,
- childWidgets = [];
-
- // First we iterate over each of the items options
- $.each( this.options.items, function( widget, selector ) {
- var labels;
- var options = {};
-
- // Make sure the widget has a selector set
- if ( !selector ) {
- return;
- }
-
- if ( widget === "controlgroupLabel" ) {
- labels = that.element.find( selector );
- labels.each( function() {
- var element = $( this );
-
- if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
- return;
- }
- element.contents()
- .wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
- } );
- that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
- childWidgets = childWidgets.concat( labels.get() );
- return;
- }
-
- // Make sure the widget actually exists
- if ( !$.fn[ widget ] ) {
- return;
- }
-
- // We assume everything is in the middle to start because we can't determine
- // first / last elements until all enhancments are done.
- if ( that[ "_" + widget + "Options" ] ) {
- options = that[ "_" + widget + "Options" ]( "middle" );
- } else {
- options = { classes: {} };
- }
-
- // Find instances of this widget inside controlgroup and init them
- that.element
- .find( selector )
- .each( function() {
- var element = $( this );
- var instance = element[ widget ]( "instance" );
-
- // We need to clone the default options for this type of widget to avoid
- // polluting the variable options which has a wider scope than a single widget.
- var instanceOptions = $.widget.extend( {}, options );
-
- // If the button is the child of a spinner ignore it
- // TODO: Find a more generic solution
- if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
- return;
- }
-
- // Create the widget if it doesn't exist
- if ( !instance ) {
- instance = element[ widget ]()[ widget ]( "instance" );
- }
- if ( instance ) {
- instanceOptions.classes =
- that._resolveClassesValues( instanceOptions.classes, instance );
- }
- element[ widget ]( instanceOptions );
-
- // Store an instance of the controlgroup to be able to reference
- // from the outermost element for changing options and refresh
- var widgetElement = element[ widget ]( "widget" );
- $.data( widgetElement[ 0 ], "ui-controlgroup-data",
- instance ? instance : element[ widget ]( "instance" ) );
-
- childWidgets.push( widgetElement[ 0 ] );
- } );
- } );
-
- this.childWidgets = $( $.uniqueSort( childWidgets ) );
- this._addClass( this.childWidgets, "ui-controlgroup-item" );
- },
-
- _callChildMethod: function( method ) {
- this.childWidgets.each( function() {
- var element = $( this ),
- data = element.data( "ui-controlgroup-data" );
- if ( data && data[ method ] ) {
- data[ method ]();
- }
- } );
- },
-
- _updateCornerClass: function( element, position ) {
- var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
- var add = this._buildSimpleOptions( position, "label" ).classes.label;
-
- this._removeClass( element, null, remove );
- this._addClass( element, null, add );
- },
-
- _buildSimpleOptions: function( position, key ) {
- var direction = this.options.direction === "vertical";
- var result = {
- classes: {}
- };
- result.classes[ key ] = {
- "middle": "",
- "first": "ui-corner-" + ( direction ? "top" : "left" ),
- "last": "ui-corner-" + ( direction ? "bottom" : "right" ),
- "only": "ui-corner-all"
- }[ position ];
-
- return result;
- },
-
- _spinnerOptions: function( position ) {
- var options = this._buildSimpleOptions( position, "ui-spinner" );
-
- options.classes[ "ui-spinner-up" ] = "";
- options.classes[ "ui-spinner-down" ] = "";
-
- return options;
- },
-
- _buttonOptions: function( position ) {
- return this._buildSimpleOptions( position, "ui-button" );
- },
-
- _checkboxradioOptions: function( position ) {
- return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
- },
-
- _selectmenuOptions: function( position ) {
- var direction = this.options.direction === "vertical";
- return {
- width: direction ? "auto" : false,
- classes: {
- middle: {
- "ui-selectmenu-button-open": "",
- "ui-selectmenu-button-closed": ""
- },
- first: {
- "ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
- "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
- },
- last: {
- "ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
- "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
- },
- only: {
- "ui-selectmenu-button-open": "ui-corner-top",
- "ui-selectmenu-button-closed": "ui-corner-all"
- }
-
- }[ position ]
- };
- },
-
- _resolveClassesValues: function( classes, instance ) {
- var result = {};
- $.each( classes, function( key ) {
- var current = instance.options.classes[ key ] || "";
- current = String.prototype.trim.call( current.replace( controlgroupCornerRegex, "" ) );
- result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
- } );
- return result;
- },
-
- _setOption: function( key, value ) {
- if ( key === "direction" ) {
- this._removeClass( "ui-controlgroup-" + this.options.direction );
- }
-
- this._super( key, value );
- if ( key === "disabled" ) {
- this._callChildMethod( value ? "disable" : "enable" );
- return;
- }
-
- this.refresh();
- },
-
- refresh: function() {
- var children,
- that = this;
-
- this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
-
- if ( this.options.direction === "horizontal" ) {
- this._addClass( null, "ui-helper-clearfix" );
- }
- this._initWidgets();
-
- children = this.childWidgets;
-
- // We filter here because we need to track all childWidgets not just the visible ones
- if ( this.options.onlyVisible ) {
- children = children.filter( ":visible" );
- }
-
- if ( children.length ) {
-
- // We do this last because we need to make sure all enhancment is done
- // before determining first and last
- $.each( [ "first", "last" ], function( index, value ) {
- var instance = children[ value ]().data( "ui-controlgroup-data" );
-
- if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
- var options = that[ "_" + instance.widgetName + "Options" ](
- children.length === 1 ? "only" : value
- );
- options.classes = that._resolveClassesValues( options.classes, instance );
- instance.element[ instance.widgetName ]( options );
- } else {
- that._updateCornerClass( children[ value ](), value );
- }
- } );
-
- // Finally call the refresh method on each of the child widgets.
- this._callChildMethod( "refresh" );
- }
- }
-} );
-
-/*!
- * jQuery UI Checkboxradio 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Checkboxradio
-//>>group: Widgets
-//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
-//>>docs: http://api.jqueryui.com/checkboxradio/
-//>>demos: http://jqueryui.com/checkboxradio/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/button.css
-//>>css.structure: ../../themes/base/checkboxradio.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
- version: "1.13.1",
- options: {
- disabled: null,
- label: null,
- icon: true,
- classes: {
- "ui-checkboxradio-label": "ui-corner-all",
- "ui-checkboxradio-icon": "ui-corner-all"
- }
- },
-
- _getCreateOptions: function() {
- var disabled, labels;
- var that = this;
- var options = this._super() || {};
-
- // We read the type here, because it makes more sense to throw a element type error first,
- // rather then the error for lack of a label. Often if its the wrong type, it
- // won't have a label (e.g. calling on a div, btn, etc)
- this._readType();
-
- labels = this.element.labels();
-
- // If there are multiple labels, use the last one
- this.label = $( labels[ labels.length - 1 ] );
- if ( !this.label.length ) {
- $.error( "No label found for checkboxradio widget" );
- }
-
- this.originalLabel = "";
-
- // We need to get the label text but this may also need to make sure it does not contain the
- // input itself.
- this.label.contents().not( this.element[ 0 ] ).each( function() {
-
- // The label contents could be text, html, or a mix. We concat each element to get a
- // string representation of the label, without the input as part of it.
- that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
- } );
-
- // Set the label option if we found label text
- if ( this.originalLabel ) {
- options.label = this.originalLabel;
- }
-
- disabled = this.element[ 0 ].disabled;
- if ( disabled != null ) {
- options.disabled = disabled;
- }
- return options;
- },
-
- _create: function() {
- var checked = this.element[ 0 ].checked;
-
- this._bindFormResetHandler();
-
- if ( this.options.disabled == null ) {
- this.options.disabled = this.element[ 0 ].disabled;
- }
-
- this._setOption( "disabled", this.options.disabled );
- this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
- this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
-
- if ( this.type === "radio" ) {
- this._addClass( this.label, "ui-checkboxradio-radio-label" );
- }
-
- if ( this.options.label && this.options.label !== this.originalLabel ) {
- this._updateLabel();
- } else if ( this.originalLabel ) {
- this.options.label = this.originalLabel;
- }
-
- this._enhance();
-
- if ( checked ) {
- this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
- }
-
- this._on( {
- change: "_toggleClasses",
- focus: function() {
- this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
- },
- blur: function() {
- this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
- }
- } );
- },
-
- _readType: function() {
- var nodeName = this.element[ 0 ].nodeName.toLowerCase();
- this.type = this.element[ 0 ].type;
- if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
- $.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
- " and element.type=" + this.type );
- }
- },
-
- // Support jQuery Mobile enhanced option
- _enhance: function() {
- this._updateIcon( this.element[ 0 ].checked );
- },
-
- widget: function() {
- return this.label;
- },
-
- _getRadioGroup: function() {
- var group;
- var name = this.element[ 0 ].name;
- var nameSelector = "input[name='" + $.escapeSelector( name ) + "']";
-
- if ( !name ) {
- return $( [] );
- }
-
- if ( this.form.length ) {
- group = $( this.form[ 0 ].elements ).filter( nameSelector );
- } else {
-
- // Not inside a form, check all inputs that also are not inside a form
- group = $( nameSelector ).filter( function() {
- return $( this )._form().length === 0;
- } );
- }
-
- return group.not( this.element );
- },
-
- _toggleClasses: function() {
- var checked = this.element[ 0 ].checked;
- this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
-
- if ( this.options.icon && this.type === "checkbox" ) {
- this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
- ._toggleClass( this.icon, null, "ui-icon-blank", !checked );
- }
-
- if ( this.type === "radio" ) {
- this._getRadioGroup()
- .each( function() {
- var instance = $( this ).checkboxradio( "instance" );
-
- if ( instance ) {
- instance._removeClass( instance.label,
- "ui-checkboxradio-checked", "ui-state-active" );
- }
- } );
- }
- },
-
- _destroy: function() {
- this._unbindFormResetHandler();
-
- if ( this.icon ) {
- this.icon.remove();
- this.iconSpace.remove();
- }
- },
-
- _setOption: function( key, value ) {
-
- // We don't allow the value to be set to nothing
- if ( key === "label" && !value ) {
- return;
- }
-
- this._super( key, value );
-
- if ( key === "disabled" ) {
- this._toggleClass( this.label, null, "ui-state-disabled", value );
- this.element[ 0 ].disabled = value;
-
- // Don't refresh when setting disabled
- return;
- }
- this.refresh();
- },
-
- _updateIcon: function( checked ) {
- var toAdd = "ui-icon ui-icon-background ";
-
- if ( this.options.icon ) {
- if ( !this.icon ) {
- this.icon = $( "<span>" );
- this.iconSpace = $( "<span> </span>" );
- this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
- }
-
- if ( this.type === "checkbox" ) {
- toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
- this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
- } else {
- toAdd += "ui-icon-blank";
- }
- this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
- if ( !checked ) {
- this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
- }
- this.icon.prependTo( this.label ).after( this.iconSpace );
- } else if ( this.icon !== undefined ) {
- this.icon.remove();
- this.iconSpace.remove();
- delete this.icon;
- }
- },
-
- _updateLabel: function() {
-
- // Remove the contents of the label ( minus the icon, icon space, and input )
- var contents = this.label.contents().not( this.element[ 0 ] );
- if ( this.icon ) {
- contents = contents.not( this.icon[ 0 ] );
- }
- if ( this.iconSpace ) {
- contents = contents.not( this.iconSpace[ 0 ] );
- }
- contents.remove();
-
- this.label.append( this.options.label );
- },
-
- refresh: function() {
- var checked = this.element[ 0 ].checked,
- isDisabled = this.element[ 0 ].disabled;
-
- this._updateIcon( checked );
- this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
- if ( this.options.label !== null ) {
- this._updateLabel();
- }
-
- if ( isDisabled !== this.options.disabled ) {
- this._setOptions( { "disabled": isDisabled } );
- }
- }
-
-} ] );
-
-var widgetsCheckboxradio = $.ui.checkboxradio;
-
-
-/*!
- * jQuery UI Button 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Button
-//>>group: Widgets
-//>>description: Enhances a form with themeable buttons.
-//>>docs: http://api.jqueryui.com/button/
-//>>demos: http://jqueryui.com/button/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/button.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.button", {
- version: "1.13.1",
- defaultElement: "<button>",
- options: {
- classes: {
- "ui-button": "ui-corner-all"
- },
- disabled: null,
- icon: null,
- iconPosition: "beginning",
- label: null,
- showLabel: true
- },
-
- _getCreateOptions: function() {
- var disabled,
-
- // This is to support cases like in jQuery Mobile where the base widget does have
- // an implementation of _getCreateOptions
- options = this._super() || {};
-
- this.isInput = this.element.is( "input" );
-
- disabled = this.element[ 0 ].disabled;
- if ( disabled != null ) {
- options.disabled = disabled;
- }
-
- this.originalLabel = this.isInput ? this.element.val() : this.element.html();
- if ( this.originalLabel ) {
- options.label = this.originalLabel;
- }
-
- return options;
- },
-
- _create: function() {
- if ( !this.option.showLabel & !this.options.icon ) {
- this.options.showLabel = true;
- }
-
- // We have to check the option again here even though we did in _getCreateOptions,
- // because null may have been passed on init which would override what was set in
- // _getCreateOptions
- if ( this.options.disabled == null ) {
- this.options.disabled = this.element[ 0 ].disabled || false;
- }
-
- this.hasTitle = !!this.element.attr( "title" );
-
- // Check to see if the label needs to be set or if its already correct
- if ( this.options.label && this.options.label !== this.originalLabel ) {
- if ( this.isInput ) {
- this.element.val( this.options.label );
- } else {
- this.element.html( this.options.label );
- }
- }
- this._addClass( "ui-button", "ui-widget" );
- this._setOption( "disabled", this.options.disabled );
- this._enhance();
-
- if ( this.element.is( "a" ) ) {
- this._on( {
- "keyup": function( event ) {
- if ( event.keyCode === $.ui.keyCode.SPACE ) {
- event.preventDefault();
-
- // Support: PhantomJS <= 1.9, IE 8 Only
- // If a native click is available use it so we actually cause navigation
- // otherwise just trigger a click event
- if ( this.element[ 0 ].click ) {
- this.element[ 0 ].click();
- } else {
- this.element.trigger( "click" );
- }
- }
- }
- } );
- }
- },
-
- _enhance: function() {
- if ( !this.element.is( "button" ) ) {
- this.element.attr( "role", "button" );
- }
-
- if ( this.options.icon ) {
- this._updateIcon( "icon", this.options.icon );
- this._updateTooltip();
- }
- },
-
- _updateTooltip: function() {
- this.title = this.element.attr( "title" );
-
- if ( !this.options.showLabel && !this.title ) {
- this.element.attr( "title", this.options.label );
- }
- },
-
- _updateIcon: function( option, value ) {
- var icon = option !== "iconPosition",
- position = icon ? this.options.iconPosition : value,
- displayBlock = position === "top" || position === "bottom";
-
- // Create icon
- if ( !this.icon ) {
- this.icon = $( "<span>" );
-
- this._addClass( this.icon, "ui-button-icon", "ui-icon" );
-
- if ( !this.options.showLabel ) {
- this._addClass( "ui-button-icon-only" );
- }
- } else if ( icon ) {
-
- // If we are updating the icon remove the old icon class
- this._removeClass( this.icon, null, this.options.icon );
- }
-
- // If we are updating the icon add the new icon class
- if ( icon ) {
- this._addClass( this.icon, null, value );
- }
-
- this._attachIcon( position );
-
- // If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
- // the iconSpace if there is one.
- if ( displayBlock ) {
- this._addClass( this.icon, null, "ui-widget-icon-block" );
- if ( this.iconSpace ) {
- this.iconSpace.remove();
- }
- } else {
-
- // Position is beginning or end so remove the ui-widget-icon-block class and add the
- // space if it does not exist
- if ( !this.iconSpace ) {
- this.iconSpace = $( "<span> </span>" );
- this._addClass( this.iconSpace, "ui-button-icon-space" );
- }
- this._removeClass( this.icon, null, "ui-wiget-icon-block" );
- this._attachIconSpace( position );
- }
- },
-
- _destroy: function() {
- this.element.removeAttr( "role" );
-
- if ( this.icon ) {
- this.icon.remove();
- }
- if ( this.iconSpace ) {
- this.iconSpace.remove();
- }
- if ( !this.hasTitle ) {
- this.element.removeAttr( "title" );
- }
- },
-
- _attachIconSpace: function( iconPosition ) {
- this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
- },
-
- _attachIcon: function( iconPosition ) {
- this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
- },
-
- _setOptions: function( options ) {
- var newShowLabel = options.showLabel === undefined ?
- this.options.showLabel :
- options.showLabel,
- newIcon = options.icon === undefined ? this.options.icon : options.icon;
-
- if ( !newShowLabel && !newIcon ) {
- options.showLabel = true;
- }
- this._super( options );
- },
-
- _setOption: function( key, value ) {
- if ( key === "icon" ) {
- if ( value ) {
- this._updateIcon( key, value );
- } else if ( this.icon ) {
- this.icon.remove();
- if ( this.iconSpace ) {
- this.iconSpace.remove();
- }
- }
- }
-
- if ( key === "iconPosition" ) {
- this._updateIcon( key, value );
- }
-
- // Make sure we can't end up with a button that has neither text nor icon
- if ( key === "showLabel" ) {
- this._toggleClass( "ui-button-icon-only", null, !value );
- this._updateTooltip();
- }
-
- if ( key === "label" ) {
- if ( this.isInput ) {
- this.element.val( value );
- } else {
-
- // If there is an icon, append it, else nothing then append the value
- // this avoids removal of the icon when setting label text
- this.element.html( value );
- if ( this.icon ) {
- this._attachIcon( this.options.iconPosition );
- this._attachIconSpace( this.options.iconPosition );
- }
- }
- }
-
- this._super( key, value );
-
- if ( key === "disabled" ) {
- this._toggleClass( null, "ui-state-disabled", value );
- this.element[ 0 ].disabled = value;
- if ( value ) {
- this.element.trigger( "blur" );
- }
- }
- },
-
- refresh: function() {
-
- // Make sure to only check disabled if its an element that supports this otherwise
- // check for the disabled class to determine state
- var isDisabled = this.element.is( "input, button" ) ?
- this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
-
- if ( isDisabled !== this.options.disabled ) {
- this._setOptions( { disabled: isDisabled } );
- }
-
- this._updateTooltip();
- }
-} );
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-
- // Text and Icons options
- $.widget( "ui.button", $.ui.button, {
- options: {
- text: true,
- icons: {
- primary: null,
- secondary: null
- }
- },
-
- _create: function() {
- if ( this.options.showLabel && !this.options.text ) {
- this.options.showLabel = this.options.text;
- }
- if ( !this.options.showLabel && this.options.text ) {
- this.options.text = this.options.showLabel;
- }
- if ( !this.options.icon && ( this.options.icons.primary ||
- this.options.icons.secondary ) ) {
- if ( this.options.icons.primary ) {
- this.options.icon = this.options.icons.primary;
- } else {
- this.options.icon = this.options.icons.secondary;
- this.options.iconPosition = "end";
- }
- } else if ( this.options.icon ) {
- this.options.icons.primary = this.options.icon;
- }
- this._super();
- },
-
- _setOption: function( key, value ) {
- if ( key === "text" ) {
- this._super( "showLabel", value );
- return;
- }
- if ( key === "showLabel" ) {
- this.options.text = value;
- }
- if ( key === "icon" ) {
- this.options.icons.primary = value;
- }
- if ( key === "icons" ) {
- if ( value.primary ) {
- this._super( "icon", value.primary );
- this._super( "iconPosition", "beginning" );
- } else if ( value.secondary ) {
- this._super( "icon", value.secondary );
- this._super( "iconPosition", "end" );
- }
- }
- this._superApply( arguments );
- }
- } );
-
- $.fn.button = ( function( orig ) {
- return function( options ) {
- var isMethodCall = typeof options === "string";
- var args = Array.prototype.slice.call( arguments, 1 );
- var returnValue = this;
-
- if ( isMethodCall ) {
-
- // If this is an empty collection, we need to have the instance method
- // return undefined instead of the jQuery instance
- if ( !this.length && options === "instance" ) {
- returnValue = undefined;
- } else {
- this.each( function() {
- var methodValue;
- var type = $( this ).attr( "type" );
- var name = type !== "checkbox" && type !== "radio" ?
- "button" :
- "checkboxradio";
- var instance = $.data( this, "ui-" + name );
-
- if ( options === "instance" ) {
- returnValue = instance;
- return false;
- }
-
- if ( !instance ) {
- return $.error( "cannot call methods on button" +
- " prior to initialization; " +
- "attempted to call method '" + options + "'" );
- }
-
- if ( typeof instance[ options ] !== "function" ||
- options.charAt( 0 ) === "_" ) {
- return $.error( "no such method '" + options + "' for button" +
- " widget instance" );
- }
-
- methodValue = instance[ options ].apply( instance, args );
-
- if ( methodValue !== instance && methodValue !== undefined ) {
- returnValue = methodValue && methodValue.jquery ?
- returnValue.pushStack( methodValue.get() ) :
- methodValue;
- return false;
- }
- } );
- }
- } else {
-
- // Allow multiple hashes to be passed on init
- if ( args.length ) {
- options = $.widget.extend.apply( null, [ options ].concat( args ) );
- }
-
- this.each( function() {
- var type = $( this ).attr( "type" );
- var name = type !== "checkbox" && type !== "radio" ? "button" : "checkboxradio";
- var instance = $.data( this, "ui-" + name );
-
- if ( instance ) {
- instance.option( options || {} );
- if ( instance._init ) {
- instance._init();
- }
- } else {
- if ( name === "button" ) {
- orig.call( $( this ), options );
- return;
- }
-
- $( this ).checkboxradio( $.extend( { icon: false }, options ) );
- }
- } );
- }
-
- return returnValue;
- };
- } )( $.fn.button );
-
- $.fn.buttonset = function() {
- if ( !$.ui.controlgroup ) {
- $.error( "Controlgroup widget missing" );
- }
- if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
- return this.controlgroup.apply( this,
- [ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
- }
- if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
- return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
- }
- if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
- arguments[ 0 ].items = {
- button: arguments[ 0 ].items
- };
- }
- return this.controlgroup.apply( this, arguments );
- };
-}
-
-var widgetsButton = $.ui.button;
-
-
-/* eslint-disable max-len, camelcase */
-/*!
- * jQuery UI Datepicker 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Datepicker
-//>>group: Widgets
-//>>description: Displays a calendar from an input or inline for selecting dates.
-//>>docs: http://api.jqueryui.com/datepicker/
-//>>demos: http://jqueryui.com/datepicker/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/datepicker.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.extend( $.ui, { datepicker: { version: "1.13.1" } } );
-
-var datepicker_instActive;
-
-function datepicker_getZindex( elem ) {
- var position, value;
- while ( elem.length && elem[ 0 ] !== document ) {
-
- // Ignore z-index if position is set to a value where z-index is ignored by the browser
- // This makes behavior of this function consistent across browsers
- // WebKit always returns auto if the element is positioned
- position = elem.css( "position" );
- if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-
- // IE returns 0 when zIndex is not specified
- // other browsers return a string
- // we ignore the case of nested elements with an explicit value of 0
- // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
- value = parseInt( elem.css( "zIndex" ), 10 );
- if ( !isNaN( value ) && value !== 0 ) {
- return value;
- }
- }
- elem = elem.parent();
- }
-
- return 0;
-}
-
-/* Date picker manager.
- Use the singleton instance of this class, $.datepicker, to interact with the date picker.
- Settings for (groups of) date pickers are maintained in an instance object,
- allowing multiple different settings on the same page. */
-
-function Datepicker() {
- this._curInst = null; // The current instance in use
- this._keyEvent = false; // If the last event was a key event
- this._disabledInputs = []; // List of date picker inputs that have been disabled
- this._datepickerShowing = false; // True if the popup picker is showing , false if not
- this._inDialog = false; // True if showing within a "dialog", false if not
- this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
- this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
- this._appendClass = "ui-datepicker-append"; // The name of the append marker class
- this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
- this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
- this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
- this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
- this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
- this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
- this.regional = []; // Available regional settings, indexed by language code
- this.regional[ "" ] = { // Default regional settings
- closeText: "Done", // Display text for close link
- prevText: "Prev", // Display text for previous month link
- nextText: "Next", // Display text for next month link
- currentText: "Today", // Display text for current month link
- monthNames: [ "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December" ], // Names of months for drop-down and formatting
- monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
- dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
- dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
- dayNamesMin: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ], // Column headings for days starting at Sunday
- weekHeader: "Wk", // Column header for week of the year
- dateFormat: "mm/dd/yy", // See format options on parseDate
- firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
- isRTL: false, // True if right-to-left language, false if left-to-right
- showMonthAfterYear: false, // True if the year select precedes month, false for month then year
- yearSuffix: "", // Additional text to append to the year in the month headers,
- selectMonthLabel: "Select month", // Invisible label for month selector
- selectYearLabel: "Select year" // Invisible label for year selector
- };
- this._defaults = { // Global defaults for all the date picker instances
- showOn: "focus", // "focus" for popup on focus,
- // "button" for trigger button, or "both" for either
- showAnim: "fadeIn", // Name of jQuery animation for popup
- showOptions: {}, // Options for enhanced animations
- defaultDate: null, // Used when field is blank: actual date,
- // +/-number for offset from today, null for today
- appendText: "", // Display text following the input box, e.g. showing the format
- buttonText: "...", // Text for trigger button
- buttonImage: "", // URL for trigger button image
- buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
- hideIfNoPrevNext: false, // True to hide next/previous month links
- // if not applicable, false to just disable them
- navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
- gotoCurrent: false, // True if today link goes back to current selection instead
- changeMonth: false, // True if month can be selected directly, false if only prev/next
- changeYear: false, // True if year can be selected directly, false if only prev/next
- yearRange: "c-10:c+10", // Range of years to display in drop-down,
- // either relative to today's year (-nn:+nn), relative to currently displayed year
- // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
- showOtherMonths: false, // True to show dates in other months, false to leave blank
- selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
- showWeek: false, // True to show week of the year, false to not show it
- calculateWeek: this.iso8601Week, // How to calculate the week of the year,
- // takes a Date and returns the number of the week for it
- shortYearCutoff: "+10", // Short year values < this are in the current century,
- // > this are in the previous century,
- // string value starting with "+" for current year + value
- minDate: null, // The earliest selectable date, or null for no limit
- maxDate: null, // The latest selectable date, or null for no limit
- duration: "fast", // Duration of display/closure
- beforeShowDay: null, // Function that takes a date and returns an array with
- // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
- // [2] = cell title (optional), e.g. $.datepicker.noWeekends
- beforeShow: null, // Function that takes an input field and
- // returns a set of custom settings for the date picker
- onSelect: null, // Define a callback function when a date is selected
- onChangeMonthYear: null, // Define a callback function when the month or year is changed
- onClose: null, // Define a callback function when the datepicker is closed
- onUpdateDatepicker: null, // Define a callback function when the datepicker is updated
- numberOfMonths: 1, // Number of months to show at a time
- showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
- stepMonths: 1, // Number of months to step back/forward
- stepBigMonths: 12, // Number of months to step back/forward for the big links
- altField: "", // Selector for an alternate field to store selected dates into
- altFormat: "", // The date format to use for the alternate field
- constrainInput: true, // The input is constrained by the current date format
- showButtonPanel: false, // True to show button panel, false to not show it
- autoSize: false, // True to size the input for the date format, false to leave as is
- disabled: false // The initial disabled state
- };
- $.extend( this._defaults, this.regional[ "" ] );
- this.regional.en = $.extend( true, {}, this.regional[ "" ] );
- this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
- this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
-}
-
-$.extend( Datepicker.prototype, {
-
- /* Class name added to elements to indicate already configured with a date picker. */
- markerClassName: "hasDatepicker",
-
- //Keep track of the maximum number of rows displayed (see #7043)
- maxRows: 4,
-
- // TODO rename to "widget" when switching to widget factory
- _widgetDatepicker: function() {
- return this.dpDiv;
- },
-
- /* Override the default settings for all instances of the date picker.
- * @param settings object - the new settings to use as defaults (anonymous object)
- * @return the manager object
- */
- setDefaults: function( settings ) {
- datepicker_extendRemove( this._defaults, settings || {} );
- return this;
- },
-
- /* Attach the date picker to a jQuery selection.
- * @param target element - the target input field or division or span
- * @param settings object - the new settings to use for this date picker instance (anonymous)
- */
- _attachDatepicker: function( target, settings ) {
- var nodeName, inline, inst;
- nodeName = target.nodeName.toLowerCase();
- inline = ( nodeName === "div" || nodeName === "span" );
- if ( !target.id ) {
- this.uuid += 1;
- target.id = "dp" + this.uuid;
- }
- inst = this._newInst( $( target ), inline );
- inst.settings = $.extend( {}, settings || {} );
- if ( nodeName === "input" ) {
- this._connectDatepicker( target, inst );
- } else if ( inline ) {
- this._inlineDatepicker( target, inst );
- }
- },
-
- /* Create a new instance object. */
- _newInst: function( target, inline ) {
- var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
- return { id: id, input: target, // associated target
- selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
- drawMonth: 0, drawYear: 0, // month being drawn
- inline: inline, // is datepicker inline or not
- dpDiv: ( !inline ? this.dpDiv : // presentation div
- datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
- },
-
- /* Attach the date picker to an input field. */
- _connectDatepicker: function( target, inst ) {
- var input = $( target );
- inst.append = $( [] );
- inst.trigger = $( [] );
- if ( input.hasClass( this.markerClassName ) ) {
- return;
- }
- this._attachments( input, inst );
- input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
- on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
- this._autoSize( inst );
- $.data( target, "datepicker", inst );
-
- //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
- if ( inst.settings.disabled ) {
- this._disableDatepicker( target );
- }
- },
-
- /* Make attachments based on settings. */
- _attachments: function( input, inst ) {
- var showOn, buttonText, buttonImage,
- appendText = this._get( inst, "appendText" ),
- isRTL = this._get( inst, "isRTL" );
-
- if ( inst.append ) {
- inst.append.remove();
- }
- if ( appendText ) {
- inst.append = $( "<span>" )
- .addClass( this._appendClass )
- .text( appendText );
- input[ isRTL ? "before" : "after" ]( inst.append );
- }
-
- input.off( "focus", this._showDatepicker );
-
- if ( inst.trigger ) {
- inst.trigger.remove();
- }
-
- showOn = this._get( inst, "showOn" );
- if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
- input.on( "focus", this._showDatepicker );
- }
- if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
- buttonText = this._get( inst, "buttonText" );
- buttonImage = this._get( inst, "buttonImage" );
-
- if ( this._get( inst, "buttonImageOnly" ) ) {
- inst.trigger = $( "<img>" )
- .addClass( this._triggerClass )
- .attr( {
- src: buttonImage,
- alt: buttonText,
- title: buttonText
- } );
- } else {
- inst.trigger = $( "<button type='button'>" )
- .addClass( this._triggerClass );
- if ( buttonImage ) {
- inst.trigger.html(
- $( "<img>" )
- .attr( {
- src: buttonImage,
- alt: buttonText,
- title: buttonText
- } )
- );
- } else {
- inst.trigger.text( buttonText );
- }
- }
-
- input[ isRTL ? "before" : "after" ]( inst.trigger );
- inst.trigger.on( "click", function() {
- if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
- $.datepicker._hideDatepicker();
- } else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
- $.datepicker._hideDatepicker();
- $.datepicker._showDatepicker( input[ 0 ] );
- } else {
- $.datepicker._showDatepicker( input[ 0 ] );
- }
- return false;
- } );
- }
- },
-
- /* Apply the maximum length for the date format. */
- _autoSize: function( inst ) {
- if ( this._get( inst, "autoSize" ) && !inst.inline ) {
- var findMax, max, maxI, i,
- date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
- dateFormat = this._get( inst, "dateFormat" );
-
- if ( dateFormat.match( /[DM]/ ) ) {
- findMax = function( names ) {
- max = 0;
- maxI = 0;
- for ( i = 0; i < names.length; i++ ) {
- if ( names[ i ].length > max ) {
- max = names[ i ].length;
- maxI = i;
- }
- }
- return maxI;
- };
- date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
- "monthNames" : "monthNamesShort" ) ) ) );
- date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
- "dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
- }
- inst.input.attr( "size", this._formatDate( inst, date ).length );
- }
- },
-
- /* Attach an inline date picker to a div. */
- _inlineDatepicker: function( target, inst ) {
- var divSpan = $( target );
- if ( divSpan.hasClass( this.markerClassName ) ) {
- return;
- }
- divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
- $.data( target, "datepicker", inst );
- this._setDate( inst, this._getDefaultDate( inst ), true );
- this._updateDatepicker( inst );
- this._updateAlternate( inst );
-
- //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
- if ( inst.settings.disabled ) {
- this._disableDatepicker( target );
- }
-
- // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
- // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
- inst.dpDiv.css( "display", "block" );
- },
-
- /* Pop-up the date picker in a "dialog" box.
- * @param input element - ignored
- * @param date string or Date - the initial date to display
- * @param onSelect function - the function to call when a date is selected
- * @param settings object - update the dialog date picker instance's settings (anonymous object)
- * @param pos int[2] - coordinates for the dialog's position within the screen or
- * event - with x/y coordinates or
- * leave empty for default (screen centre)
- * @return the manager object
- */
- _dialogDatepicker: function( input, date, onSelect, settings, pos ) {
- var id, browserWidth, browserHeight, scrollX, scrollY,
- inst = this._dialogInst; // internal instance
-
- if ( !inst ) {
- this.uuid += 1;
- id = "dp" + this.uuid;
- this._dialogInput = $( "<input type='text' id='" + id +
- "' style='position: absolute; top: -100px; width: 0px;'/>" );
- this._dialogInput.on( "keydown", this._doKeyDown );
- $( "body" ).append( this._dialogInput );
- inst = this._dialogInst = this._newInst( this._dialogInput, false );
- inst.settings = {};
- $.data( this._dialogInput[ 0 ], "datepicker", inst );
- }
- datepicker_extendRemove( inst.settings, settings || {} );
- date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
- this._dialogInput.val( date );
-
- this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
- if ( !this._pos ) {
- browserWidth = document.documentElement.clientWidth;
- browserHeight = document.documentElement.clientHeight;
- scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
- scrollY = document.documentElement.scrollTop || document.body.scrollTop;
- this._pos = // should use actual width/height below
- [ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
- }
-
- // Move input on screen for focus, but hidden behind dialog
- this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
- inst.settings.onSelect = onSelect;
- this._inDialog = true;
- this.dpDiv.addClass( this._dialogClass );
- this._showDatepicker( this._dialogInput[ 0 ] );
- if ( $.blockUI ) {
- $.blockUI( this.dpDiv );
- }
- $.data( this._dialogInput[ 0 ], "datepicker", inst );
- return this;
- },
-
- /* Detach a datepicker from its control.
- * @param target element - the target input field or division or span
- */
- _destroyDatepicker: function( target ) {
- var nodeName,
- $target = $( target ),
- inst = $.data( target, "datepicker" );
-
- if ( !$target.hasClass( this.markerClassName ) ) {
- return;
- }
-
- nodeName = target.nodeName.toLowerCase();
- $.removeData( target, "datepicker" );
- if ( nodeName === "input" ) {
- inst.append.remove();
- inst.trigger.remove();
- $target.removeClass( this.markerClassName ).
- off( "focus", this._showDatepicker ).
- off( "keydown", this._doKeyDown ).
- off( "keypress", this._doKeyPress ).
- off( "keyup", this._doKeyUp );
- } else if ( nodeName === "div" || nodeName === "span" ) {
- $target.removeClass( this.markerClassName ).empty();
- }
-
- if ( datepicker_instActive === inst ) {
- datepicker_instActive = null;
- this._curInst = null;
- }
- },
-
- /* Enable the date picker to a jQuery selection.
- * @param target element - the target input field or division or span
- */
- _enableDatepicker: function( target ) {
- var nodeName, inline,
- $target = $( target ),
- inst = $.data( target, "datepicker" );
-
- if ( !$target.hasClass( this.markerClassName ) ) {
- return;
- }
-
- nodeName = target.nodeName.toLowerCase();
- if ( nodeName === "input" ) {
- target.disabled = false;
- inst.trigger.filter( "button" ).
- each( function() {
- this.disabled = false;
- } ).end().
- filter( "img" ).css( { opacity: "1.0", cursor: "" } );
- } else if ( nodeName === "div" || nodeName === "span" ) {
- inline = $target.children( "." + this._inlineClass );
- inline.children().removeClass( "ui-state-disabled" );
- inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
- prop( "disabled", false );
- }
- this._disabledInputs = $.map( this._disabledInputs,
-
- // Delete entry
- function( value ) {
- return ( value === target ? null : value );
- } );
- },
-
- /* Disable the date picker to a jQuery selection.
- * @param target element - the target input field or division or span
- */
- _disableDatepicker: function( target ) {
- var nodeName, inline,
- $target = $( target ),
- inst = $.data( target, "datepicker" );
-
- if ( !$target.hasClass( this.markerClassName ) ) {
- return;
- }
-
- nodeName = target.nodeName.toLowerCase();
- if ( nodeName === "input" ) {
- target.disabled = true;
- inst.trigger.filter( "button" ).
- each( function() {
- this.disabled = true;
- } ).end().
- filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
- } else if ( nodeName === "div" || nodeName === "span" ) {
- inline = $target.children( "." + this._inlineClass );
- inline.children().addClass( "ui-state-disabled" );
- inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
- prop( "disabled", true );
- }
- this._disabledInputs = $.map( this._disabledInputs,
-
- // Delete entry
- function( value ) {
- return ( value === target ? null : value );
- } );
- this._disabledInputs[ this._disabledInputs.length ] = target;
- },
-
- /* Is the first field in a jQuery collection disabled as a datepicker?
- * @param target element - the target input field or division or span
- * @return boolean - true if disabled, false if enabled
- */
- _isDisabledDatepicker: function( target ) {
- if ( !target ) {
- return false;
- }
- for ( var i = 0; i < this._disabledInputs.length; i++ ) {
- if ( this._disabledInputs[ i ] === target ) {
- return true;
- }
- }
- return false;
- },
-
- /* Retrieve the instance data for the target control.
- * @param target element - the target input field or division or span
- * @return object - the associated instance data
- * @throws error if a jQuery problem getting data
- */
- _getInst: function( target ) {
- try {
- return $.data( target, "datepicker" );
- } catch ( err ) {
- throw "Missing instance data for this datepicker";
- }
- },
-
- /* Update or retrieve the settings for a date picker attached to an input field or division.
- * @param target element - the target input field or division or span
- * @param name object - the new settings to update or
- * string - the name of the setting to change or retrieve,
- * when retrieving also "all" for all instance settings or
- * "defaults" for all global defaults
- * @param value any - the new value for the setting
- * (omit if above is an object or to retrieve a value)
- */
- _optionDatepicker: function( target, name, value ) {
- var settings, date, minDate, maxDate,
- inst = this._getInst( target );
-
- if ( arguments.length === 2 && typeof name === "string" ) {
- return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
- ( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
- this._get( inst, name ) ) : null ) );
- }
-
- settings = name || {};
- if ( typeof name === "string" ) {
- settings = {};
- settings[ name ] = value;
- }
-
- if ( inst ) {
- if ( this._curInst === inst ) {
- this._hideDatepicker();
- }
-
- date = this._getDateDatepicker( target, true );
- minDate = this._getMinMaxDate( inst, "min" );
- maxDate = this._getMinMaxDate( inst, "max" );
- datepicker_extendRemove( inst.settings, settings );
-
- // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
- if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
- inst.settings.minDate = this._formatDate( inst, minDate );
- }
- if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
- inst.settings.maxDate = this._formatDate( inst, maxDate );
- }
- if ( "disabled" in settings ) {
- if ( settings.disabled ) {
- this._disableDatepicker( target );
- } else {
- this._enableDatepicker( target );
- }
- }
- this._attachments( $( target ), inst );
- this._autoSize( inst );
- this._setDate( inst, date );
- this._updateAlternate( inst );
- this._updateDatepicker( inst );
- }
- },
-
- // Change method deprecated
- _changeDatepicker: function( target, name, value ) {
- this._optionDatepicker( target, name, value );
- },
-
- /* Redraw the date picker attached to an input field or division.
- * @param target element - the target input field or division or span
- */
- _refreshDatepicker: function( target ) {
- var inst = this._getInst( target );
- if ( inst ) {
- this._updateDatepicker( inst );
- }
- },
-
- /* Set the dates for a jQuery selection.
- * @param target element - the target input field or division or span
- * @param date Date - the new date
- */
- _setDateDatepicker: function( target, date ) {
- var inst = this._getInst( target );
- if ( inst ) {
- this._setDate( inst, date );
- this._updateDatepicker( inst );
- this._updateAlternate( inst );
- }
- },
-
- /* Get the date(s) for the first entry in a jQuery selection.
- * @param target element - the target input field or division or span
- * @param noDefault boolean - true if no default date is to be used
- * @return Date - the current date
- */
- _getDateDatepicker: function( target, noDefault ) {
- var inst = this._getInst( target );
- if ( inst && !inst.inline ) {
- this._setDateFromField( inst, noDefault );
- }
- return ( inst ? this._getDate( inst ) : null );
- },
-
- /* Handle keystrokes. */
- _doKeyDown: function( event ) {
- var onSelect, dateStr, sel,
- inst = $.datepicker._getInst( event.target ),
- handled = true,
- isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
-
- inst._keyEvent = true;
- if ( $.datepicker._datepickerShowing ) {
- switch ( event.keyCode ) {
- case 9: $.datepicker._hideDatepicker();
- handled = false;
- break; // hide on tab out
- case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
- $.datepicker._currentClass + ")", inst.dpDiv );
- if ( sel[ 0 ] ) {
- $.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
- }
-
- onSelect = $.datepicker._get( inst, "onSelect" );
- if ( onSelect ) {
- dateStr = $.datepicker._formatDate( inst );
-
- // Trigger custom callback
- onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
- } else {
- $.datepicker._hideDatepicker();
- }
-
- return false; // don't submit the form
- case 27: $.datepicker._hideDatepicker();
- break; // hide on escape
- case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- -$.datepicker._get( inst, "stepBigMonths" ) :
- -$.datepicker._get( inst, "stepMonths" ) ), "M" );
- break; // previous month/year on page up/+ ctrl
- case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- +$.datepicker._get( inst, "stepBigMonths" ) :
- +$.datepicker._get( inst, "stepMonths" ) ), "M" );
- break; // next month/year on page down/+ ctrl
- case 35: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._clearDate( event.target );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // clear on ctrl or command +end
- case 36: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._gotoToday( event.target );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // current on ctrl or command +home
- case 37: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
- }
- handled = event.ctrlKey || event.metaKey;
-
- // -1 day on ctrl or command +left
- if ( event.originalEvent.altKey ) {
- $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- -$.datepicker._get( inst, "stepBigMonths" ) :
- -$.datepicker._get( inst, "stepMonths" ) ), "M" );
- }
-
- // next month/year on alt +left on Mac
- break;
- case 38: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, -7, "D" );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // -1 week on ctrl or command +up
- case 39: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
- }
- handled = event.ctrlKey || event.metaKey;
-
- // +1 day on ctrl or command +right
- if ( event.originalEvent.altKey ) {
- $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- +$.datepicker._get( inst, "stepBigMonths" ) :
- +$.datepicker._get( inst, "stepMonths" ) ), "M" );
- }
-
- // next month/year on alt +right
- break;
- case 40: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, +7, "D" );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // +1 week on ctrl or command +down
- default: handled = false;
- }
- } else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
- $.datepicker._showDatepicker( this );
- } else {
- handled = false;
- }
-
- if ( handled ) {
- event.preventDefault();
- event.stopPropagation();
- }
- },
-
- /* Filter entered characters - based on date format. */
- _doKeyPress: function( event ) {
- var chars, chr,
- inst = $.datepicker._getInst( event.target );
-
- if ( $.datepicker._get( inst, "constrainInput" ) ) {
- chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
- chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
- return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
- }
- },
-
- /* Synchronise manual entry and field/alternate field. */
- _doKeyUp: function( event ) {
- var date,
- inst = $.datepicker._getInst( event.target );
-
- if ( inst.input.val() !== inst.lastVal ) {
- try {
- date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
- ( inst.input ? inst.input.val() : null ),
- $.datepicker._getFormatConfig( inst ) );
-
- if ( date ) { // only if valid
- $.datepicker._setDateFromField( inst );
- $.datepicker._updateAlternate( inst );
- $.datepicker._updateDatepicker( inst );
- }
- } catch ( err ) {
- }
- }
- return true;
- },
-
- /* Pop-up the date picker for a given input field.
- * If false returned from beforeShow event handler do not show.
- * @param input element - the input field attached to the date picker or
- * event - if triggered by focus
- */
- _showDatepicker: function( input ) {
- input = input.target || input;
- if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
- input = $( "input", input.parentNode )[ 0 ];
- }
-
- if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
- return;
- }
-
- var inst, beforeShow, beforeShowSettings, isFixed,
- offset, showAnim, duration;
-
- inst = $.datepicker._getInst( input );
- if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
- $.datepicker._curInst.dpDiv.stop( true, true );
- if ( inst && $.datepicker._datepickerShowing ) {
- $.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
- }
- }
-
- beforeShow = $.datepicker._get( inst, "beforeShow" );
- beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
- if ( beforeShowSettings === false ) {
- return;
- }
- datepicker_extendRemove( inst.settings, beforeShowSettings );
-
- inst.lastVal = null;
- $.datepicker._lastInput = input;
- $.datepicker._setDateFromField( inst );
-
- if ( $.datepicker._inDialog ) { // hide cursor
- input.value = "";
- }
- if ( !$.datepicker._pos ) { // position below input
- $.datepicker._pos = $.datepicker._findPos( input );
- $.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
- }
-
- isFixed = false;
- $( input ).parents().each( function() {
- isFixed |= $( this ).css( "position" ) === "fixed";
- return !isFixed;
- } );
-
- offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
- $.datepicker._pos = null;
-
- //to avoid flashes on Firefox
- inst.dpDiv.empty();
-
- // determine sizing offscreen
- inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
- $.datepicker._updateDatepicker( inst );
-
- // fix width for dynamic number of date pickers
- // and adjust position before showing
- offset = $.datepicker._checkOffset( inst, offset, isFixed );
- inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
- "static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
- left: offset.left + "px", top: offset.top + "px" } );
-
- if ( !inst.inline ) {
- showAnim = $.datepicker._get( inst, "showAnim" );
- duration = $.datepicker._get( inst, "duration" );
- inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
- $.datepicker._datepickerShowing = true;
-
- if ( $.effects && $.effects.effect[ showAnim ] ) {
- inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
- } else {
- inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
- }
-
- if ( $.datepicker._shouldFocusInput( inst ) ) {
- inst.input.trigger( "focus" );
- }
-
- $.datepicker._curInst = inst;
- }
- },
-
- /* Generate the date picker content. */
- _updateDatepicker: function( inst ) {
- this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
- datepicker_instActive = inst; // for delegate hover events
- inst.dpDiv.empty().append( this._generateHTML( inst ) );
- this._attachHandlers( inst );
-
- var origyearshtml,
- numMonths = this._getNumberOfMonths( inst ),
- cols = numMonths[ 1 ],
- width = 17,
- activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ),
- onUpdateDatepicker = $.datepicker._get( inst, "onUpdateDatepicker" );
-
- if ( activeCell.length > 0 ) {
- datepicker_handleMouseover.apply( activeCell.get( 0 ) );
- }
-
- inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
- if ( cols > 1 ) {
- inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
- }
- inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
- "Class" ]( "ui-datepicker-multi" );
- inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
- "Class" ]( "ui-datepicker-rtl" );
-
- if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
- inst.input.trigger( "focus" );
- }
-
- // Deffered render of the years select (to avoid flashes on Firefox)
- if ( inst.yearshtml ) {
- origyearshtml = inst.yearshtml;
- setTimeout( function() {
-
- //assure that inst.yearshtml didn't change.
- if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
- inst.dpDiv.find( "select.ui-datepicker-year" ).first().replaceWith( inst.yearshtml );
- }
- origyearshtml = inst.yearshtml = null;
- }, 0 );
- }
-
- if ( onUpdateDatepicker ) {
- onUpdateDatepicker.apply( ( inst.input ? inst.input[ 0 ] : null ), [ inst ] );
- }
- },
-
- // #6694 - don't focus the input if it's already focused
- // this breaks the change event in IE
- // Support: IE and jQuery <1.9
- _shouldFocusInput: function( inst ) {
- return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
- },
-
- /* Check positioning to remain on screen. */
- _checkOffset: function( inst, offset, isFixed ) {
- var dpWidth = inst.dpDiv.outerWidth(),
- dpHeight = inst.dpDiv.outerHeight(),
- inputWidth = inst.input ? inst.input.outerWidth() : 0,
- inputHeight = inst.input ? inst.input.outerHeight() : 0,
- viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
- viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
-
- offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
- offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
- offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
-
- // Now check if datepicker is showing outside window viewport - move to a better place if so.
- offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
- Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
- offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
- Math.abs( dpHeight + inputHeight ) : 0 );
-
- return offset;
- },
-
- /* Find an object's position on the screen. */
- _findPos: function( obj ) {
- var position,
- inst = this._getInst( obj ),
- isRTL = this._get( inst, "isRTL" );
-
- while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.pseudos.hidden( obj ) ) ) {
- obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
- }
-
- position = $( obj ).offset();
- return [ position.left, position.top ];
- },
-
- /* Hide the date picker from view.
- * @param input element - the input field attached to the date picker
- */
- _hideDatepicker: function( input ) {
- var showAnim, duration, postProcess, onClose,
- inst = this._curInst;
-
- if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
- return;
- }
-
- if ( this._datepickerShowing ) {
- showAnim = this._get( inst, "showAnim" );
- duration = this._get( inst, "duration" );
- postProcess = function() {
- $.datepicker._tidyDialog( inst );
- };
-
- // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
- if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
- inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
- } else {
- inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
- ( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
- }
-
- if ( !showAnim ) {
- postProcess();
- }
- this._datepickerShowing = false;
-
- onClose = this._get( inst, "onClose" );
- if ( onClose ) {
- onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
- }
-
- this._lastInput = null;
- if ( this._inDialog ) {
- this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
- if ( $.blockUI ) {
- $.unblockUI();
- $( "body" ).append( this.dpDiv );
- }
- }
- this._inDialog = false;
- }
- },
-
- /* Tidy up after a dialog display. */
- _tidyDialog: function( inst ) {
- inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
- },
-
- /* Close date picker if clicked elsewhere. */
- _checkExternalClick: function( event ) {
- if ( !$.datepicker._curInst ) {
- return;
- }
-
- var $target = $( event.target ),
- inst = $.datepicker._getInst( $target[ 0 ] );
-
- if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
- $target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
- !$target.hasClass( $.datepicker.markerClassName ) &&
- !$target.closest( "." + $.datepicker._triggerClass ).length &&
- $.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
- ( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
- $.datepicker._hideDatepicker();
- }
- },
-
- /* Adjust one of the date sub-fields. */
- _adjustDate: function( id, offset, period ) {
- var target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
- return;
- }
- this._adjustInstDate( inst, offset, period );
- this._updateDatepicker( inst );
- },
-
- /* Action for current link. */
- _gotoToday: function( id ) {
- var date,
- target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
- inst.selectedDay = inst.currentDay;
- inst.drawMonth = inst.selectedMonth = inst.currentMonth;
- inst.drawYear = inst.selectedYear = inst.currentYear;
- } else {
- date = new Date();
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- }
- this._notifyChange( inst );
- this._adjustDate( target );
- },
-
- /* Action for selecting a new month/year. */
- _selectMonthYear: function( id, select, period ) {
- var target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
- inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
- parseInt( select.options[ select.selectedIndex ].value, 10 );
-
- this._notifyChange( inst );
- this._adjustDate( target );
- },
-
- /* Action for selecting a day. */
- _selectDay: function( id, month, year, td ) {
- var inst,
- target = $( id );
-
- if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
- return;
- }
-
- inst = this._getInst( target[ 0 ] );
- inst.selectedDay = inst.currentDay = parseInt( $( "a", td ).attr( "data-date" ) );
- inst.selectedMonth = inst.currentMonth = month;
- inst.selectedYear = inst.currentYear = year;
- this._selectDate( id, this._formatDate( inst,
- inst.currentDay, inst.currentMonth, inst.currentYear ) );
- },
-
- /* Erase the input field and hide the date picker. */
- _clearDate: function( id ) {
- var target = $( id );
- this._selectDate( target, "" );
- },
-
- /* Update the input field with the selected date. */
- _selectDate: function( id, dateStr ) {
- var onSelect,
- target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
- if ( inst.input ) {
- inst.input.val( dateStr );
- }
- this._updateAlternate( inst );
-
- onSelect = this._get( inst, "onSelect" );
- if ( onSelect ) {
- onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] ); // trigger custom callback
- } else if ( inst.input ) {
- inst.input.trigger( "change" ); // fire the change event
- }
-
- if ( inst.inline ) {
- this._updateDatepicker( inst );
- } else {
- this._hideDatepicker();
- this._lastInput = inst.input[ 0 ];
- if ( typeof( inst.input[ 0 ] ) !== "object" ) {
- inst.input.trigger( "focus" ); // restore focus
- }
- this._lastInput = null;
- }
- },
-
- /* Update any alternate field to synchronise with the main field. */
- _updateAlternate: function( inst ) {
- var altFormat, date, dateStr,
- altField = this._get( inst, "altField" );
-
- if ( altField ) { // update alternate field too
- altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
- date = this._getDate( inst );
- dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
- $( document ).find( altField ).val( dateStr );
- }
- },
-
- /* Set as beforeShowDay function to prevent selection of weekends.
- * @param date Date - the date to customise
- * @return [boolean, string] - is this date selectable?, what is its CSS class?
- */
- noWeekends: function( date ) {
- var day = date.getDay();
- return [ ( day > 0 && day < 6 ), "" ];
- },
-
- /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
- * @param date Date - the date to get the week for
- * @return number - the number of the week within the year that contains this date
- */
- iso8601Week: function( date ) {
- var time,
- checkDate = new Date( date.getTime() );
-
- // Find Thursday of this week starting on Monday
- checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
-
- time = checkDate.getTime();
- checkDate.setMonth( 0 ); // Compare with Jan 1
- checkDate.setDate( 1 );
- return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
- },
-
- /* Parse a string value into a date object.
- * See formatDate below for the possible formats.
- *
- * @param format string - the expected format of the date
- * @param value string - the date in the above format
- * @param settings Object - attributes include:
- * shortYearCutoff number - the cutoff year for determining the century (optional)
- * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
- * dayNames string[7] - names of the days from Sunday (optional)
- * monthNamesShort string[12] - abbreviated names of the months (optional)
- * monthNames string[12] - names of the months (optional)
- * @return Date - the extracted date value or null if value is blank
- */
- parseDate: function( format, value, settings ) {
- if ( format == null || value == null ) {
- throw "Invalid arguments";
- }
-
- value = ( typeof value === "object" ? value.toString() : value + "" );
- if ( value === "" ) {
- return null;
- }
-
- var iFormat, dim, extra,
- iValue = 0,
- shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
- shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
- new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
- dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
- dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
- monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
- monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
- year = -1,
- month = -1,
- day = -1,
- doy = -1,
- literal = false,
- date,
-
- // Check whether a format character is doubled
- lookAhead = function( match ) {
- var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
- if ( matches ) {
- iFormat++;
- }
- return matches;
- },
-
- // Extract a number from the string value
- getNumber = function( match ) {
- var isDoubled = lookAhead( match ),
- size = ( match === "@" ? 14 : ( match === "!" ? 20 :
- ( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
- minSize = ( match === "y" ? size : 1 ),
- digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
- num = value.substring( iValue ).match( digits );
- if ( !num ) {
- throw "Missing number at position " + iValue;
- }
- iValue += num[ 0 ].length;
- return parseInt( num[ 0 ], 10 );
- },
-
- // Extract a name from the string value and convert to an index
- getName = function( match, shortNames, longNames ) {
- var index = -1,
- names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
- return [ [ k, v ] ];
- } ).sort( function( a, b ) {
- return -( a[ 1 ].length - b[ 1 ].length );
- } );
-
- $.each( names, function( i, pair ) {
- var name = pair[ 1 ];
- if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
- index = pair[ 0 ];
- iValue += name.length;
- return false;
- }
- } );
- if ( index !== -1 ) {
- return index + 1;
- } else {
- throw "Unknown name at position " + iValue;
- }
- },
-
- // Confirm that a literal character matches the string value
- checkLiteral = function() {
- if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
- throw "Unexpected literal at position " + iValue;
- }
- iValue++;
- };
-
- for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
- if ( literal ) {
- if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
- literal = false;
- } else {
- checkLiteral();
- }
- } else {
- switch ( format.charAt( iFormat ) ) {
- case "d":
- day = getNumber( "d" );
- break;
- case "D":
- getName( "D", dayNamesShort, dayNames );
- break;
- case "o":
- doy = getNumber( "o" );
- break;
- case "m":
- month = getNumber( "m" );
- break;
- case "M":
- month = getName( "M", monthNamesShort, monthNames );
- break;
- case "y":
- year = getNumber( "y" );
- break;
- case "@":
- date = new Date( getNumber( "@" ) );
- year = date.getFullYear();
- month = date.getMonth() + 1;
- day = date.getDate();
- break;
- case "!":
- date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
- year = date.getFullYear();
- month = date.getMonth() + 1;
- day = date.getDate();
- break;
- case "'":
- if ( lookAhead( "'" ) ) {
- checkLiteral();
- } else {
- literal = true;
- }
- break;
- default:
- checkLiteral();
- }
- }
- }
-
- if ( iValue < value.length ) {
- extra = value.substr( iValue );
- if ( !/^\s+/.test( extra ) ) {
- throw "Extra/unparsed characters found in date: " + extra;
- }
- }
-
- if ( year === -1 ) {
- year = new Date().getFullYear();
- } else if ( year < 100 ) {
- year += new Date().getFullYear() - new Date().getFullYear() % 100 +
- ( year <= shortYearCutoff ? 0 : -100 );
- }
-
- if ( doy > -1 ) {
- month = 1;
- day = doy;
- do {
- dim = this._getDaysInMonth( year, month - 1 );
- if ( day <= dim ) {
- break;
- }
- month++;
- day -= dim;
- } while ( true );
- }
-
- date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
- if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
- throw "Invalid date"; // E.g. 31/02/00
- }
- return date;
- },
-
- /* Standard date formats. */
- ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
- COOKIE: "D, dd M yy",
- ISO_8601: "yy-mm-dd",
- RFC_822: "D, d M y",
- RFC_850: "DD, dd-M-y",
- RFC_1036: "D, d M y",
- RFC_1123: "D, d M yy",
- RFC_2822: "D, d M yy",
- RSS: "D, d M y", // RFC 822
- TICKS: "!",
- TIMESTAMP: "@",
- W3C: "yy-mm-dd", // ISO 8601
-
- _ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
- Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
-
- /* Format a date object into a string value.
- * The format can be combinations of the following:
- * d - day of month (no leading zero)
- * dd - day of month (two digit)
- * o - day of year (no leading zeros)
- * oo - day of year (three digit)
- * D - day name short
- * DD - day name long
- * m - month of year (no leading zero)
- * mm - month of year (two digit)
- * M - month name short
- * MM - month name long
- * y - year (two digit)
- * yy - year (four digit)
- * @ - Unix timestamp (ms since 01/01/1970)
- * ! - Windows ticks (100ns since 01/01/0001)
- * "..." - literal text
- * '' - single quote
- *
- * @param format string - the desired format of the date
- * @param date Date - the date value to format
- * @param settings Object - attributes include:
- * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
- * dayNames string[7] - names of the days from Sunday (optional)
- * monthNamesShort string[12] - abbreviated names of the months (optional)
- * monthNames string[12] - names of the months (optional)
- * @return string - the date in the above format
- */
- formatDate: function( format, date, settings ) {
- if ( !date ) {
- return "";
- }
-
- var iFormat,
- dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
- dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
- monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
- monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
-
- // Check whether a format character is doubled
- lookAhead = function( match ) {
- var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
- if ( matches ) {
- iFormat++;
- }
- return matches;
- },
-
- // Format a number, with leading zero if necessary
- formatNumber = function( match, value, len ) {
- var num = "" + value;
- if ( lookAhead( match ) ) {
- while ( num.length < len ) {
- num = "0" + num;
- }
- }
- return num;
- },
-
- // Format a name, short or long as requested
- formatName = function( match, value, shortNames, longNames ) {
- return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
- },
- output = "",
- literal = false;
-
- if ( date ) {
- for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
- if ( literal ) {
- if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
- literal = false;
- } else {
- output += format.charAt( iFormat );
- }
- } else {
- switch ( format.charAt( iFormat ) ) {
- case "d":
- output += formatNumber( "d", date.getDate(), 2 );
- break;
- case "D":
- output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
- break;
- case "o":
- output += formatNumber( "o",
- Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
- break;
- case "m":
- output += formatNumber( "m", date.getMonth() + 1, 2 );
- break;
- case "M":
- output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
- break;
- case "y":
- output += ( lookAhead( "y" ) ? date.getFullYear() :
- ( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
- break;
- case "@":
- output += date.getTime();
- break;
- case "!":
- output += date.getTime() * 10000 + this._ticksTo1970;
- break;
- case "'":
- if ( lookAhead( "'" ) ) {
- output += "'";
- } else {
- literal = true;
- }
- break;
- default:
- output += format.charAt( iFormat );
- }
- }
- }
- }
- return output;
- },
-
- /* Extract all possible characters from the date format. */
- _possibleChars: function( format ) {
- var iFormat,
- chars = "",
- literal = false,
-
- // Check whether a format character is doubled
- lookAhead = function( match ) {
- var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
- if ( matches ) {
- iFormat++;
- }
- return matches;
- };
-
- for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
- if ( literal ) {
- if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
- literal = false;
- } else {
- chars += format.charAt( iFormat );
- }
- } else {
- switch ( format.charAt( iFormat ) ) {
- case "d": case "m": case "y": case "@":
- chars += "0123456789";
- break;
- case "D": case "M":
- return null; // Accept anything
- case "'":
- if ( lookAhead( "'" ) ) {
- chars += "'";
- } else {
- literal = true;
- }
- break;
- default:
- chars += format.charAt( iFormat );
- }
- }
- }
- return chars;
- },
-
- /* Get a setting value, defaulting if necessary. */
- _get: function( inst, name ) {
- return inst.settings[ name ] !== undefined ?
- inst.settings[ name ] : this._defaults[ name ];
- },
-
- /* Parse existing date and initialise date picker. */
- _setDateFromField: function( inst, noDefault ) {
- if ( inst.input.val() === inst.lastVal ) {
- return;
- }
-
- var dateFormat = this._get( inst, "dateFormat" ),
- dates = inst.lastVal = inst.input ? inst.input.val() : null,
- defaultDate = this._getDefaultDate( inst ),
- date = defaultDate,
- settings = this._getFormatConfig( inst );
-
- try {
- date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
- } catch ( event ) {
- dates = ( noDefault ? "" : dates );
- }
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- inst.currentDay = ( dates ? date.getDate() : 0 );
- inst.currentMonth = ( dates ? date.getMonth() : 0 );
- inst.currentYear = ( dates ? date.getFullYear() : 0 );
- this._adjustInstDate( inst );
- },
-
- /* Retrieve the default date shown on opening. */
- _getDefaultDate: function( inst ) {
- return this._restrictMinMax( inst,
- this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
- },
-
- /* A date may be specified as an exact value or a relative one. */
- _determineDate: function( inst, date, defaultDate ) {
- var offsetNumeric = function( offset ) {
- var date = new Date();
- date.setDate( date.getDate() + offset );
- return date;
- },
- offsetString = function( offset ) {
- try {
- return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
- offset, $.datepicker._getFormatConfig( inst ) );
- } catch ( e ) {
-
- // Ignore
- }
-
- var date = ( offset.toLowerCase().match( /^c/ ) ?
- $.datepicker._getDate( inst ) : null ) || new Date(),
- year = date.getFullYear(),
- month = date.getMonth(),
- day = date.getDate(),
- pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
- matches = pattern.exec( offset );
-
- while ( matches ) {
- switch ( matches[ 2 ] || "d" ) {
- case "d" : case "D" :
- day += parseInt( matches[ 1 ], 10 ); break;
- case "w" : case "W" :
- day += parseInt( matches[ 1 ], 10 ) * 7; break;
- case "m" : case "M" :
- month += parseInt( matches[ 1 ], 10 );
- day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
- break;
- case "y": case "Y" :
- year += parseInt( matches[ 1 ], 10 );
- day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
- break;
- }
- matches = pattern.exec( offset );
- }
- return new Date( year, month, day );
- },
- newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
- ( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
-
- newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
- if ( newDate ) {
- newDate.setHours( 0 );
- newDate.setMinutes( 0 );
- newDate.setSeconds( 0 );
- newDate.setMilliseconds( 0 );
- }
- return this._daylightSavingAdjust( newDate );
- },
-
- /* Handle switch to/from daylight saving.
- * Hours may be non-zero on daylight saving cut-over:
- * > 12 when midnight changeover, but then cannot generate
- * midnight datetime, so jump to 1AM, otherwise reset.
- * @param date (Date) the date to check
- * @return (Date) the corrected date
- */
- _daylightSavingAdjust: function( date ) {
- if ( !date ) {
- return null;
- }
- date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
- return date;
- },
-
- /* Set the date(s) directly. */
- _setDate: function( inst, date, noChange ) {
- var clear = !date,
- origMonth = inst.selectedMonth,
- origYear = inst.selectedYear,
- newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
-
- inst.selectedDay = inst.currentDay = newDate.getDate();
- inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
- inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
- if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
- this._notifyChange( inst );
- }
- this._adjustInstDate( inst );
- if ( inst.input ) {
- inst.input.val( clear ? "" : this._formatDate( inst ) );
- }
- },
-
- /* Retrieve the date(s) directly. */
- _getDate: function( inst ) {
- var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
- this._daylightSavingAdjust( new Date(
- inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
- return startDate;
- },
-
- /* Attach the onxxx handlers. These are declared statically so
- * they work with static code transformers like Caja.
- */
- _attachHandlers: function( inst ) {
- var stepMonths = this._get( inst, "stepMonths" ),
- id = "#" + inst.id.replace( /\\\\/g, "\\" );
- inst.dpDiv.find( "[data-handler]" ).map( function() {
- var handler = {
- prev: function() {
- $.datepicker._adjustDate( id, -stepMonths, "M" );
- },
- next: function() {
- $.datepicker._adjustDate( id, +stepMonths, "M" );
- },
- hide: function() {
- $.datepicker._hideDatepicker();
- },
- today: function() {
- $.datepicker._gotoToday( id );
- },
- selectDay: function() {
- $.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
- return false;
- },
- selectMonth: function() {
- $.datepicker._selectMonthYear( id, this, "M" );
- return false;
- },
- selectYear: function() {
- $.datepicker._selectMonthYear( id, this, "Y" );
- return false;
- }
- };
- $( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
- } );
- },
-
- /* Generate the HTML for the current state of the date picker. */
- _generateHTML: function( inst ) {
- var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
- controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
- monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
- selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
- cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
- printDate, dRow, tbody, daySettings, otherMonth, unselectable,
- tempDate = new Date(),
- today = this._daylightSavingAdjust(
- new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
- isRTL = this._get( inst, "isRTL" ),
- showButtonPanel = this._get( inst, "showButtonPanel" ),
- hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
- navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
- numMonths = this._getNumberOfMonths( inst ),
- showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
- stepMonths = this._get( inst, "stepMonths" ),
- isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
- currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
- new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
- minDate = this._getMinMaxDate( inst, "min" ),
- maxDate = this._getMinMaxDate( inst, "max" ),
- drawMonth = inst.drawMonth - showCurrentAtPos,
- drawYear = inst.drawYear;
-
- if ( drawMonth < 0 ) {
- drawMonth += 12;
- drawYear--;
- }
- if ( maxDate ) {
- maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
- maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
- maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
- while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
- drawMonth--;
- if ( drawMonth < 0 ) {
- drawMonth = 11;
- drawYear--;
- }
- }
- }
- inst.drawMonth = drawMonth;
- inst.drawYear = drawYear;
-
- prevText = this._get( inst, "prevText" );
- prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
- this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
- this._getFormatConfig( inst ) ) );
-
- if ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ) {
- prev = $( "<a>" )
- .attr( {
- "class": "ui-datepicker-prev ui-corner-all",
- "data-handler": "prev",
- "data-event": "click",
- title: prevText
- } )
- .append(
- $( "<span>" )
- .addClass( "ui-icon ui-icon-circle-triangle-" +
- ( isRTL ? "e" : "w" ) )
- .text( prevText )
- )[ 0 ].outerHTML;
- } else if ( hideIfNoPrevNext ) {
- prev = "";
- } else {
- prev = $( "<a>" )
- .attr( {
- "class": "ui-datepicker-prev ui-corner-all ui-state-disabled",
- title: prevText
- } )
- .append(
- $( "<span>" )
- .addClass( "ui-icon ui-icon-circle-triangle-" +
- ( isRTL ? "e" : "w" ) )
- .text( prevText )
- )[ 0 ].outerHTML;
- }
-
- nextText = this._get( inst, "nextText" );
- nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
- this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
- this._getFormatConfig( inst ) ) );
-
- if ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ) {
- next = $( "<a>" )
- .attr( {
- "class": "ui-datepicker-next ui-corner-all",
- "data-handler": "next",
- "data-event": "click",
- title: nextText
- } )
- .append(
- $( "<span>" )
- .addClass( "ui-icon ui-icon-circle-triangle-" +
- ( isRTL ? "w" : "e" ) )
- .text( nextText )
- )[ 0 ].outerHTML;
- } else if ( hideIfNoPrevNext ) {
- next = "";
- } else {
- next = $( "<a>" )
- .attr( {
- "class": "ui-datepicker-next ui-corner-all ui-state-disabled",
- title: nextText
- } )
- .append(
- $( "<span>" )
- .attr( "class", "ui-icon ui-icon-circle-triangle-" +
- ( isRTL ? "w" : "e" ) )
- .text( nextText )
- )[ 0 ].outerHTML;
- }
-
- currentText = this._get( inst, "currentText" );
- gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
- currentText = ( !navigationAsDateFormat ? currentText :
- this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
-
- controls = "";
- if ( !inst.inline ) {
- controls = $( "<button>" )
- .attr( {
- type: "button",
- "class": "ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all",
- "data-handler": "hide",
- "data-event": "click"
- } )
- .text( this._get( inst, "closeText" ) )[ 0 ].outerHTML;
- }
-
- buttonPanel = "";
- if ( showButtonPanel ) {
- buttonPanel = $( "<div class='ui-datepicker-buttonpane ui-widget-content'>" )
- .append( isRTL ? controls : "" )
- .append( this._isInRange( inst, gotoDate ) ?
- $( "<button>" )
- .attr( {
- type: "button",
- "class": "ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all",
- "data-handler": "today",
- "data-event": "click"
- } )
- .text( currentText ) :
- "" )
- .append( isRTL ? "" : controls )[ 0 ].outerHTML;
- }
-
- firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
- firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
-
- showWeek = this._get( inst, "showWeek" );
- dayNames = this._get( inst, "dayNames" );
- dayNamesMin = this._get( inst, "dayNamesMin" );
- monthNames = this._get( inst, "monthNames" );
- monthNamesShort = this._get( inst, "monthNamesShort" );
- beforeShowDay = this._get( inst, "beforeShowDay" );
- showOtherMonths = this._get( inst, "showOtherMonths" );
- selectOtherMonths = this._get( inst, "selectOtherMonths" );
- defaultDate = this._getDefaultDate( inst );
- html = "";
-
- for ( row = 0; row < numMonths[ 0 ]; row++ ) {
- group = "";
- this.maxRows = 4;
- for ( col = 0; col < numMonths[ 1 ]; col++ ) {
- selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
- cornerClass = " ui-corner-all";
- calender = "";
- if ( isMultiMonth ) {
- calender += "<div class='ui-datepicker-group";
- if ( numMonths[ 1 ] > 1 ) {
- switch ( col ) {
- case 0: calender += " ui-datepicker-group-first";
- cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
- case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
- cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
- default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
- }
- }
- calender += "'>";
- }
- calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
- ( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
- ( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
- this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
- row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
- "</div><table class='ui-datepicker-calendar'><thead>" +
- "<tr>";
- thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
- for ( dow = 0; dow < 7; dow++ ) { // days of the week
- day = ( dow + firstDay ) % 7;
- thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
- "<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
- }
- calender += thead + "</tr></thead><tbody>";
- daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
- if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
- inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
- }
- leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
- curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
- numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
- this.maxRows = numRows;
- printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
- for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
- calender += "<tr>";
- tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
- this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
- for ( dow = 0; dow < 7; dow++ ) { // create date picker days
- daySettings = ( beforeShowDay ?
- beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
- otherMonth = ( printDate.getMonth() !== drawMonth );
- unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
- ( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
- tbody += "<td class='" +
- ( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
- ( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
- ( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
- ( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
-
- // or defaultDate is current printedDate and defaultDate is selectedDate
- " " + this._dayOverClass : "" ) + // highlight selected day
- ( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) + // highlight unselectable days
- ( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
- ( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
- ( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
- ( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
- ( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
- ( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
- ( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
- ( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
- ( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
- ( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
- "' href='#' aria-current='" + ( printDate.getTime() === currentDate.getTime() ? "true" : "false" ) + // mark date as selected for screen reader
- "' data-date='" + printDate.getDate() + // store date as data
- "'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
- printDate.setDate( printDate.getDate() + 1 );
- printDate = this._daylightSavingAdjust( printDate );
- }
- calender += tbody + "</tr>";
- }
- drawMonth++;
- if ( drawMonth > 11 ) {
- drawMonth = 0;
- drawYear++;
- }
- calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
- ( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
- group += calender;
- }
- html += group;
- }
- html += buttonPanel;
- inst._keyEvent = false;
- return html;
- },
-
- /* Generate the month and year header. */
- _generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
- secondary, monthNames, monthNamesShort ) {
-
- var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
- changeMonth = this._get( inst, "changeMonth" ),
- changeYear = this._get( inst, "changeYear" ),
- showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
- selectMonthLabel = this._get( inst, "selectMonthLabel" ),
- selectYearLabel = this._get( inst, "selectYearLabel" ),
- html = "<div class='ui-datepicker-title'>",
- monthHtml = "";
-
- // Month selection
- if ( secondary || !changeMonth ) {
- monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
- } else {
- inMinYear = ( minDate && minDate.getFullYear() === drawYear );
- inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
- monthHtml += "<select class='ui-datepicker-month' aria-label='" + selectMonthLabel + "' data-handler='selectMonth' data-event='change'>";
- for ( month = 0; month < 12; month++ ) {
- if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
- monthHtml += "<option value='" + month + "'" +
- ( month === drawMonth ? " selected='selected'" : "" ) +
- ">" + monthNamesShort[ month ] + "</option>";
- }
- }
- monthHtml += "</select>";
- }
-
- if ( !showMonthAfterYear ) {
- html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
- }
-
- // Year selection
- if ( !inst.yearshtml ) {
- inst.yearshtml = "";
- if ( secondary || !changeYear ) {
- html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
- } else {
-
- // determine range of years to display
- years = this._get( inst, "yearRange" ).split( ":" );
- thisYear = new Date().getFullYear();
- determineYear = function( value ) {
- var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
- ( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
- parseInt( value, 10 ) ) );
- return ( isNaN( year ) ? thisYear : year );
- };
- year = determineYear( years[ 0 ] );
- endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
- year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
- endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
- inst.yearshtml += "<select class='ui-datepicker-year' aria-label='" + selectYearLabel + "' data-handler='selectYear' data-event='change'>";
- for ( ; year <= endYear; year++ ) {
- inst.yearshtml += "<option value='" + year + "'" +
- ( year === drawYear ? " selected='selected'" : "" ) +
- ">" + year + "</option>";
- }
- inst.yearshtml += "</select>";
-
- html += inst.yearshtml;
- inst.yearshtml = null;
- }
- }
-
- html += this._get( inst, "yearSuffix" );
- if ( showMonthAfterYear ) {
- html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
- }
- html += "</div>"; // Close datepicker_header
- return html;
- },
-
- /* Adjust one of the date sub-fields. */
- _adjustInstDate: function( inst, offset, period ) {
- var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
- month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
- day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
- date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
-
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- if ( period === "M" || period === "Y" ) {
- this._notifyChange( inst );
- }
- },
-
- /* Ensure a date is within any min/max bounds. */
- _restrictMinMax: function( inst, date ) {
- var minDate = this._getMinMaxDate( inst, "min" ),
- maxDate = this._getMinMaxDate( inst, "max" ),
- newDate = ( minDate && date < minDate ? minDate : date );
- return ( maxDate && newDate > maxDate ? maxDate : newDate );
- },
-
- /* Notify change of month/year. */
- _notifyChange: function( inst ) {
- var onChange = this._get( inst, "onChangeMonthYear" );
- if ( onChange ) {
- onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
- [ inst.selectedYear, inst.selectedMonth + 1, inst ] );
- }
- },
-
- /* Determine the number of months to show. */
- _getNumberOfMonths: function( inst ) {
- var numMonths = this._get( inst, "numberOfMonths" );
- return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
- },
-
- /* Determine the current maximum date - ensure no time components are set. */
- _getMinMaxDate: function( inst, minMax ) {
- return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
- },
-
- /* Find the number of days in a given month. */
- _getDaysInMonth: function( year, month ) {
- return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
- },
-
- /* Find the day of the week of the first of a month. */
- _getFirstDayOfMonth: function( year, month ) {
- return new Date( year, month, 1 ).getDay();
- },
-
- /* Determines if we should allow a "next/prev" month display change. */
- _canAdjustMonth: function( inst, offset, curYear, curMonth ) {
- var numMonths = this._getNumberOfMonths( inst ),
- date = this._daylightSavingAdjust( new Date( curYear,
- curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
-
- if ( offset < 0 ) {
- date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
- }
- return this._isInRange( inst, date );
- },
-
- /* Is the given date in the accepted range? */
- _isInRange: function( inst, date ) {
- var yearSplit, currentYear,
- minDate = this._getMinMaxDate( inst, "min" ),
- maxDate = this._getMinMaxDate( inst, "max" ),
- minYear = null,
- maxYear = null,
- years = this._get( inst, "yearRange" );
- if ( years ) {
- yearSplit = years.split( ":" );
- currentYear = new Date().getFullYear();
- minYear = parseInt( yearSplit[ 0 ], 10 );
- maxYear = parseInt( yearSplit[ 1 ], 10 );
- if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
- minYear += currentYear;
- }
- if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
- maxYear += currentYear;
- }
- }
-
- return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
- ( !maxDate || date.getTime() <= maxDate.getTime() ) &&
- ( !minYear || date.getFullYear() >= minYear ) &&
- ( !maxYear || date.getFullYear() <= maxYear ) );
- },
-
- /* Provide the configuration settings for formatting/parsing. */
- _getFormatConfig: function( inst ) {
- var shortYearCutoff = this._get( inst, "shortYearCutoff" );
- shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
- new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
- return { shortYearCutoff: shortYearCutoff,
- dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
- monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
- },
-
- /* Format the given date for display. */
- _formatDate: function( inst, day, month, year ) {
- if ( !day ) {
- inst.currentDay = inst.selectedDay;
- inst.currentMonth = inst.selectedMonth;
- inst.currentYear = inst.selectedYear;
- }
- var date = ( day ? ( typeof day === "object" ? day :
- this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
- this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
- return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
- }
-} );
-
-/*
- * Bind hover events for datepicker elements.
- * Done via delegate so the binding only occurs once in the lifetime of the parent div.
- * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */
-function datepicker_bindHover( dpDiv ) {
- var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
- return dpDiv.on( "mouseout", selector, function() {
- $( this ).removeClass( "ui-state-hover" );
- if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
- $( this ).removeClass( "ui-datepicker-prev-hover" );
- }
- if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
- $( this ).removeClass( "ui-datepicker-next-hover" );
- }
- } )
- .on( "mouseover", selector, datepicker_handleMouseover );
-}
-
-function datepicker_handleMouseover() {
- if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
- $( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
- $( this ).addClass( "ui-state-hover" );
- if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
- $( this ).addClass( "ui-datepicker-prev-hover" );
- }
- if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
- $( this ).addClass( "ui-datepicker-next-hover" );
- }
- }
-}
-
-/* jQuery extend now ignores nulls! */
-function datepicker_extendRemove( target, props ) {
- $.extend( target, props );
- for ( var name in props ) {
- if ( props[ name ] == null ) {
- target[ name ] = props[ name ];
- }
- }
- return target;
-}
-
-/* Invoke the datepicker functionality.
- @param options string - a command, optionally followed by additional parameters or
- Object - settings for attaching new datepicker functionality
- @return jQuery object */
-$.fn.datepicker = function( options ) {
-
- /* Verify an empty collection wasn't passed - Fixes #6976 */
- if ( !this.length ) {
- return this;
- }
-
- /* Initialise the date picker. */
- if ( !$.datepicker.initialized ) {
- $( document ).on( "mousedown", $.datepicker._checkExternalClick );
- $.datepicker.initialized = true;
- }
-
- /* Append datepicker main container to body if not exist. */
- if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
- $( "body" ).append( $.datepicker.dpDiv );
- }
-
- var otherArgs = Array.prototype.slice.call( arguments, 1 );
- if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
- return $.datepicker[ "_" + options + "Datepicker" ].
- apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
- }
- if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
- return $.datepicker[ "_" + options + "Datepicker" ].
- apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
- }
- return this.each( function() {
- if ( typeof options === "string" ) {
- $.datepicker[ "_" + options + "Datepicker" ]
- .apply( $.datepicker, [ this ].concat( otherArgs ) );
- } else {
- $.datepicker._attachDatepicker( this, options );
- }
- } );
-};
-
-$.datepicker = new Datepicker(); // singleton instance
-$.datepicker.initialized = false;
-$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.13.1";
-
-var widgetsDatepicker = $.datepicker;
-
-
-
-// This file is deprecated
-var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
-
-/*!
- * jQuery UI Mouse 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Mouse
-//>>group: Widgets
-//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
-//>>docs: http://api.jqueryui.com/mouse/
-
-
-var mouseHandled = false;
-$( document ).on( "mouseup", function() {
- mouseHandled = false;
-} );
-
-var widgetsMouse = $.widget( "ui.mouse", {
- version: "1.13.1",
- options: {
- cancel: "input, textarea, button, select, option",
- distance: 1,
- delay: 0
- },
- _mouseInit: function() {
- var that = this;
-
- this.element
- .on( "mousedown." + this.widgetName, function( event ) {
- return that._mouseDown( event );
- } )
- .on( "click." + this.widgetName, function( event ) {
- if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
- $.removeData( event.target, that.widgetName + ".preventClickEvent" );
- event.stopImmediatePropagation();
- return false;
- }
- } );
-
- this.started = false;
- },
-
- // TODO: make sure destroying one instance of mouse doesn't mess with
- // other instances of mouse
- _mouseDestroy: function() {
- this.element.off( "." + this.widgetName );
- if ( this._mouseMoveDelegate ) {
- this.document
- .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
- .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
- }
- },
-
- _mouseDown: function( event ) {
-
- // don't let more than one widget handle mouseStart
- if ( mouseHandled ) {
- return;
- }
-
- this._mouseMoved = false;
-
- // We may have missed mouseup (out of window)
- if ( this._mouseStarted ) {
- this._mouseUp( event );
- }
-
- this._mouseDownEvent = event;
-
- var that = this,
- btnIsLeft = ( event.which === 1 ),
-
- // event.target.nodeName works around a bug in IE 8 with
- // disabled inputs (#7620)
- elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
- $( event.target ).closest( this.options.cancel ).length : false );
- if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
- return true;
- }
-
- this.mouseDelayMet = !this.options.delay;
- if ( !this.mouseDelayMet ) {
- this._mouseDelayTimer = setTimeout( function() {
- that.mouseDelayMet = true;
- }, this.options.delay );
- }
-
- if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
- this._mouseStarted = ( this._mouseStart( event ) !== false );
- if ( !this._mouseStarted ) {
- event.preventDefault();
- return true;
- }
- }
-
- // Click event may never have fired (Gecko & Opera)
- if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
- $.removeData( event.target, this.widgetName + ".preventClickEvent" );
- }
-
- // These delegates are required to keep context
- this._mouseMoveDelegate = function( event ) {
- return that._mouseMove( event );
- };
- this._mouseUpDelegate = function( event ) {
- return that._mouseUp( event );
- };
-
- this.document
- .on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
- .on( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
- event.preventDefault();
-
- mouseHandled = true;
- return true;
- },
-
- _mouseMove: function( event ) {
-
- // Only check for mouseups outside the document if you've moved inside the document
- // at least once. This prevents the firing of mouseup in the case of IE<9, which will
- // fire a mousemove event if content is placed under the cursor. See #7778
- // Support: IE <9
- if ( this._mouseMoved ) {
-
- // IE mouseup check - mouseup happened when mouse was out of window
- if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
- !event.button ) {
- return this._mouseUp( event );
-
- // Iframe mouseup check - mouseup occurred in another document
- } else if ( !event.which ) {
-
- // Support: Safari <=8 - 9
- // Safari sets which to 0 if you press any of the following keys
- // during a drag (#14461)
- if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
- event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
- this.ignoreMissingWhich = true;
- } else if ( !this.ignoreMissingWhich ) {
- return this._mouseUp( event );
- }
- }
- }
-
- if ( event.which || event.button ) {
- this._mouseMoved = true;
- }
-
- if ( this._mouseStarted ) {
- this._mouseDrag( event );
- return event.preventDefault();
- }
-
- if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
- this._mouseStarted =
- ( this._mouseStart( this._mouseDownEvent, event ) !== false );
- if ( this._mouseStarted ) {
- this._mouseDrag( event );
- } else {
- this._mouseUp( event );
- }
- }
-
- return !this._mouseStarted;
- },
-
- _mouseUp: function( event ) {
- this.document
- .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
- .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
- if ( this._mouseStarted ) {
- this._mouseStarted = false;
-
- if ( event.target === this._mouseDownEvent.target ) {
- $.data( event.target, this.widgetName + ".preventClickEvent", true );
- }
-
- this._mouseStop( event );
- }
-
- if ( this._mouseDelayTimer ) {
- clearTimeout( this._mouseDelayTimer );
- delete this._mouseDelayTimer;
- }
-
- this.ignoreMissingWhich = false;
- mouseHandled = false;
- event.preventDefault();
- },
-
- _mouseDistanceMet: function( event ) {
- return ( Math.max(
- Math.abs( this._mouseDownEvent.pageX - event.pageX ),
- Math.abs( this._mouseDownEvent.pageY - event.pageY )
- ) >= this.options.distance
- );
- },
-
- _mouseDelayMet: function( /* event */ ) {
- return this.mouseDelayMet;
- },
-
- // These are placeholder methods, to be overriden by extending plugin
- _mouseStart: function( /* event */ ) {},
- _mouseDrag: function( /* event */ ) {},
- _mouseStop: function( /* event */ ) {},
- _mouseCapture: function( /* event */ ) {
- return true;
- }
-} );
-
-
-
-// $.ui.plugin is deprecated. Use $.widget() extensions instead.
-var plugin = $.ui.plugin = {
- add: function( module, option, set ) {
- var i,
- proto = $.ui[ module ].prototype;
- for ( i in set ) {
- proto.plugins[ i ] = proto.plugins[ i ] || [];
- proto.plugins[ i ].push( [ option, set[ i ] ] );
- }
- },
- call: function( instance, name, args, allowDisconnected ) {
- var i,
- set = instance.plugins[ name ];
-
- if ( !set ) {
- return;
- }
-
- if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
- instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
- return;
- }
-
- for ( i = 0; i < set.length; i++ ) {
- if ( instance.options[ set[ i ][ 0 ] ] ) {
- set[ i ][ 1 ].apply( instance.element, args );
- }
- }
- }
-};
-
-
-
-var safeBlur = $.ui.safeBlur = function( element ) {
-
- // Support: IE9 - 10 only
- // If the <body> is blurred, IE will switch windows, see #9420
- if ( element && element.nodeName.toLowerCase() !== "body" ) {
- $( element ).trigger( "blur" );
- }
-};
-
-
-/*!
- * jQuery UI Draggable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Draggable
-//>>group: Interactions
-//>>description: Enables dragging functionality for any element.
-//>>docs: http://api.jqueryui.com/draggable/
-//>>demos: http://jqueryui.com/draggable/
-//>>css.structure: ../../themes/base/draggable.css
-
-
-$.widget( "ui.draggable", $.ui.mouse, {
- version: "1.13.1",
- widgetEventPrefix: "drag",
- options: {
- addClasses: true,
- appendTo: "parent",
- axis: false,
- connectToSortable: false,
- containment: false,
- cursor: "auto",
- cursorAt: false,
- grid: false,
- handle: false,
- helper: "original",
- iframeFix: false,
- opacity: false,
- refreshPositions: false,
- revert: false,
- revertDuration: 500,
- scope: "default",
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- snap: false,
- snapMode: "both",
- snapTolerance: 20,
- stack: false,
- zIndex: false,
-
- // Callbacks
- drag: null,
- start: null,
- stop: null
- },
- _create: function() {
-
- if ( this.options.helper === "original" ) {
- this._setPositionRelative();
- }
- if ( this.options.addClasses ) {
- this._addClass( "ui-draggable" );
- }
- this._setHandleClassName();
-
- this._mouseInit();
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
- if ( key === "handle" ) {
- this._removeHandleClassName();
- this._setHandleClassName();
- }
- },
-
- _destroy: function() {
- if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
- this.destroyOnClear = true;
- return;
- }
- this._removeHandleClassName();
- this._mouseDestroy();
- },
-
- _mouseCapture: function( event ) {
- var o = this.options;
-
- // Among others, prevent a drag on a resizable-handle
- if ( this.helper || o.disabled ||
- $( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
- return false;
- }
-
- //Quit if we're not on a valid handle
- this.handle = this._getHandle( event );
- if ( !this.handle ) {
- return false;
- }
-
- this._blurActiveElement( event );
-
- this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
-
- return true;
-
- },
-
- _blockFrames: function( selector ) {
- this.iframeBlocks = this.document.find( selector ).map( function() {
- var iframe = $( this );
-
- return $( "<div>" )
- .css( "position", "absolute" )
- .appendTo( iframe.parent() )
- .outerWidth( iframe.outerWidth() )
- .outerHeight( iframe.outerHeight() )
- .offset( iframe.offset() )[ 0 ];
- } );
- },
-
- _unblockFrames: function() {
- if ( this.iframeBlocks ) {
- this.iframeBlocks.remove();
- delete this.iframeBlocks;
- }
- },
-
- _blurActiveElement: function( event ) {
- var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
- target = $( event.target );
-
- // Don't blur if the event occurred on an element that is within
- // the currently focused element
- // See #10527, #12472
- if ( target.closest( activeElement ).length ) {
- return;
- }
-
- // Blur any element that currently has focus, see #4261
- $.ui.safeBlur( activeElement );
- },
-
- _mouseStart: function( event ) {
-
- var o = this.options;
-
- //Create and append the visible helper
- this.helper = this._createHelper( event );
-
- this._addClass( this.helper, "ui-draggable-dragging" );
-
- //Cache the helper size
- this._cacheHelperProportions();
-
- //If ddmanager is used for droppables, set the global draggable
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.current = this;
- }
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- //Cache the margins of the original element
- this._cacheMargins();
-
- //Store the helper's css position
- this.cssPosition = this.helper.css( "position" );
- this.scrollParent = this.helper.scrollParent( true );
- this.offsetParent = this.helper.offsetParent();
- this.hasFixedAncestor = this.helper.parents().filter( function() {
- return $( this ).css( "position" ) === "fixed";
- } ).length > 0;
-
- //The element's absolute position on the page minus margins
- this.positionAbs = this.element.offset();
- this._refreshOffsets( event );
-
- //Generate the original position
- this.originalPosition = this.position = this._generatePosition( event, false );
- this.originalPageX = event.pageX;
- this.originalPageY = event.pageY;
-
- //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
- if ( o.cursorAt ) {
- this._adjustOffsetFromHelper( o.cursorAt );
- }
-
- //Set a containment if given in the options
- this._setContainment();
-
- //Trigger event + callbacks
- if ( this._trigger( "start", event ) === false ) {
- this._clear();
- return false;
- }
-
- //Recache the helper size
- this._cacheHelperProportions();
-
- //Prepare the droppable offsets
- if ( $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( this, event );
- }
-
- // Execute the drag once - this causes the helper not to be visible before getting its
- // correct position
- this._mouseDrag( event, true );
-
- // If the ddmanager is used for droppables, inform the manager that dragging has started
- // (see #5003)
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.dragStart( this, event );
- }
-
- return true;
- },
-
- _refreshOffsets: function( event ) {
- this.offset = {
- top: this.positionAbs.top - this.margins.top,
- left: this.positionAbs.left - this.margins.left,
- scroll: false,
- parent: this._getParentOffset(),
- relative: this._getRelativeOffset()
- };
-
- this.offset.click = {
- left: event.pageX - this.offset.left,
- top: event.pageY - this.offset.top
- };
- },
-
- _mouseDrag: function( event, noPropagation ) {
-
- // reset any necessary cached properties (see #5009)
- if ( this.hasFixedAncestor ) {
- this.offset.parent = this._getParentOffset();
- }
-
- //Compute the helpers position
- this.position = this._generatePosition( event, true );
- this.positionAbs = this._convertPositionTo( "absolute" );
-
- //Call plugins and callbacks and use the resulting position if something is returned
- if ( !noPropagation ) {
- var ui = this._uiHash();
- if ( this._trigger( "drag", event, ui ) === false ) {
- this._mouseUp( new $.Event( "mouseup", event ) );
- return false;
- }
- this.position = ui.position;
- }
-
- this.helper[ 0 ].style.left = this.position.left + "px";
- this.helper[ 0 ].style.top = this.position.top + "px";
-
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.drag( this, event );
- }
-
- return false;
- },
-
- _mouseStop: function( event ) {
-
- //If we are using droppables, inform the manager about the drop
- var that = this,
- dropped = false;
- if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
- dropped = $.ui.ddmanager.drop( this, event );
- }
-
- //if a drop comes from outside (a sortable)
- if ( this.dropped ) {
- dropped = this.dropped;
- this.dropped = false;
- }
-
- if ( ( this.options.revert === "invalid" && !dropped ) ||
- ( this.options.revert === "valid" && dropped ) ||
- this.options.revert === true || ( typeof this.options.revert === "function" &&
- this.options.revert.call( this.element, dropped ) )
- ) {
- $( this.helper ).animate(
- this.originalPosition,
- parseInt( this.options.revertDuration, 10 ),
- function() {
- if ( that._trigger( "stop", event ) !== false ) {
- that._clear();
- }
- }
- );
- } else {
- if ( this._trigger( "stop", event ) !== false ) {
- this._clear();
- }
- }
-
- return false;
- },
-
- _mouseUp: function( event ) {
- this._unblockFrames();
-
- // If the ddmanager is used for droppables, inform the manager that dragging has stopped
- // (see #5003)
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.dragStop( this, event );
- }
-
- // Only need to focus if the event occurred on the draggable itself, see #10527
- if ( this.handleElement.is( event.target ) ) {
-
- // The interaction is over; whether or not the click resulted in a drag,
- // focus the element
- this.element.trigger( "focus" );
- }
-
- return $.ui.mouse.prototype._mouseUp.call( this, event );
- },
-
- cancel: function() {
-
- if ( this.helper.is( ".ui-draggable-dragging" ) ) {
- this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
- } else {
- this._clear();
- }
-
- return this;
-
- },
-
- _getHandle: function( event ) {
- return this.options.handle ?
- !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
- true;
- },
-
- _setHandleClassName: function() {
- this.handleElement = this.options.handle ?
- this.element.find( this.options.handle ) : this.element;
- this._addClass( this.handleElement, "ui-draggable-handle" );
- },
-
- _removeHandleClassName: function() {
- this._removeClass( this.handleElement, "ui-draggable-handle" );
- },
-
- _createHelper: function( event ) {
-
- var o = this.options,
- helperIsFunction = typeof o.helper === "function",
- helper = helperIsFunction ?
- $( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
- ( o.helper === "clone" ?
- this.element.clone().removeAttr( "id" ) :
- this.element );
-
- if ( !helper.parents( "body" ).length ) {
- helper.appendTo( ( o.appendTo === "parent" ?
- this.element[ 0 ].parentNode :
- o.appendTo ) );
- }
-
- // Http://bugs.jqueryui.com/ticket/9446
- // a helper function can return the original element
- // which wouldn't have been set to relative in _create
- if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
- this._setPositionRelative();
- }
-
- if ( helper[ 0 ] !== this.element[ 0 ] &&
- !( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
- helper.css( "position", "absolute" );
- }
-
- return helper;
-
- },
-
- _setPositionRelative: function() {
- if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
- this.element[ 0 ].style.position = "relative";
- }
- },
-
- _adjustOffsetFromHelper: function( obj ) {
- if ( typeof obj === "string" ) {
- obj = obj.split( " " );
- }
- if ( Array.isArray( obj ) ) {
- obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
- }
- if ( "left" in obj ) {
- this.offset.click.left = obj.left + this.margins.left;
- }
- if ( "right" in obj ) {
- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
- }
- if ( "top" in obj ) {
- this.offset.click.top = obj.top + this.margins.top;
- }
- if ( "bottom" in obj ) {
- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
- }
- },
-
- _isRootNode: function( element ) {
- return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
- },
-
- _getParentOffset: function() {
-
- //Get the offsetParent and cache its position
- var po = this.offsetParent.offset(),
- document = this.document[ 0 ];
-
- // This is a special case where we need to modify a offset calculated on start, since the
- // following happened:
- // 1. The position of the helper is absolute, so it's position is calculated based on the
- // next positioned parent
- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
- // the document, which means that the scroll is included in the initial calculation of the
- // offset of the parent, and never recalculated upon drag
- if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
- po.left += this.scrollParent.scrollLeft();
- po.top += this.scrollParent.scrollTop();
- }
-
- if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
- po = { top: 0, left: 0 };
- }
-
- return {
- top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
- left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
- };
-
- },
-
- _getRelativeOffset: function() {
- if ( this.cssPosition !== "relative" ) {
- return { top: 0, left: 0 };
- }
-
- var p = this.element.position(),
- scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
-
- return {
- top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
- ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
- left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
- ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
- };
-
- },
-
- _cacheMargins: function() {
- this.margins = {
- left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
- top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
- right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
- bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
- };
- },
-
- _cacheHelperProportions: function() {
- this.helperProportions = {
- width: this.helper.outerWidth(),
- height: this.helper.outerHeight()
- };
- },
-
- _setContainment: function() {
-
- var isUserScrollable, c, ce,
- o = this.options,
- document = this.document[ 0 ];
-
- this.relativeContainer = null;
-
- if ( !o.containment ) {
- this.containment = null;
- return;
- }
-
- if ( o.containment === "window" ) {
- this.containment = [
- $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
- $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
- $( window ).scrollLeft() + $( window ).width() -
- this.helperProportions.width - this.margins.left,
- $( window ).scrollTop() +
- ( $( window ).height() || document.body.parentNode.scrollHeight ) -
- this.helperProportions.height - this.margins.top
- ];
- return;
- }
-
- if ( o.containment === "document" ) {
- this.containment = [
- 0,
- 0,
- $( document ).width() - this.helperProportions.width - this.margins.left,
- ( $( document ).height() || document.body.parentNode.scrollHeight ) -
- this.helperProportions.height - this.margins.top
- ];
- return;
- }
-
- if ( o.containment.constructor === Array ) {
- this.containment = o.containment;
- return;
- }
-
- if ( o.containment === "parent" ) {
- o.containment = this.helper[ 0 ].parentNode;
- }
-
- c = $( o.containment );
- ce = c[ 0 ];
-
- if ( !ce ) {
- return;
- }
-
- isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
-
- this.containment = [
- ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
- ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
- ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
- ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
- ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
- ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
- ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
- this.helperProportions.width -
- this.margins.left -
- this.margins.right,
- ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
- ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
- ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
- this.helperProportions.height -
- this.margins.top -
- this.margins.bottom
- ];
- this.relativeContainer = c;
- },
-
- _convertPositionTo: function( d, pos ) {
-
- if ( !pos ) {
- pos = this.position;
- }
-
- var mod = d === "absolute" ? 1 : -1,
- scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
-
- return {
- top: (
-
- // The absolute mouse position
- pos.top +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.offset.scroll.top :
- ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
- ),
- left: (
-
- // The absolute mouse position
- pos.left +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.offset.scroll.left :
- ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
- )
- };
-
- },
-
- _generatePosition: function( event, constrainPosition ) {
-
- var containment, co, top, left,
- o = this.options,
- scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
- pageX = event.pageX,
- pageY = event.pageY;
-
- // Cache the scroll
- if ( !scrollIsRootNode || !this.offset.scroll ) {
- this.offset.scroll = {
- top: this.scrollParent.scrollTop(),
- left: this.scrollParent.scrollLeft()
- };
- }
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
-
- // If we are not dragging yet, we won't check for options
- if ( constrainPosition ) {
- if ( this.containment ) {
- if ( this.relativeContainer ) {
- co = this.relativeContainer.offset();
- containment = [
- this.containment[ 0 ] + co.left,
- this.containment[ 1 ] + co.top,
- this.containment[ 2 ] + co.left,
- this.containment[ 3 ] + co.top
- ];
- } else {
- containment = this.containment;
- }
-
- if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
- pageX = containment[ 0 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
- pageY = containment[ 1 ] + this.offset.click.top;
- }
- if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
- pageX = containment[ 2 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
- pageY = containment[ 3 ] + this.offset.click.top;
- }
- }
-
- if ( o.grid ) {
-
- //Check for grid elements set to 0 to prevent divide by 0 error causing invalid
- // argument errors in IE (see ticket #6950)
- top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
- this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
- pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
- top - this.offset.click.top > containment[ 3 ] ) ?
- top :
- ( ( top - this.offset.click.top >= containment[ 1 ] ) ?
- top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
-
- left = o.grid[ 0 ] ? this.originalPageX +
- Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
- this.originalPageX;
- pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
- left - this.offset.click.left > containment[ 2 ] ) ?
- left :
- ( ( left - this.offset.click.left >= containment[ 0 ] ) ?
- left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
- }
-
- if ( o.axis === "y" ) {
- pageX = this.originalPageX;
- }
-
- if ( o.axis === "x" ) {
- pageY = this.originalPageY;
- }
- }
-
- return {
- top: (
-
- // The absolute mouse position
- pageY -
-
- // Click offset (relative to the element)
- this.offset.click.top -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top +
- ( this.cssPosition === "fixed" ?
- -this.offset.scroll.top :
- ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
- ),
- left: (
-
- // The absolute mouse position
- pageX -
-
- // Click offset (relative to the element)
- this.offset.click.left -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left +
- ( this.cssPosition === "fixed" ?
- -this.offset.scroll.left :
- ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
- )
- };
-
- },
-
- _clear: function() {
- this._removeClass( this.helper, "ui-draggable-dragging" );
- if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
- this.helper.remove();
- }
- this.helper = null;
- this.cancelHelperRemoval = false;
- if ( this.destroyOnClear ) {
- this.destroy();
- }
- },
-
- // From now on bulk stuff - mainly helpers
-
- _trigger: function( type, event, ui ) {
- ui = ui || this._uiHash();
- $.ui.plugin.call( this, type, [ event, ui, this ], true );
-
- // Absolute position and offset (see #6884 ) have to be recalculated after plugins
- if ( /^(drag|start|stop)/.test( type ) ) {
- this.positionAbs = this._convertPositionTo( "absolute" );
- ui.offset = this.positionAbs;
- }
- return $.Widget.prototype._trigger.call( this, type, event, ui );
- },
-
- plugins: {},
-
- _uiHash: function() {
- return {
- helper: this.helper,
- position: this.position,
- originalPosition: this.originalPosition,
- offset: this.positionAbs
- };
- }
-
-} );
-
-$.ui.plugin.add( "draggable", "connectToSortable", {
- start: function( event, ui, draggable ) {
- var uiSortable = $.extend( {}, ui, {
- item: draggable.element
- } );
-
- draggable.sortables = [];
- $( draggable.options.connectToSortable ).each( function() {
- var sortable = $( this ).sortable( "instance" );
-
- if ( sortable && !sortable.options.disabled ) {
- draggable.sortables.push( sortable );
-
- // RefreshPositions is called at drag start to refresh the containerCache
- // which is used in drag. This ensures it's initialized and synchronized
- // with any changes that might have happened on the page since initialization.
- sortable.refreshPositions();
- sortable._trigger( "activate", event, uiSortable );
- }
- } );
- },
- stop: function( event, ui, draggable ) {
- var uiSortable = $.extend( {}, ui, {
- item: draggable.element
- } );
-
- draggable.cancelHelperRemoval = false;
-
- $.each( draggable.sortables, function() {
- var sortable = this;
-
- if ( sortable.isOver ) {
- sortable.isOver = 0;
-
- // Allow this sortable to handle removing the helper
- draggable.cancelHelperRemoval = true;
- sortable.cancelHelperRemoval = false;
-
- // Use _storedCSS To restore properties in the sortable,
- // as this also handles revert (#9675) since the draggable
- // may have modified them in unexpected ways (#8809)
- sortable._storedCSS = {
- position: sortable.placeholder.css( "position" ),
- top: sortable.placeholder.css( "top" ),
- left: sortable.placeholder.css( "left" )
- };
-
- sortable._mouseStop( event );
-
- // Once drag has ended, the sortable should return to using
- // its original helper, not the shared helper from draggable
- sortable.options.helper = sortable.options._helper;
- } else {
-
- // Prevent this Sortable from removing the helper.
- // However, don't set the draggable to remove the helper
- // either as another connected Sortable may yet handle the removal.
- sortable.cancelHelperRemoval = true;
-
- sortable._trigger( "deactivate", event, uiSortable );
- }
- } );
- },
- drag: function( event, ui, draggable ) {
- $.each( draggable.sortables, function() {
- var innermostIntersecting = false,
- sortable = this;
-
- // Copy over variables that sortable's _intersectsWith uses
- sortable.positionAbs = draggable.positionAbs;
- sortable.helperProportions = draggable.helperProportions;
- sortable.offset.click = draggable.offset.click;
-
- if ( sortable._intersectsWith( sortable.containerCache ) ) {
- innermostIntersecting = true;
-
- $.each( draggable.sortables, function() {
-
- // Copy over variables that sortable's _intersectsWith uses
- this.positionAbs = draggable.positionAbs;
- this.helperProportions = draggable.helperProportions;
- this.offset.click = draggable.offset.click;
-
- if ( this !== sortable &&
- this._intersectsWith( this.containerCache ) &&
- $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
- innermostIntersecting = false;
- }
-
- return innermostIntersecting;
- } );
- }
-
- if ( innermostIntersecting ) {
-
- // If it intersects, we use a little isOver variable and set it once,
- // so that the move-in stuff gets fired only once.
- if ( !sortable.isOver ) {
- sortable.isOver = 1;
-
- // Store draggable's parent in case we need to reappend to it later.
- draggable._parent = ui.helper.parent();
-
- sortable.currentItem = ui.helper
- .appendTo( sortable.element )
- .data( "ui-sortable-item", true );
-
- // Store helper option to later restore it
- sortable.options._helper = sortable.options.helper;
-
- sortable.options.helper = function() {
- return ui.helper[ 0 ];
- };
-
- // Fire the start events of the sortable with our passed browser event,
- // and our own helper (so it doesn't create a new one)
- event.target = sortable.currentItem[ 0 ];
- sortable._mouseCapture( event, true );
- sortable._mouseStart( event, true, true );
-
- // Because the browser event is way off the new appended portlet,
- // modify necessary variables to reflect the changes
- sortable.offset.click.top = draggable.offset.click.top;
- sortable.offset.click.left = draggable.offset.click.left;
- sortable.offset.parent.left -= draggable.offset.parent.left -
- sortable.offset.parent.left;
- sortable.offset.parent.top -= draggable.offset.parent.top -
- sortable.offset.parent.top;
-
- draggable._trigger( "toSortable", event );
-
- // Inform draggable that the helper is in a valid drop zone,
- // used solely in the revert option to handle "valid/invalid".
- draggable.dropped = sortable.element;
-
- // Need to refreshPositions of all sortables in the case that
- // adding to one sortable changes the location of the other sortables (#9675)
- $.each( draggable.sortables, function() {
- this.refreshPositions();
- } );
-
- // Hack so receive/update callbacks work (mostly)
- draggable.currentItem = draggable.element;
- sortable.fromOutside = draggable;
- }
-
- if ( sortable.currentItem ) {
- sortable._mouseDrag( event );
-
- // Copy the sortable's position because the draggable's can potentially reflect
- // a relative position, while sortable is always absolute, which the dragged
- // element has now become. (#8809)
- ui.position = sortable.position;
- }
- } else {
-
- // If it doesn't intersect with the sortable, and it intersected before,
- // we fake the drag stop of the sortable, but make sure it doesn't remove
- // the helper by using cancelHelperRemoval.
- if ( sortable.isOver ) {
-
- sortable.isOver = 0;
- sortable.cancelHelperRemoval = true;
-
- // Calling sortable's mouseStop would trigger a revert,
- // so revert must be temporarily false until after mouseStop is called.
- sortable.options._revert = sortable.options.revert;
- sortable.options.revert = false;
-
- sortable._trigger( "out", event, sortable._uiHash( sortable ) );
- sortable._mouseStop( event, true );
-
- // Restore sortable behaviors that were modfied
- // when the draggable entered the sortable area (#9481)
- sortable.options.revert = sortable.options._revert;
- sortable.options.helper = sortable.options._helper;
-
- if ( sortable.placeholder ) {
- sortable.placeholder.remove();
- }
-
- // Restore and recalculate the draggable's offset considering the sortable
- // may have modified them in unexpected ways. (#8809, #10669)
- ui.helper.appendTo( draggable._parent );
- draggable._refreshOffsets( event );
- ui.position = draggable._generatePosition( event, true );
-
- draggable._trigger( "fromSortable", event );
-
- // Inform draggable that the helper is no longer in a valid drop zone
- draggable.dropped = false;
-
- // Need to refreshPositions of all sortables just in case removing
- // from one sortable changes the location of other sortables (#9675)
- $.each( draggable.sortables, function() {
- this.refreshPositions();
- } );
- }
- }
- } );
- }
-} );
-
-$.ui.plugin.add( "draggable", "cursor", {
- start: function( event, ui, instance ) {
- var t = $( "body" ),
- o = instance.options;
-
- if ( t.css( "cursor" ) ) {
- o._cursor = t.css( "cursor" );
- }
- t.css( "cursor", o.cursor );
- },
- stop: function( event, ui, instance ) {
- var o = instance.options;
- if ( o._cursor ) {
- $( "body" ).css( "cursor", o._cursor );
- }
- }
-} );
-
-$.ui.plugin.add( "draggable", "opacity", {
- start: function( event, ui, instance ) {
- var t = $( ui.helper ),
- o = instance.options;
- if ( t.css( "opacity" ) ) {
- o._opacity = t.css( "opacity" );
- }
- t.css( "opacity", o.opacity );
- },
- stop: function( event, ui, instance ) {
- var o = instance.options;
- if ( o._opacity ) {
- $( ui.helper ).css( "opacity", o._opacity );
- }
- }
-} );
-
-$.ui.plugin.add( "draggable", "scroll", {
- start: function( event, ui, i ) {
- if ( !i.scrollParentNotHidden ) {
- i.scrollParentNotHidden = i.helper.scrollParent( false );
- }
-
- if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
- i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
- i.overflowOffset = i.scrollParentNotHidden.offset();
- }
- },
- drag: function( event, ui, i ) {
-
- var o = i.options,
- scrolled = false,
- scrollParent = i.scrollParentNotHidden[ 0 ],
- document = i.document[ 0 ];
-
- if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
- if ( !o.axis || o.axis !== "x" ) {
- if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
- o.scrollSensitivity ) {
- scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
- } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
- scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
- }
- }
-
- if ( !o.axis || o.axis !== "y" ) {
- if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
- o.scrollSensitivity ) {
- scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
- } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
- scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
- }
- }
-
- } else {
-
- if ( !o.axis || o.axis !== "x" ) {
- if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
- scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
- } else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
- o.scrollSensitivity ) {
- scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
- }
- }
-
- if ( !o.axis || o.axis !== "y" ) {
- if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
- scrolled = $( document ).scrollLeft(
- $( document ).scrollLeft() - o.scrollSpeed
- );
- } else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
- o.scrollSensitivity ) {
- scrolled = $( document ).scrollLeft(
- $( document ).scrollLeft() + o.scrollSpeed
- );
- }
- }
-
- }
-
- if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( i, event );
- }
-
- }
-} );
-
-$.ui.plugin.add( "draggable", "snap", {
- start: function( event, ui, i ) {
-
- var o = i.options;
-
- i.snapElements = [];
-
- $( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
- .each( function() {
- var $t = $( this ),
- $o = $t.offset();
- if ( this !== i.element[ 0 ] ) {
- i.snapElements.push( {
- item: this,
- width: $t.outerWidth(), height: $t.outerHeight(),
- top: $o.top, left: $o.left
- } );
- }
- } );
-
- },
- drag: function( event, ui, inst ) {
-
- var ts, bs, ls, rs, l, r, t, b, i, first,
- o = inst.options,
- d = o.snapTolerance,
- x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
- y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-
- for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
-
- l = inst.snapElements[ i ].left - inst.margins.left;
- r = l + inst.snapElements[ i ].width;
- t = inst.snapElements[ i ].top - inst.margins.top;
- b = t + inst.snapElements[ i ].height;
-
- if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
- !$.contains( inst.snapElements[ i ].item.ownerDocument,
- inst.snapElements[ i ].item ) ) {
- if ( inst.snapElements[ i ].snapping ) {
- if ( inst.options.snap.release ) {
- inst.options.snap.release.call(
- inst.element,
- event,
- $.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
- );
- }
- }
- inst.snapElements[ i ].snapping = false;
- continue;
- }
-
- if ( o.snapMode !== "inner" ) {
- ts = Math.abs( t - y2 ) <= d;
- bs = Math.abs( b - y1 ) <= d;
- ls = Math.abs( l - x2 ) <= d;
- rs = Math.abs( r - x1 ) <= d;
- if ( ts ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: t - inst.helperProportions.height,
- left: 0
- } ).top;
- }
- if ( bs ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: b,
- left: 0
- } ).top;
- }
- if ( ls ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: l - inst.helperProportions.width
- } ).left;
- }
- if ( rs ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: r
- } ).left;
- }
- }
-
- first = ( ts || bs || ls || rs );
-
- if ( o.snapMode !== "outer" ) {
- ts = Math.abs( t - y1 ) <= d;
- bs = Math.abs( b - y2 ) <= d;
- ls = Math.abs( l - x1 ) <= d;
- rs = Math.abs( r - x2 ) <= d;
- if ( ts ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: t,
- left: 0
- } ).top;
- }
- if ( bs ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: b - inst.helperProportions.height,
- left: 0
- } ).top;
- }
- if ( ls ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: l
- } ).left;
- }
- if ( rs ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: r - inst.helperProportions.width
- } ).left;
- }
- }
-
- if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
- if ( inst.options.snap.snap ) {
- inst.options.snap.snap.call(
- inst.element,
- event,
- $.extend( inst._uiHash(), {
- snapItem: inst.snapElements[ i ].item
- } ) );
- }
- }
- inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
-
- }
-
- }
-} );
-
-$.ui.plugin.add( "draggable", "stack", {
- start: function( event, ui, instance ) {
- var min,
- o = instance.options,
- group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
- return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
- ( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
- } );
-
- if ( !group.length ) {
- return;
- }
-
- min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
- $( group ).each( function( i ) {
- $( this ).css( "zIndex", min + i );
- } );
- this.css( "zIndex", ( min + group.length ) );
- }
-} );
-
-$.ui.plugin.add( "draggable", "zIndex", {
- start: function( event, ui, instance ) {
- var t = $( ui.helper ),
- o = instance.options;
-
- if ( t.css( "zIndex" ) ) {
- o._zIndex = t.css( "zIndex" );
- }
- t.css( "zIndex", o.zIndex );
- },
- stop: function( event, ui, instance ) {
- var o = instance.options;
-
- if ( o._zIndex ) {
- $( ui.helper ).css( "zIndex", o._zIndex );
- }
- }
-} );
-
-var widgetsDraggable = $.ui.draggable;
-
-
-/*!
- * jQuery UI Resizable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Resizable
-//>>group: Interactions
-//>>description: Enables resize functionality for any element.
-//>>docs: http://api.jqueryui.com/resizable/
-//>>demos: http://jqueryui.com/resizable/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/resizable.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.resizable", $.ui.mouse, {
- version: "1.13.1",
- widgetEventPrefix: "resize",
- options: {
- alsoResize: false,
- animate: false,
- animateDuration: "slow",
- animateEasing: "swing",
- aspectRatio: false,
- autoHide: false,
- classes: {
- "ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
- },
- containment: false,
- ghost: false,
- grid: false,
- handles: "e,s,se",
- helper: false,
- maxHeight: null,
- maxWidth: null,
- minHeight: 10,
- minWidth: 10,
-
- // See #7960
- zIndex: 90,
-
- // Callbacks
- resize: null,
- start: null,
- stop: null
- },
-
- _num: function( value ) {
- return parseFloat( value ) || 0;
- },
-
- _isNumber: function( value ) {
- return !isNaN( parseFloat( value ) );
- },
-
- _hasScroll: function( el, a ) {
-
- if ( $( el ).css( "overflow" ) === "hidden" ) {
- return false;
- }
-
- var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
- has = false;
-
- if ( el[ scroll ] > 0 ) {
- return true;
- }
-
- // TODO: determine which cases actually cause this to happen
- // if the element doesn't have the scroll set, see if it's possible to
- // set the scroll
- try {
- el[ scroll ] = 1;
- has = ( el[ scroll ] > 0 );
- el[ scroll ] = 0;
- } catch ( e ) {
-
- // `el` might be a string, then setting `scroll` will throw
- // an error in strict mode; ignore it.
- }
- return has;
- },
-
- _create: function() {
-
- var margins,
- o = this.options,
- that = this;
- this._addClass( "ui-resizable" );
-
- $.extend( this, {
- _aspectRatio: !!( o.aspectRatio ),
- aspectRatio: o.aspectRatio,
- originalElement: this.element,
- _proportionallyResizeElements: [],
- _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
- } );
-
- // Wrap the element if it cannot hold child nodes
- if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
-
- this.element.wrap(
- $( "<div class='ui-wrapper'></div>" ).css( {
- overflow: "hidden",
- position: this.element.css( "position" ),
- width: this.element.outerWidth(),
- height: this.element.outerHeight(),
- top: this.element.css( "top" ),
- left: this.element.css( "left" )
- } )
- );
-
- this.element = this.element.parent().data(
- "ui-resizable", this.element.resizable( "instance" )
- );
-
- this.elementIsWrapper = true;
-
- margins = {
- marginTop: this.originalElement.css( "marginTop" ),
- marginRight: this.originalElement.css( "marginRight" ),
- marginBottom: this.originalElement.css( "marginBottom" ),
- marginLeft: this.originalElement.css( "marginLeft" )
- };
-
- this.element.css( margins );
- this.originalElement.css( "margin", 0 );
-
- // support: Safari
- // Prevent Safari textarea resize
- this.originalResizeStyle = this.originalElement.css( "resize" );
- this.originalElement.css( "resize", "none" );
-
- this._proportionallyResizeElements.push( this.originalElement.css( {
- position: "static",
- zoom: 1,
- display: "block"
- } ) );
-
- // Support: IE9
- // avoid IE jump (hard set the margin)
- this.originalElement.css( margins );
-
- this._proportionallyResize();
- }
-
- this._setupHandles();
-
- if ( o.autoHide ) {
- $( this.element )
- .on( "mouseenter", function() {
- if ( o.disabled ) {
- return;
- }
- that._removeClass( "ui-resizable-autohide" );
- that._handles.show();
- } )
- .on( "mouseleave", function() {
- if ( o.disabled ) {
- return;
- }
- if ( !that.resizing ) {
- that._addClass( "ui-resizable-autohide" );
- that._handles.hide();
- }
- } );
- }
-
- this._mouseInit();
- },
-
- _destroy: function() {
-
- this._mouseDestroy();
- this._addedHandles.remove();
-
- var wrapper,
- _destroy = function( exp ) {
- $( exp )
- .removeData( "resizable" )
- .removeData( "ui-resizable" )
- .off( ".resizable" );
- };
-
- // TODO: Unwrap at same DOM position
- if ( this.elementIsWrapper ) {
- _destroy( this.element );
- wrapper = this.element;
- this.originalElement.css( {
- position: wrapper.css( "position" ),
- width: wrapper.outerWidth(),
- height: wrapper.outerHeight(),
- top: wrapper.css( "top" ),
- left: wrapper.css( "left" )
- } ).insertAfter( wrapper );
- wrapper.remove();
- }
-
- this.originalElement.css( "resize", this.originalResizeStyle );
- _destroy( this.originalElement );
-
- return this;
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
-
- switch ( key ) {
- case "handles":
- this._removeHandles();
- this._setupHandles();
- break;
- case "aspectRatio":
- this._aspectRatio = !!value;
- break;
- default:
- break;
- }
- },
-
- _setupHandles: function() {
- var o = this.options, handle, i, n, hname, axis, that = this;
- this.handles = o.handles ||
- ( !$( ".ui-resizable-handle", this.element ).length ?
- "e,s,se" : {
- n: ".ui-resizable-n",
- e: ".ui-resizable-e",
- s: ".ui-resizable-s",
- w: ".ui-resizable-w",
- se: ".ui-resizable-se",
- sw: ".ui-resizable-sw",
- ne: ".ui-resizable-ne",
- nw: ".ui-resizable-nw"
- } );
-
- this._handles = $();
- this._addedHandles = $();
- if ( this.handles.constructor === String ) {
-
- if ( this.handles === "all" ) {
- this.handles = "n,e,s,w,se,sw,ne,nw";
- }
-
- n = this.handles.split( "," );
- this.handles = {};
-
- for ( i = 0; i < n.length; i++ ) {
-
- handle = String.prototype.trim.call( n[ i ] );
- hname = "ui-resizable-" + handle;
- axis = $( "<div>" );
- this._addClass( axis, "ui-resizable-handle " + hname );
-
- axis.css( { zIndex: o.zIndex } );
-
- this.handles[ handle ] = ".ui-resizable-" + handle;
- if ( !this.element.children( this.handles[ handle ] ).length ) {
- this.element.append( axis );
- this._addedHandles = this._addedHandles.add( axis );
- }
- }
-
- }
-
- this._renderAxis = function( target ) {
-
- var i, axis, padPos, padWrapper;
-
- target = target || this.element;
-
- for ( i in this.handles ) {
-
- if ( this.handles[ i ].constructor === String ) {
- this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
- } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
- this.handles[ i ] = $( this.handles[ i ] );
- this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
- }
-
- if ( this.elementIsWrapper &&
- this.originalElement[ 0 ]
- .nodeName
- .match( /^(textarea|input|select|button)$/i ) ) {
- axis = $( this.handles[ i ], this.element );
-
- padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
- axis.outerHeight() :
- axis.outerWidth();
-
- padPos = [ "padding",
- /ne|nw|n/.test( i ) ? "Top" :
- /se|sw|s/.test( i ) ? "Bottom" :
- /^e$/.test( i ) ? "Right" : "Left" ].join( "" );
-
- target.css( padPos, padWrapper );
-
- this._proportionallyResize();
- }
-
- this._handles = this._handles.add( this.handles[ i ] );
- }
- };
-
- // TODO: make renderAxis a prototype function
- this._renderAxis( this.element );
-
- this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
- this._handles.disableSelection();
-
- this._handles.on( "mouseover", function() {
- if ( !that.resizing ) {
- if ( this.className ) {
- axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
- }
- that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
- }
- } );
-
- if ( o.autoHide ) {
- this._handles.hide();
- this._addClass( "ui-resizable-autohide" );
- }
- },
-
- _removeHandles: function() {
- this._addedHandles.remove();
- },
-
- _mouseCapture: function( event ) {
- var i, handle,
- capture = false;
-
- for ( i in this.handles ) {
- handle = $( this.handles[ i ] )[ 0 ];
- if ( handle === event.target || $.contains( handle, event.target ) ) {
- capture = true;
- }
- }
-
- return !this.options.disabled && capture;
- },
-
- _mouseStart: function( event ) {
-
- var curleft, curtop, cursor,
- o = this.options,
- el = this.element;
-
- this.resizing = true;
-
- this._renderProxy();
-
- curleft = this._num( this.helper.css( "left" ) );
- curtop = this._num( this.helper.css( "top" ) );
-
- if ( o.containment ) {
- curleft += $( o.containment ).scrollLeft() || 0;
- curtop += $( o.containment ).scrollTop() || 0;
- }
-
- this.offset = this.helper.offset();
- this.position = { left: curleft, top: curtop };
-
- this.size = this._helper ? {
- width: this.helper.width(),
- height: this.helper.height()
- } : {
- width: el.width(),
- height: el.height()
- };
-
- this.originalSize = this._helper ? {
- width: el.outerWidth(),
- height: el.outerHeight()
- } : {
- width: el.width(),
- height: el.height()
- };
-
- this.sizeDiff = {
- width: el.outerWidth() - el.width(),
- height: el.outerHeight() - el.height()
- };
-
- this.originalPosition = { left: curleft, top: curtop };
- this.originalMousePosition = { left: event.pageX, top: event.pageY };
-
- this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
- o.aspectRatio :
- ( ( this.originalSize.width / this.originalSize.height ) || 1 );
-
- cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
- $( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
-
- this._addClass( "ui-resizable-resizing" );
- this._propagate( "start", event );
- return true;
- },
-
- _mouseDrag: function( event ) {
-
- var data, props,
- smp = this.originalMousePosition,
- a = this.axis,
- dx = ( event.pageX - smp.left ) || 0,
- dy = ( event.pageY - smp.top ) || 0,
- trigger = this._change[ a ];
-
- this._updatePrevProperties();
-
- if ( !trigger ) {
- return false;
- }
-
- data = trigger.apply( this, [ event, dx, dy ] );
-
- this._updateVirtualBoundaries( event.shiftKey );
- if ( this._aspectRatio || event.shiftKey ) {
- data = this._updateRatio( data, event );
- }
-
- data = this._respectSize( data, event );
-
- this._updateCache( data );
-
- this._propagate( "resize", event );
-
- props = this._applyChanges();
-
- if ( !this._helper && this._proportionallyResizeElements.length ) {
- this._proportionallyResize();
- }
-
- if ( !$.isEmptyObject( props ) ) {
- this._updatePrevProperties();
- this._trigger( "resize", event, this.ui() );
- this._applyChanges();
- }
-
- return false;
- },
-
- _mouseStop: function( event ) {
-
- this.resizing = false;
- var pr, ista, soffseth, soffsetw, s, left, top,
- o = this.options, that = this;
-
- if ( this._helper ) {
-
- pr = this._proportionallyResizeElements;
- ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
- soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
- soffsetw = ista ? 0 : that.sizeDiff.width;
-
- s = {
- width: ( that.helper.width() - soffsetw ),
- height: ( that.helper.height() - soffseth )
- };
- left = ( parseFloat( that.element.css( "left" ) ) +
- ( that.position.left - that.originalPosition.left ) ) || null;
- top = ( parseFloat( that.element.css( "top" ) ) +
- ( that.position.top - that.originalPosition.top ) ) || null;
-
- if ( !o.animate ) {
- this.element.css( $.extend( s, { top: top, left: left } ) );
- }
-
- that.helper.height( that.size.height );
- that.helper.width( that.size.width );
-
- if ( this._helper && !o.animate ) {
- this._proportionallyResize();
- }
- }
-
- $( "body" ).css( "cursor", "auto" );
-
- this._removeClass( "ui-resizable-resizing" );
-
- this._propagate( "stop", event );
-
- if ( this._helper ) {
- this.helper.remove();
- }
-
- return false;
-
- },
-
- _updatePrevProperties: function() {
- this.prevPosition = {
- top: this.position.top,
- left: this.position.left
- };
- this.prevSize = {
- width: this.size.width,
- height: this.size.height
- };
- },
-
- _applyChanges: function() {
- var props = {};
-
- if ( this.position.top !== this.prevPosition.top ) {
- props.top = this.position.top + "px";
- }
- if ( this.position.left !== this.prevPosition.left ) {
- props.left = this.position.left + "px";
- }
- if ( this.size.width !== this.prevSize.width ) {
- props.width = this.size.width + "px";
- }
- if ( this.size.height !== this.prevSize.height ) {
- props.height = this.size.height + "px";
- }
-
- this.helper.css( props );
-
- return props;
- },
-
- _updateVirtualBoundaries: function( forceAspectRatio ) {
- var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
- o = this.options;
-
- b = {
- minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
- maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
- minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
- maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
- };
-
- if ( this._aspectRatio || forceAspectRatio ) {
- pMinWidth = b.minHeight * this.aspectRatio;
- pMinHeight = b.minWidth / this.aspectRatio;
- pMaxWidth = b.maxHeight * this.aspectRatio;
- pMaxHeight = b.maxWidth / this.aspectRatio;
-
- if ( pMinWidth > b.minWidth ) {
- b.minWidth = pMinWidth;
- }
- if ( pMinHeight > b.minHeight ) {
- b.minHeight = pMinHeight;
- }
- if ( pMaxWidth < b.maxWidth ) {
- b.maxWidth = pMaxWidth;
- }
- if ( pMaxHeight < b.maxHeight ) {
- b.maxHeight = pMaxHeight;
- }
- }
- this._vBoundaries = b;
- },
-
- _updateCache: function( data ) {
- this.offset = this.helper.offset();
- if ( this._isNumber( data.left ) ) {
- this.position.left = data.left;
- }
- if ( this._isNumber( data.top ) ) {
- this.position.top = data.top;
- }
- if ( this._isNumber( data.height ) ) {
- this.size.height = data.height;
- }
- if ( this._isNumber( data.width ) ) {
- this.size.width = data.width;
- }
- },
-
- _updateRatio: function( data ) {
-
- var cpos = this.position,
- csize = this.size,
- a = this.axis;
-
- if ( this._isNumber( data.height ) ) {
- data.width = ( data.height * this.aspectRatio );
- } else if ( this._isNumber( data.width ) ) {
- data.height = ( data.width / this.aspectRatio );
- }
-
- if ( a === "sw" ) {
- data.left = cpos.left + ( csize.width - data.width );
- data.top = null;
- }
- if ( a === "nw" ) {
- data.top = cpos.top + ( csize.height - data.height );
- data.left = cpos.left + ( csize.width - data.width );
- }
-
- return data;
- },
-
- _respectSize: function( data ) {
-
- var o = this._vBoundaries,
- a = this.axis,
- ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
- ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
- isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
- isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
- dw = this.originalPosition.left + this.originalSize.width,
- dh = this.originalPosition.top + this.originalSize.height,
- cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
- if ( isminw ) {
- data.width = o.minWidth;
- }
- if ( isminh ) {
- data.height = o.minHeight;
- }
- if ( ismaxw ) {
- data.width = o.maxWidth;
- }
- if ( ismaxh ) {
- data.height = o.maxHeight;
- }
-
- if ( isminw && cw ) {
- data.left = dw - o.minWidth;
- }
- if ( ismaxw && cw ) {
- data.left = dw - o.maxWidth;
- }
- if ( isminh && ch ) {
- data.top = dh - o.minHeight;
- }
- if ( ismaxh && ch ) {
- data.top = dh - o.maxHeight;
- }
-
- // Fixing jump error on top/left - bug #2330
- if ( !data.width && !data.height && !data.left && data.top ) {
- data.top = null;
- } else if ( !data.width && !data.height && !data.top && data.left ) {
- data.left = null;
- }
-
- return data;
- },
-
- _getPaddingPlusBorderDimensions: function( element ) {
- var i = 0,
- widths = [],
- borders = [
- element.css( "borderTopWidth" ),
- element.css( "borderRightWidth" ),
- element.css( "borderBottomWidth" ),
- element.css( "borderLeftWidth" )
- ],
- paddings = [
- element.css( "paddingTop" ),
- element.css( "paddingRight" ),
- element.css( "paddingBottom" ),
- element.css( "paddingLeft" )
- ];
-
- for ( ; i < 4; i++ ) {
- widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
- widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
- }
-
- return {
- height: widths[ 0 ] + widths[ 2 ],
- width: widths[ 1 ] + widths[ 3 ]
- };
- },
-
- _proportionallyResize: function() {
-
- if ( !this._proportionallyResizeElements.length ) {
- return;
- }
-
- var prel,
- i = 0,
- element = this.helper || this.element;
-
- for ( ; i < this._proportionallyResizeElements.length; i++ ) {
-
- prel = this._proportionallyResizeElements[ i ];
-
- // TODO: Seems like a bug to cache this.outerDimensions
- // considering that we are in a loop.
- if ( !this.outerDimensions ) {
- this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
- }
-
- prel.css( {
- height: ( element.height() - this.outerDimensions.height ) || 0,
- width: ( element.width() - this.outerDimensions.width ) || 0
- } );
-
- }
-
- },
-
- _renderProxy: function() {
-
- var el = this.element, o = this.options;
- this.elementOffset = el.offset();
-
- if ( this._helper ) {
-
- this.helper = this.helper || $( "<div></div>" ).css( { overflow: "hidden" } );
-
- this._addClass( this.helper, this._helper );
- this.helper.css( {
- width: this.element.outerWidth(),
- height: this.element.outerHeight(),
- position: "absolute",
- left: this.elementOffset.left + "px",
- top: this.elementOffset.top + "px",
- zIndex: ++o.zIndex //TODO: Don't modify option
- } );
-
- this.helper
- .appendTo( "body" )
- .disableSelection();
-
- } else {
- this.helper = this.element;
- }
-
- },
-
- _change: {
- e: function( event, dx ) {
- return { width: this.originalSize.width + dx };
- },
- w: function( event, dx ) {
- var cs = this.originalSize, sp = this.originalPosition;
- return { left: sp.left + dx, width: cs.width - dx };
- },
- n: function( event, dx, dy ) {
- var cs = this.originalSize, sp = this.originalPosition;
- return { top: sp.top + dy, height: cs.height - dy };
- },
- s: function( event, dx, dy ) {
- return { height: this.originalSize.height + dy };
- },
- se: function( event, dx, dy ) {
- return $.extend( this._change.s.apply( this, arguments ),
- this._change.e.apply( this, [ event, dx, dy ] ) );
- },
- sw: function( event, dx, dy ) {
- return $.extend( this._change.s.apply( this, arguments ),
- this._change.w.apply( this, [ event, dx, dy ] ) );
- },
- ne: function( event, dx, dy ) {
- return $.extend( this._change.n.apply( this, arguments ),
- this._change.e.apply( this, [ event, dx, dy ] ) );
- },
- nw: function( event, dx, dy ) {
- return $.extend( this._change.n.apply( this, arguments ),
- this._change.w.apply( this, [ event, dx, dy ] ) );
- }
- },
-
- _propagate: function( n, event ) {
- $.ui.plugin.call( this, n, [ event, this.ui() ] );
- if ( n !== "resize" ) {
- this._trigger( n, event, this.ui() );
- }
- },
-
- plugins: {},
-
- ui: function() {
- return {
- originalElement: this.originalElement,
- element: this.element,
- helper: this.helper,
- position: this.position,
- size: this.size,
- originalSize: this.originalSize,
- originalPosition: this.originalPosition
- };
- }
-
-} );
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add( "resizable", "animate", {
-
- stop: function( event ) {
- var that = $( this ).resizable( "instance" ),
- o = that.options,
- pr = that._proportionallyResizeElements,
- ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
- soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
- soffsetw = ista ? 0 : that.sizeDiff.width,
- style = {
- width: ( that.size.width - soffsetw ),
- height: ( that.size.height - soffseth )
- },
- left = ( parseFloat( that.element.css( "left" ) ) +
- ( that.position.left - that.originalPosition.left ) ) || null,
- top = ( parseFloat( that.element.css( "top" ) ) +
- ( that.position.top - that.originalPosition.top ) ) || null;
-
- that.element.animate(
- $.extend( style, top && left ? { top: top, left: left } : {} ), {
- duration: o.animateDuration,
- easing: o.animateEasing,
- step: function() {
-
- var data = {
- width: parseFloat( that.element.css( "width" ) ),
- height: parseFloat( that.element.css( "height" ) ),
- top: parseFloat( that.element.css( "top" ) ),
- left: parseFloat( that.element.css( "left" ) )
- };
-
- if ( pr && pr.length ) {
- $( pr[ 0 ] ).css( { width: data.width, height: data.height } );
- }
-
- // Propagating resize, and updating values for each animation step
- that._updateCache( data );
- that._propagate( "resize", event );
-
- }
- }
- );
- }
-
-} );
-
-$.ui.plugin.add( "resizable", "containment", {
-
- start: function() {
- var element, p, co, ch, cw, width, height,
- that = $( this ).resizable( "instance" ),
- o = that.options,
- el = that.element,
- oc = o.containment,
- ce = ( oc instanceof $ ) ?
- oc.get( 0 ) :
- ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
-
- if ( !ce ) {
- return;
- }
-
- that.containerElement = $( ce );
-
- if ( /document/.test( oc ) || oc === document ) {
- that.containerOffset = {
- left: 0,
- top: 0
- };
- that.containerPosition = {
- left: 0,
- top: 0
- };
-
- that.parentData = {
- element: $( document ),
- left: 0,
- top: 0,
- width: $( document ).width(),
- height: $( document ).height() || document.body.parentNode.scrollHeight
- };
- } else {
- element = $( ce );
- p = [];
- $( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
- p[ i ] = that._num( element.css( "padding" + name ) );
- } );
-
- that.containerOffset = element.offset();
- that.containerPosition = element.position();
- that.containerSize = {
- height: ( element.innerHeight() - p[ 3 ] ),
- width: ( element.innerWidth() - p[ 1 ] )
- };
-
- co = that.containerOffset;
- ch = that.containerSize.height;
- cw = that.containerSize.width;
- width = ( that._hasScroll( ce, "left" ) ? ce.scrollWidth : cw );
- height = ( that._hasScroll( ce ) ? ce.scrollHeight : ch );
-
- that.parentData = {
- element: ce,
- left: co.left,
- top: co.top,
- width: width,
- height: height
- };
- }
- },
-
- resize: function( event ) {
- var woset, hoset, isParent, isOffsetRelative,
- that = $( this ).resizable( "instance" ),
- o = that.options,
- co = that.containerOffset,
- cp = that.position,
- pRatio = that._aspectRatio || event.shiftKey,
- cop = {
- top: 0,
- left: 0
- },
- ce = that.containerElement,
- continueResize = true;
-
- if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
- cop = co;
- }
-
- if ( cp.left < ( that._helper ? co.left : 0 ) ) {
- that.size.width = that.size.width +
- ( that._helper ?
- ( that.position.left - co.left ) :
- ( that.position.left - cop.left ) );
-
- if ( pRatio ) {
- that.size.height = that.size.width / that.aspectRatio;
- continueResize = false;
- }
- that.position.left = o.helper ? co.left : 0;
- }
-
- if ( cp.top < ( that._helper ? co.top : 0 ) ) {
- that.size.height = that.size.height +
- ( that._helper ?
- ( that.position.top - co.top ) :
- that.position.top );
-
- if ( pRatio ) {
- that.size.width = that.size.height * that.aspectRatio;
- continueResize = false;
- }
- that.position.top = that._helper ? co.top : 0;
- }
-
- isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
- isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
-
- if ( isParent && isOffsetRelative ) {
- that.offset.left = that.parentData.left + that.position.left;
- that.offset.top = that.parentData.top + that.position.top;
- } else {
- that.offset.left = that.element.offset().left;
- that.offset.top = that.element.offset().top;
- }
-
- woset = Math.abs( that.sizeDiff.width +
- ( that._helper ?
- that.offset.left - cop.left :
- ( that.offset.left - co.left ) ) );
-
- hoset = Math.abs( that.sizeDiff.height +
- ( that._helper ?
- that.offset.top - cop.top :
- ( that.offset.top - co.top ) ) );
-
- if ( woset + that.size.width >= that.parentData.width ) {
- that.size.width = that.parentData.width - woset;
- if ( pRatio ) {
- that.size.height = that.size.width / that.aspectRatio;
- continueResize = false;
- }
- }
-
- if ( hoset + that.size.height >= that.parentData.height ) {
- that.size.height = that.parentData.height - hoset;
- if ( pRatio ) {
- that.size.width = that.size.height * that.aspectRatio;
- continueResize = false;
- }
- }
-
- if ( !continueResize ) {
- that.position.left = that.prevPosition.left;
- that.position.top = that.prevPosition.top;
- that.size.width = that.prevSize.width;
- that.size.height = that.prevSize.height;
- }
- },
-
- stop: function() {
- var that = $( this ).resizable( "instance" ),
- o = that.options,
- co = that.containerOffset,
- cop = that.containerPosition,
- ce = that.containerElement,
- helper = $( that.helper ),
- ho = helper.offset(),
- w = helper.outerWidth() - that.sizeDiff.width,
- h = helper.outerHeight() - that.sizeDiff.height;
-
- if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
- $( this ).css( {
- left: ho.left - cop.left - co.left,
- width: w,
- height: h
- } );
- }
-
- if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
- $( this ).css( {
- left: ho.left - cop.left - co.left,
- width: w,
- height: h
- } );
- }
- }
-} );
-
-$.ui.plugin.add( "resizable", "alsoResize", {
-
- start: function() {
- var that = $( this ).resizable( "instance" ),
- o = that.options;
-
- $( o.alsoResize ).each( function() {
- var el = $( this );
- el.data( "ui-resizable-alsoresize", {
- width: parseFloat( el.width() ), height: parseFloat( el.height() ),
- left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
- } );
- } );
- },
-
- resize: function( event, ui ) {
- var that = $( this ).resizable( "instance" ),
- o = that.options,
- os = that.originalSize,
- op = that.originalPosition,
- delta = {
- height: ( that.size.height - os.height ) || 0,
- width: ( that.size.width - os.width ) || 0,
- top: ( that.position.top - op.top ) || 0,
- left: ( that.position.left - op.left ) || 0
- };
-
- $( o.alsoResize ).each( function() {
- var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
- css = el.parents( ui.originalElement[ 0 ] ).length ?
- [ "width", "height" ] :
- [ "width", "height", "top", "left" ];
-
- $.each( css, function( i, prop ) {
- var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
- if ( sum && sum >= 0 ) {
- style[ prop ] = sum || null;
- }
- } );
-
- el.css( style );
- } );
- },
-
- stop: function() {
- $( this ).removeData( "ui-resizable-alsoresize" );
- }
-} );
-
-$.ui.plugin.add( "resizable", "ghost", {
-
- start: function() {
-
- var that = $( this ).resizable( "instance" ), cs = that.size;
-
- that.ghost = that.originalElement.clone();
- that.ghost.css( {
- opacity: 0.25,
- display: "block",
- position: "relative",
- height: cs.height,
- width: cs.width,
- margin: 0,
- left: 0,
- top: 0
- } );
-
- that._addClass( that.ghost, "ui-resizable-ghost" );
-
- // DEPRECATED
- // TODO: remove after 1.12
- if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
-
- // Ghost option
- that.ghost.addClass( this.options.ghost );
- }
-
- that.ghost.appendTo( that.helper );
-
- },
-
- resize: function() {
- var that = $( this ).resizable( "instance" );
- if ( that.ghost ) {
- that.ghost.css( {
- position: "relative",
- height: that.size.height,
- width: that.size.width
- } );
- }
- },
-
- stop: function() {
- var that = $( this ).resizable( "instance" );
- if ( that.ghost && that.helper ) {
- that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
- }
- }
-
-} );
-
-$.ui.plugin.add( "resizable", "grid", {
-
- resize: function() {
- var outerDimensions,
- that = $( this ).resizable( "instance" ),
- o = that.options,
- cs = that.size,
- os = that.originalSize,
- op = that.originalPosition,
- a = that.axis,
- grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
- gridX = ( grid[ 0 ] || 1 ),
- gridY = ( grid[ 1 ] || 1 ),
- ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
- oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
- newWidth = os.width + ox,
- newHeight = os.height + oy,
- isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
- isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
- isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
- isMinHeight = o.minHeight && ( o.minHeight > newHeight );
-
- o.grid = grid;
-
- if ( isMinWidth ) {
- newWidth += gridX;
- }
- if ( isMinHeight ) {
- newHeight += gridY;
- }
- if ( isMaxWidth ) {
- newWidth -= gridX;
- }
- if ( isMaxHeight ) {
- newHeight -= gridY;
- }
-
- if ( /^(se|s|e)$/.test( a ) ) {
- that.size.width = newWidth;
- that.size.height = newHeight;
- } else if ( /^(ne)$/.test( a ) ) {
- that.size.width = newWidth;
- that.size.height = newHeight;
- that.position.top = op.top - oy;
- } else if ( /^(sw)$/.test( a ) ) {
- that.size.width = newWidth;
- that.size.height = newHeight;
- that.position.left = op.left - ox;
- } else {
- if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
- outerDimensions = that._getPaddingPlusBorderDimensions( this );
- }
-
- if ( newHeight - gridY > 0 ) {
- that.size.height = newHeight;
- that.position.top = op.top - oy;
- } else {
- newHeight = gridY - outerDimensions.height;
- that.size.height = newHeight;
- that.position.top = op.top + os.height - newHeight;
- }
- if ( newWidth - gridX > 0 ) {
- that.size.width = newWidth;
- that.position.left = op.left - ox;
- } else {
- newWidth = gridX - outerDimensions.width;
- that.size.width = newWidth;
- that.position.left = op.left + os.width - newWidth;
- }
- }
- }
-
-} );
-
-var widgetsResizable = $.ui.resizable;
-
-
-/*!
- * jQuery UI Dialog 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Dialog
-//>>group: Widgets
-//>>description: Displays customizable dialog windows.
-//>>docs: http://api.jqueryui.com/dialog/
-//>>demos: http://jqueryui.com/dialog/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/dialog.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.dialog", {
- version: "1.13.1",
- options: {
- appendTo: "body",
- autoOpen: true,
- buttons: [],
- classes: {
- "ui-dialog": "ui-corner-all",
- "ui-dialog-titlebar": "ui-corner-all"
- },
- closeOnEscape: true,
- closeText: "Close",
- draggable: true,
- hide: null,
- height: "auto",
- maxHeight: null,
- maxWidth: null,
- minHeight: 150,
- minWidth: 150,
- modal: false,
- position: {
- my: "center",
- at: "center",
- of: window,
- collision: "fit",
-
- // Ensure the titlebar is always visible
- using: function( pos ) {
- var topOffset = $( this ).css( pos ).offset().top;
- if ( topOffset < 0 ) {
- $( this ).css( "top", pos.top - topOffset );
- }
- }
- },
- resizable: true,
- show: null,
- title: null,
- width: 300,
-
- // Callbacks
- beforeClose: null,
- close: null,
- drag: null,
- dragStart: null,
- dragStop: null,
- focus: null,
- open: null,
- resize: null,
- resizeStart: null,
- resizeStop: null
- },
-
- sizeRelatedOptions: {
- buttons: true,
- height: true,
- maxHeight: true,
- maxWidth: true,
- minHeight: true,
- minWidth: true,
- width: true
- },
-
- resizableRelatedOptions: {
- maxHeight: true,
- maxWidth: true,
- minHeight: true,
- minWidth: true
- },
-
- _create: function() {
- this.originalCss = {
- display: this.element[ 0 ].style.display,
- width: this.element[ 0 ].style.width,
- minHeight: this.element[ 0 ].style.minHeight,
- maxHeight: this.element[ 0 ].style.maxHeight,
- height: this.element[ 0 ].style.height
- };
- this.originalPosition = {
- parent: this.element.parent(),
- index: this.element.parent().children().index( this.element )
- };
- this.originalTitle = this.element.attr( "title" );
- if ( this.options.title == null && this.originalTitle != null ) {
- this.options.title = this.originalTitle;
- }
-
- // Dialogs can't be disabled
- if ( this.options.disabled ) {
- this.options.disabled = false;
- }
-
- this._createWrapper();
-
- this.element
- .show()
- .removeAttr( "title" )
- .appendTo( this.uiDialog );
-
- this._addClass( "ui-dialog-content", "ui-widget-content" );
-
- this._createTitlebar();
- this._createButtonPane();
-
- if ( this.options.draggable && $.fn.draggable ) {
- this._makeDraggable();
- }
- if ( this.options.resizable && $.fn.resizable ) {
- this._makeResizable();
- }
-
- this._isOpen = false;
-
- this._trackFocus();
- },
-
- _init: function() {
- if ( this.options.autoOpen ) {
- this.open();
- }
- },
-
- _appendTo: function() {
- var element = this.options.appendTo;
- if ( element && ( element.jquery || element.nodeType ) ) {
- return $( element );
- }
- return this.document.find( element || "body" ).eq( 0 );
- },
-
- _destroy: function() {
- var next,
- originalPosition = this.originalPosition;
-
- this._untrackInstance();
- this._destroyOverlay();
-
- this.element
- .removeUniqueId()
- .css( this.originalCss )
-
- // Without detaching first, the following becomes really slow
- .detach();
-
- this.uiDialog.remove();
-
- if ( this.originalTitle ) {
- this.element.attr( "title", this.originalTitle );
- }
-
- next = originalPosition.parent.children().eq( originalPosition.index );
-
- // Don't try to place the dialog next to itself (#8613)
- if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
- next.before( this.element );
- } else {
- originalPosition.parent.append( this.element );
- }
- },
-
- widget: function() {
- return this.uiDialog;
- },
-
- disable: $.noop,
- enable: $.noop,
-
- close: function( event ) {
- var that = this;
-
- if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
- return;
- }
-
- this._isOpen = false;
- this._focusedElement = null;
- this._destroyOverlay();
- this._untrackInstance();
-
- if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
-
- // Hiding a focused element doesn't trigger blur in WebKit
- // so in case we have nothing to focus on, explicitly blur the active element
- // https://bugs.webkit.org/show_bug.cgi?id=47182
- $.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
- }
-
- this._hide( this.uiDialog, this.options.hide, function() {
- that._trigger( "close", event );
- } );
- },
-
- isOpen: function() {
- return this._isOpen;
- },
-
- moveToTop: function() {
- this._moveToTop();
- },
-
- _moveToTop: function( event, silent ) {
- var moved = false,
- zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
- return +$( this ).css( "z-index" );
- } ).get(),
- zIndexMax = Math.max.apply( null, zIndices );
-
- if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
- this.uiDialog.css( "z-index", zIndexMax + 1 );
- moved = true;
- }
-
- if ( moved && !silent ) {
- this._trigger( "focus", event );
- }
- return moved;
- },
-
- open: function() {
- var that = this;
- if ( this._isOpen ) {
- if ( this._moveToTop() ) {
- this._focusTabbable();
- }
- return;
- }
-
- this._isOpen = true;
- this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
-
- this._size();
- this._position();
- this._createOverlay();
- this._moveToTop( null, true );
-
- // Ensure the overlay is moved to the top with the dialog, but only when
- // opening. The overlay shouldn't move after the dialog is open so that
- // modeless dialogs opened after the modal dialog stack properly.
- if ( this.overlay ) {
- this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
- }
-
- this._show( this.uiDialog, this.options.show, function() {
- that._focusTabbable();
- that._trigger( "focus" );
- } );
-
- // Track the dialog immediately upon opening in case a focus event
- // somehow occurs outside of the dialog before an element inside the
- // dialog is focused (#10152)
- this._makeFocusTarget();
-
- this._trigger( "open" );
- },
-
- _focusTabbable: function() {
-
- // Set focus to the first match:
- // 1. An element that was focused previously
- // 2. First element inside the dialog matching [autofocus]
- // 3. Tabbable element inside the content element
- // 4. Tabbable element inside the buttonpane
- // 5. The close button
- // 6. The dialog itself
- var hasFocus = this._focusedElement;
- if ( !hasFocus ) {
- hasFocus = this.element.find( "[autofocus]" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.element.find( ":tabbable" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.uiDialog;
- }
- hasFocus.eq( 0 ).trigger( "focus" );
- },
-
- _restoreTabbableFocus: function() {
- var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
- isActive = this.uiDialog[ 0 ] === activeElement ||
- $.contains( this.uiDialog[ 0 ], activeElement );
- if ( !isActive ) {
- this._focusTabbable();
- }
- },
-
- _keepFocus: function( event ) {
- event.preventDefault();
- this._restoreTabbableFocus();
-
- // support: IE
- // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
- // so we check again later
- this._delay( this._restoreTabbableFocus );
- },
-
- _createWrapper: function() {
- this.uiDialog = $( "<div>" )
- .hide()
- .attr( {
-
- // Setting tabIndex makes the div focusable
- tabIndex: -1,
- role: "dialog"
- } )
- .appendTo( this._appendTo() );
-
- this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
- this._on( this.uiDialog, {
- keydown: function( event ) {
- if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
- event.keyCode === $.ui.keyCode.ESCAPE ) {
- event.preventDefault();
- this.close( event );
- return;
- }
-
- // Prevent tabbing out of dialogs
- if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
- return;
- }
- var tabbables = this.uiDialog.find( ":tabbable" ),
- first = tabbables.first(),
- last = tabbables.last();
-
- if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
- !event.shiftKey ) {
- this._delay( function() {
- first.trigger( "focus" );
- } );
- event.preventDefault();
- } else if ( ( event.target === first[ 0 ] ||
- event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
- this._delay( function() {
- last.trigger( "focus" );
- } );
- event.preventDefault();
- }
- },
- mousedown: function( event ) {
- if ( this._moveToTop( event ) ) {
- this._focusTabbable();
- }
- }
- } );
-
- // We assume that any existing aria-describedby attribute means
- // that the dialog content is marked up properly
- // otherwise we brute force the content as the description
- if ( !this.element.find( "[aria-describedby]" ).length ) {
- this.uiDialog.attr( {
- "aria-describedby": this.element.uniqueId().attr( "id" )
- } );
- }
- },
-
- _createTitlebar: function() {
- var uiDialogTitle;
-
- this.uiDialogTitlebar = $( "<div>" );
- this._addClass( this.uiDialogTitlebar,
- "ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
- this._on( this.uiDialogTitlebar, {
- mousedown: function( event ) {
-
- // Don't prevent click on close button (#8838)
- // Focusing a dialog that is partially scrolled out of view
- // causes the browser to scroll it into view, preventing the click event
- if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
-
- // Dialog isn't getting focus when dragging (#8063)
- this.uiDialog.trigger( "focus" );
- }
- }
- } );
-
- // Support: IE
- // Use type="button" to prevent enter keypresses in textboxes from closing the
- // dialog in IE (#9312)
- this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
- .button( {
- label: $( "<a>" ).text( this.options.closeText ).html(),
- icon: "ui-icon-closethick",
- showLabel: false
- } )
- .appendTo( this.uiDialogTitlebar );
-
- this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
- this._on( this.uiDialogTitlebarClose, {
- click: function( event ) {
- event.preventDefault();
- this.close( event );
- }
- } );
-
- uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
- this._addClass( uiDialogTitle, "ui-dialog-title" );
- this._title( uiDialogTitle );
-
- this.uiDialogTitlebar.prependTo( this.uiDialog );
-
- this.uiDialog.attr( {
- "aria-labelledby": uiDialogTitle.attr( "id" )
- } );
- },
-
- _title: function( title ) {
- if ( this.options.title ) {
- title.text( this.options.title );
- } else {
- title.html( "&#160;" );
- }
- },
-
- _createButtonPane: function() {
- this.uiDialogButtonPane = $( "<div>" );
- this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
- "ui-widget-content ui-helper-clearfix" );
-
- this.uiButtonSet = $( "<div>" )
- .appendTo( this.uiDialogButtonPane );
- this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
-
- this._createButtons();
- },
-
- _createButtons: function() {
- var that = this,
- buttons = this.options.buttons;
-
- // If we already have a button pane, remove it
- this.uiDialogButtonPane.remove();
- this.uiButtonSet.empty();
-
- if ( $.isEmptyObject( buttons ) || ( Array.isArray( buttons ) && !buttons.length ) ) {
- this._removeClass( this.uiDialog, "ui-dialog-buttons" );
- return;
- }
-
- $.each( buttons, function( name, props ) {
- var click, buttonOptions;
- props = typeof props === "function" ?
- { click: props, text: name } :
- props;
-
- // Default to a non-submitting button
- props = $.extend( { type: "button" }, props );
-
- // Change the context for the click callback to be the main element
- click = props.click;
- buttonOptions = {
- icon: props.icon,
- iconPosition: props.iconPosition,
- showLabel: props.showLabel,
-
- // Deprecated options
- icons: props.icons,
- text: props.text
- };
-
- delete props.click;
- delete props.icon;
- delete props.iconPosition;
- delete props.showLabel;
-
- // Deprecated options
- delete props.icons;
- if ( typeof props.text === "boolean" ) {
- delete props.text;
- }
-
- $( "<button></button>", props )
- .button( buttonOptions )
- .appendTo( that.uiButtonSet )
- .on( "click", function() {
- click.apply( that.element[ 0 ], arguments );
- } );
- } );
- this._addClass( this.uiDialog, "ui-dialog-buttons" );
- this.uiDialogButtonPane.appendTo( this.uiDialog );
- },
-
- _makeDraggable: function() {
- var that = this,
- options = this.options;
-
- function filteredUi( ui ) {
- return {
- position: ui.position,
- offset: ui.offset
- };
- }
-
- this.uiDialog.draggable( {
- cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
- handle: ".ui-dialog-titlebar",
- containment: "document",
- start: function( event, ui ) {
- that._addClass( $( this ), "ui-dialog-dragging" );
- that._blockFrames();
- that._trigger( "dragStart", event, filteredUi( ui ) );
- },
- drag: function( event, ui ) {
- that._trigger( "drag", event, filteredUi( ui ) );
- },
- stop: function( event, ui ) {
- var left = ui.offset.left - that.document.scrollLeft(),
- top = ui.offset.top - that.document.scrollTop();
-
- options.position = {
- my: "left top",
- at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
- "top" + ( top >= 0 ? "+" : "" ) + top,
- of: that.window
- };
- that._removeClass( $( this ), "ui-dialog-dragging" );
- that._unblockFrames();
- that._trigger( "dragStop", event, filteredUi( ui ) );
- }
- } );
- },
-
- _makeResizable: function() {
- var that = this,
- options = this.options,
- handles = options.resizable,
-
- // .ui-resizable has position: relative defined in the stylesheet
- // but dialogs have to use absolute or fixed positioning
- position = this.uiDialog.css( "position" ),
- resizeHandles = typeof handles === "string" ?
- handles :
- "n,e,s,w,se,sw,ne,nw";
-
- function filteredUi( ui ) {
- return {
- originalPosition: ui.originalPosition,
- originalSize: ui.originalSize,
- position: ui.position,
- size: ui.size
- };
- }
-
- this.uiDialog.resizable( {
- cancel: ".ui-dialog-content",
- containment: "document",
- alsoResize: this.element,
- maxWidth: options.maxWidth,
- maxHeight: options.maxHeight,
- minWidth: options.minWidth,
- minHeight: this._minHeight(),
- handles: resizeHandles,
- start: function( event, ui ) {
- that._addClass( $( this ), "ui-dialog-resizing" );
- that._blockFrames();
- that._trigger( "resizeStart", event, filteredUi( ui ) );
- },
- resize: function( event, ui ) {
- that._trigger( "resize", event, filteredUi( ui ) );
- },
- stop: function( event, ui ) {
- var offset = that.uiDialog.offset(),
- left = offset.left - that.document.scrollLeft(),
- top = offset.top - that.document.scrollTop();
-
- options.height = that.uiDialog.height();
- options.width = that.uiDialog.width();
- options.position = {
- my: "left top",
- at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
- "top" + ( top >= 0 ? "+" : "" ) + top,
- of: that.window
- };
- that._removeClass( $( this ), "ui-dialog-resizing" );
- that._unblockFrames();
- that._trigger( "resizeStop", event, filteredUi( ui ) );
- }
- } )
- .css( "position", position );
- },
-
- _trackFocus: function() {
- this._on( this.widget(), {
- focusin: function( event ) {
- this._makeFocusTarget();
- this._focusedElement = $( event.target );
- }
- } );
- },
-
- _makeFocusTarget: function() {
- this._untrackInstance();
- this._trackingInstances().unshift( this );
- },
-
- _untrackInstance: function() {
- var instances = this._trackingInstances(),
- exists = $.inArray( this, instances );
- if ( exists !== -1 ) {
- instances.splice( exists, 1 );
- }
- },
-
- _trackingInstances: function() {
- var instances = this.document.data( "ui-dialog-instances" );
- if ( !instances ) {
- instances = [];
- this.document.data( "ui-dialog-instances", instances );
- }
- return instances;
- },
-
- _minHeight: function() {
- var options = this.options;
-
- return options.height === "auto" ?
- options.minHeight :
- Math.min( options.minHeight, options.height );
- },
-
- _position: function() {
-
- // Need to show the dialog to get the actual offset in the position plugin
- var isVisible = this.uiDialog.is( ":visible" );
- if ( !isVisible ) {
- this.uiDialog.show();
- }
- this.uiDialog.position( this.options.position );
- if ( !isVisible ) {
- this.uiDialog.hide();
- }
- },
-
- _setOptions: function( options ) {
- var that = this,
- resize = false,
- resizableOptions = {};
-
- $.each( options, function( key, value ) {
- that._setOption( key, value );
-
- if ( key in that.sizeRelatedOptions ) {
- resize = true;
- }
- if ( key in that.resizableRelatedOptions ) {
- resizableOptions[ key ] = value;
- }
- } );
-
- if ( resize ) {
- this._size();
- this._position();
- }
- if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
- this.uiDialog.resizable( "option", resizableOptions );
- }
- },
-
- _setOption: function( key, value ) {
- var isDraggable, isResizable,
- uiDialog = this.uiDialog;
-
- if ( key === "disabled" ) {
- return;
- }
-
- this._super( key, value );
-
- if ( key === "appendTo" ) {
- this.uiDialog.appendTo( this._appendTo() );
- }
-
- if ( key === "buttons" ) {
- this._createButtons();
- }
-
- if ( key === "closeText" ) {
- this.uiDialogTitlebarClose.button( {
-
- // Ensure that we always pass a string
- label: $( "<a>" ).text( "" + this.options.closeText ).html()
- } );
- }
-
- if ( key === "draggable" ) {
- isDraggable = uiDialog.is( ":data(ui-draggable)" );
- if ( isDraggable && !value ) {
- uiDialog.draggable( "destroy" );
- }
-
- if ( !isDraggable && value ) {
- this._makeDraggable();
- }
- }
-
- if ( key === "position" ) {
- this._position();
- }
-
- if ( key === "resizable" ) {
-
- // currently resizable, becoming non-resizable
- isResizable = uiDialog.is( ":data(ui-resizable)" );
- if ( isResizable && !value ) {
- uiDialog.resizable( "destroy" );
- }
-
- // Currently resizable, changing handles
- if ( isResizable && typeof value === "string" ) {
- uiDialog.resizable( "option", "handles", value );
- }
-
- // Currently non-resizable, becoming resizable
- if ( !isResizable && value !== false ) {
- this._makeResizable();
- }
- }
-
- if ( key === "title" ) {
- this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
- }
- },
-
- _size: function() {
-
- // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
- // divs will both have width and height set, so we need to reset them
- var nonContentHeight, minContentHeight, maxContentHeight,
- options = this.options;
-
- // Reset content sizing
- this.element.show().css( {
- width: "auto",
- minHeight: 0,
- maxHeight: "none",
- height: 0
- } );
-
- if ( options.minWidth > options.width ) {
- options.width = options.minWidth;
- }
-
- // Reset wrapper sizing
- // determine the height of all the non-content elements
- nonContentHeight = this.uiDialog.css( {
- height: "auto",
- width: options.width
- } )
- .outerHeight();
- minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
- maxContentHeight = typeof options.maxHeight === "number" ?
- Math.max( 0, options.maxHeight - nonContentHeight ) :
- "none";
-
- if ( options.height === "auto" ) {
- this.element.css( {
- minHeight: minContentHeight,
- maxHeight: maxContentHeight,
- height: "auto"
- } );
- } else {
- this.element.height( Math.max( 0, options.height - nonContentHeight ) );
- }
-
- if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
- this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
- }
- },
-
- _blockFrames: function() {
- this.iframeBlocks = this.document.find( "iframe" ).map( function() {
- var iframe = $( this );
-
- return $( "<div>" )
- .css( {
- position: "absolute",
- width: iframe.outerWidth(),
- height: iframe.outerHeight()
- } )
- .appendTo( iframe.parent() )
- .offset( iframe.offset() )[ 0 ];
- } );
- },
-
- _unblockFrames: function() {
- if ( this.iframeBlocks ) {
- this.iframeBlocks.remove();
- delete this.iframeBlocks;
- }
- },
-
- _allowInteraction: function( event ) {
- if ( $( event.target ).closest( ".ui-dialog" ).length ) {
- return true;
- }
-
- // TODO: Remove hack when datepicker implements
- // the .ui-front logic (#8989)
- return !!$( event.target ).closest( ".ui-datepicker" ).length;
- },
-
- _createOverlay: function() {
- if ( !this.options.modal ) {
- return;
- }
-
- var jqMinor = $.fn.jquery.substring( 0, 4 );
-
- // We use a delay in case the overlay is created from an
- // event that we're going to be cancelling (#2804)
- var isOpening = true;
- this._delay( function() {
- isOpening = false;
- } );
-
- if ( !this.document.data( "ui-dialog-overlays" ) ) {
-
- // Prevent use of anchors and inputs
- // This doesn't use `_on()` because it is a shared event handler
- // across all open modal dialogs.
- this.document.on( "focusin.ui-dialog", function( event ) {
- if ( isOpening ) {
- return;
- }
-
- var instance = this._trackingInstances()[ 0 ];
- if ( !instance._allowInteraction( event ) ) {
- event.preventDefault();
- instance._focusTabbable();
-
- // Support: jQuery >=3.4 <3.6 only
- // Focus re-triggering in jQuery 3.4/3.5 makes the original element
- // have its focus event propagated last, breaking the re-targeting.
- // Trigger focus in a delay in addition if needed to avoid the issue
- // See https://github.com/jquery/jquery/issues/4382
- if ( jqMinor === "3.4." || jqMinor === "3.5." ) {
- instance._delay( instance._restoreTabbableFocus );
- }
- }
- }.bind( this ) );
- }
-
- this.overlay = $( "<div>" )
- .appendTo( this._appendTo() );
-
- this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
- this._on( this.overlay, {
- mousedown: "_keepFocus"
- } );
- this.document.data( "ui-dialog-overlays",
- ( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
- },
-
- _destroyOverlay: function() {
- if ( !this.options.modal ) {
- return;
- }
-
- if ( this.overlay ) {
- var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
-
- if ( !overlays ) {
- this.document.off( "focusin.ui-dialog" );
- this.document.removeData( "ui-dialog-overlays" );
- } else {
- this.document.data( "ui-dialog-overlays", overlays );
- }
-
- this.overlay.remove();
- this.overlay = null;
- }
- }
-} );
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for dialogClass option
- $.widget( "ui.dialog", $.ui.dialog, {
- options: {
- dialogClass: ""
- },
- _createWrapper: function() {
- this._super();
- this.uiDialog.addClass( this.options.dialogClass );
- },
- _setOption: function( key, value ) {
- if ( key === "dialogClass" ) {
- this.uiDialog
- .removeClass( this.options.dialogClass )
- .addClass( value );
- }
- this._superApply( arguments );
- }
- } );
-}
-
-var widgetsDialog = $.ui.dialog;
-
-
-/*!
- * jQuery UI Droppable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Droppable
-//>>group: Interactions
-//>>description: Enables drop targets for draggable elements.
-//>>docs: http://api.jqueryui.com/droppable/
-//>>demos: http://jqueryui.com/droppable/
-
-
-$.widget( "ui.droppable", {
- version: "1.13.1",
- widgetEventPrefix: "drop",
- options: {
- accept: "*",
- addClasses: true,
- greedy: false,
- scope: "default",
- tolerance: "intersect",
-
- // Callbacks
- activate: null,
- deactivate: null,
- drop: null,
- out: null,
- over: null
- },
- _create: function() {
-
- var proportions,
- o = this.options,
- accept = o.accept;
-
- this.isover = false;
- this.isout = true;
-
- this.accept = typeof accept === "function" ? accept : function( d ) {
- return d.is( accept );
- };
-
- this.proportions = function( /* valueToWrite */ ) {
- if ( arguments.length ) {
-
- // Store the droppable's proportions
- proportions = arguments[ 0 ];
- } else {
-
- // Retrieve or derive the droppable's proportions
- return proportions ?
- proportions :
- proportions = {
- width: this.element[ 0 ].offsetWidth,
- height: this.element[ 0 ].offsetHeight
- };
- }
- };
-
- this._addToManager( o.scope );
-
- if ( o.addClasses ) {
- this._addClass( "ui-droppable" );
- }
-
- },
-
- _addToManager: function( scope ) {
-
- // Add the reference and positions to the manager
- $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
- $.ui.ddmanager.droppables[ scope ].push( this );
- },
-
- _splice: function( drop ) {
- var i = 0;
- for ( ; i < drop.length; i++ ) {
- if ( drop[ i ] === this ) {
- drop.splice( i, 1 );
- }
- }
- },
-
- _destroy: function() {
- var drop = $.ui.ddmanager.droppables[ this.options.scope ];
-
- this._splice( drop );
- },
-
- _setOption: function( key, value ) {
-
- if ( key === "accept" ) {
- this.accept = typeof value === "function" ? value : function( d ) {
- return d.is( value );
- };
- } else if ( key === "scope" ) {
- var drop = $.ui.ddmanager.droppables[ this.options.scope ];
-
- this._splice( drop );
- this._addToManager( value );
- }
-
- this._super( key, value );
- },
-
- _activate: function( event ) {
- var draggable = $.ui.ddmanager.current;
-
- this._addActiveClass();
- if ( draggable ) {
- this._trigger( "activate", event, this.ui( draggable ) );
- }
- },
-
- _deactivate: function( event ) {
- var draggable = $.ui.ddmanager.current;
-
- this._removeActiveClass();
- if ( draggable ) {
- this._trigger( "deactivate", event, this.ui( draggable ) );
- }
- },
-
- _over: function( event ) {
-
- var draggable = $.ui.ddmanager.current;
-
- // Bail if draggable and droppable are same element
- if ( !draggable || ( draggable.currentItem ||
- draggable.element )[ 0 ] === this.element[ 0 ] ) {
- return;
- }
-
- if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
- draggable.element ) ) ) {
- this._addHoverClass();
- this._trigger( "over", event, this.ui( draggable ) );
- }
-
- },
-
- _out: function( event ) {
-
- var draggable = $.ui.ddmanager.current;
-
- // Bail if draggable and droppable are same element
- if ( !draggable || ( draggable.currentItem ||
- draggable.element )[ 0 ] === this.element[ 0 ] ) {
- return;
- }
-
- if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
- draggable.element ) ) ) {
- this._removeHoverClass();
- this._trigger( "out", event, this.ui( draggable ) );
- }
-
- },
-
- _drop: function( event, custom ) {
-
- var draggable = custom || $.ui.ddmanager.current,
- childrenIntersection = false;
-
- // Bail if draggable and droppable are same element
- if ( !draggable || ( draggable.currentItem ||
- draggable.element )[ 0 ] === this.element[ 0 ] ) {
- return false;
- }
-
- this.element
- .find( ":data(ui-droppable)" )
- .not( ".ui-draggable-dragging" )
- .each( function() {
- var inst = $( this ).droppable( "instance" );
- if (
- inst.options.greedy &&
- !inst.options.disabled &&
- inst.options.scope === draggable.options.scope &&
- inst.accept.call(
- inst.element[ 0 ], ( draggable.currentItem || draggable.element )
- ) &&
- $.ui.intersect(
- draggable,
- $.extend( inst, { offset: inst.element.offset() } ),
- inst.options.tolerance, event
- )
- ) {
- childrenIntersection = true;
- return false;
- }
- } );
- if ( childrenIntersection ) {
- return false;
- }
-
- if ( this.accept.call( this.element[ 0 ],
- ( draggable.currentItem || draggable.element ) ) ) {
- this._removeActiveClass();
- this._removeHoverClass();
-
- this._trigger( "drop", event, this.ui( draggable ) );
- return this.element;
- }
-
- return false;
-
- },
-
- ui: function( c ) {
- return {
- draggable: ( c.currentItem || c.element ),
- helper: c.helper,
- position: c.position,
- offset: c.positionAbs
- };
- },
-
- // Extension points just to make backcompat sane and avoid duplicating logic
- // TODO: Remove in 1.14 along with call to it below
- _addHoverClass: function() {
- this._addClass( "ui-droppable-hover" );
- },
-
- _removeHoverClass: function() {
- this._removeClass( "ui-droppable-hover" );
- },
-
- _addActiveClass: function() {
- this._addClass( "ui-droppable-active" );
- },
-
- _removeActiveClass: function() {
- this._removeClass( "ui-droppable-active" );
- }
-} );
-
-$.ui.intersect = ( function() {
- function isOverAxis( x, reference, size ) {
- return ( x >= reference ) && ( x < ( reference + size ) );
- }
-
- return function( draggable, droppable, toleranceMode, event ) {
-
- if ( !droppable.offset ) {
- return false;
- }
-
- var x1 = ( draggable.positionAbs ||
- draggable.position.absolute ).left + draggable.margins.left,
- y1 = ( draggable.positionAbs ||
- draggable.position.absolute ).top + draggable.margins.top,
- x2 = x1 + draggable.helperProportions.width,
- y2 = y1 + draggable.helperProportions.height,
- l = droppable.offset.left,
- t = droppable.offset.top,
- r = l + droppable.proportions().width,
- b = t + droppable.proportions().height;
-
- switch ( toleranceMode ) {
- case "fit":
- return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
- case "intersect":
- return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
- x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
- t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
- y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
- case "pointer":
- return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
- isOverAxis( event.pageX, l, droppable.proportions().width );
- case "touch":
- return (
- ( y1 >= t && y1 <= b ) || // Top edge touching
- ( y2 >= t && y2 <= b ) || // Bottom edge touching
- ( y1 < t && y2 > b ) // Surrounded vertically
- ) && (
- ( x1 >= l && x1 <= r ) || // Left edge touching
- ( x2 >= l && x2 <= r ) || // Right edge touching
- ( x1 < l && x2 > r ) // Surrounded horizontally
- );
- default:
- return false;
- }
- };
-} )();
-
-/*
- This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
- current: null,
- droppables: { "default": [] },
- prepareOffsets: function( t, event ) {
-
- var i, j,
- m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
- type = event ? event.type : null, // workaround for #2317
- list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
-
- droppablesLoop: for ( i = 0; i < m.length; i++ ) {
-
- // No disabled and non-accepted
- if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
- ( t.currentItem || t.element ) ) ) ) {
- continue;
- }
-
- // Filter out elements in the current dragged item
- for ( j = 0; j < list.length; j++ ) {
- if ( list[ j ] === m[ i ].element[ 0 ] ) {
- m[ i ].proportions().height = 0;
- continue droppablesLoop;
- }
- }
-
- m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
- if ( !m[ i ].visible ) {
- continue;
- }
-
- // Activate the droppable if used directly from draggables
- if ( type === "mousedown" ) {
- m[ i ]._activate.call( m[ i ], event );
- }
-
- m[ i ].offset = m[ i ].element.offset();
- m[ i ].proportions( {
- width: m[ i ].element[ 0 ].offsetWidth,
- height: m[ i ].element[ 0 ].offsetHeight
- } );
-
- }
-
- },
- drop: function( draggable, event ) {
-
- var dropped = false;
-
- // Create a copy of the droppables in case the list changes during the drop (#9116)
- $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
-
- if ( !this.options ) {
- return;
- }
- if ( !this.options.disabled && this.visible &&
- $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
- dropped = this._drop.call( this, event ) || dropped;
- }
-
- if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
- ( draggable.currentItem || draggable.element ) ) ) {
- this.isout = true;
- this.isover = false;
- this._deactivate.call( this, event );
- }
-
- } );
- return dropped;
-
- },
- dragStart: function( draggable, event ) {
-
- // Listen for scrolling so that if the dragging causes scrolling the position of the
- // droppables can be recalculated (see #5003)
- draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
- if ( !draggable.options.refreshPositions ) {
- $.ui.ddmanager.prepareOffsets( draggable, event );
- }
- } );
- },
- drag: function( draggable, event ) {
-
- // If you have a highly dynamic page, you might try this option. It renders positions
- // every time you move the mouse.
- if ( draggable.options.refreshPositions ) {
- $.ui.ddmanager.prepareOffsets( draggable, event );
- }
-
- // Run through all droppables and check their positions based on specific tolerance options
- $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
-
- if ( this.options.disabled || this.greedyChild || !this.visible ) {
- return;
- }
-
- var parentInstance, scope, parent,
- intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
- c = !intersects && this.isover ?
- "isout" :
- ( intersects && !this.isover ? "isover" : null );
- if ( !c ) {
- return;
- }
-
- if ( this.options.greedy ) {
-
- // find droppable parents with same scope
- scope = this.options.scope;
- parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
- return $( this ).droppable( "instance" ).options.scope === scope;
- } );
-
- if ( parent.length ) {
- parentInstance = $( parent[ 0 ] ).droppable( "instance" );
- parentInstance.greedyChild = ( c === "isover" );
- }
- }
-
- // We just moved into a greedy child
- if ( parentInstance && c === "isover" ) {
- parentInstance.isover = false;
- parentInstance.isout = true;
- parentInstance._out.call( parentInstance, event );
- }
-
- this[ c ] = true;
- this[ c === "isout" ? "isover" : "isout" ] = false;
- this[ c === "isover" ? "_over" : "_out" ].call( this, event );
-
- // We just moved out of a greedy child
- if ( parentInstance && c === "isout" ) {
- parentInstance.isout = false;
- parentInstance.isover = true;
- parentInstance._over.call( parentInstance, event );
- }
- } );
-
- },
- dragStop: function( draggable, event ) {
- draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
-
- // Call prepareOffsets one final time since IE does not fire return scroll events when
- // overflow was caused by drag (see #5003)
- if ( !draggable.options.refreshPositions ) {
- $.ui.ddmanager.prepareOffsets( draggable, event );
- }
- }
-};
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for activeClass and hoverClass options
- $.widget( "ui.droppable", $.ui.droppable, {
- options: {
- hoverClass: false,
- activeClass: false
- },
- _addActiveClass: function() {
- this._super();
- if ( this.options.activeClass ) {
- this.element.addClass( this.options.activeClass );
- }
- },
- _removeActiveClass: function() {
- this._super();
- if ( this.options.activeClass ) {
- this.element.removeClass( this.options.activeClass );
- }
- },
- _addHoverClass: function() {
- this._super();
- if ( this.options.hoverClass ) {
- this.element.addClass( this.options.hoverClass );
- }
- },
- _removeHoverClass: function() {
- this._super();
- if ( this.options.hoverClass ) {
- this.element.removeClass( this.options.hoverClass );
- }
- }
- } );
-}
-
-var widgetsDroppable = $.ui.droppable;
-
-
-/*!
- * jQuery UI Progressbar 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Progressbar
-//>>group: Widgets
-/* eslint-disable max-len */
-//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
-/* eslint-enable max-len */
-//>>docs: http://api.jqueryui.com/progressbar/
-//>>demos: http://jqueryui.com/progressbar/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/progressbar.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var widgetsProgressbar = $.widget( "ui.progressbar", {
- version: "1.13.1",
- options: {
- classes: {
- "ui-progressbar": "ui-corner-all",
- "ui-progressbar-value": "ui-corner-left",
- "ui-progressbar-complete": "ui-corner-right"
- },
- max: 100,
- value: 0,
-
- change: null,
- complete: null
- },
-
- min: 0,
-
- _create: function() {
-
- // Constrain initial value
- this.oldValue = this.options.value = this._constrainedValue();
-
- this.element.attr( {
-
- // Only set static values; aria-valuenow and aria-valuemax are
- // set inside _refreshValue()
- role: "progressbar",
- "aria-valuemin": this.min
- } );
- this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
-
- this.valueDiv = $( "<div>" ).appendTo( this.element );
- this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
- this._refreshValue();
- },
-
- _destroy: function() {
- this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
-
- this.valueDiv.remove();
- },
-
- value: function( newValue ) {
- if ( newValue === undefined ) {
- return this.options.value;
- }
-
- this.options.value = this._constrainedValue( newValue );
- this._refreshValue();
- },
-
- _constrainedValue: function( newValue ) {
- if ( newValue === undefined ) {
- newValue = this.options.value;
- }
-
- this.indeterminate = newValue === false;
-
- // Sanitize value
- if ( typeof newValue !== "number" ) {
- newValue = 0;
- }
-
- return this.indeterminate ? false :
- Math.min( this.options.max, Math.max( this.min, newValue ) );
- },
-
- _setOptions: function( options ) {
-
- // Ensure "value" option is set after other values (like max)
- var value = options.value;
- delete options.value;
-
- this._super( options );
-
- this.options.value = this._constrainedValue( value );
- this._refreshValue();
- },
-
- _setOption: function( key, value ) {
- if ( key === "max" ) {
-
- // Don't allow a max less than min
- value = Math.max( this.min, value );
- }
- this._super( key, value );
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.element.attr( "aria-disabled", value );
- this._toggleClass( null, "ui-state-disabled", !!value );
- },
-
- _percentage: function() {
- return this.indeterminate ?
- 100 :
- 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
- },
-
- _refreshValue: function() {
- var value = this.options.value,
- percentage = this._percentage();
-
- this.valueDiv
- .toggle( this.indeterminate || value > this.min )
- .width( percentage.toFixed( 0 ) + "%" );
-
- this
- ._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
- value === this.options.max )
- ._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
-
- if ( this.indeterminate ) {
- this.element.removeAttr( "aria-valuenow" );
- if ( !this.overlayDiv ) {
- this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
- this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
- }
- } else {
- this.element.attr( {
- "aria-valuemax": this.options.max,
- "aria-valuenow": value
- } );
- if ( this.overlayDiv ) {
- this.overlayDiv.remove();
- this.overlayDiv = null;
- }
- }
-
- if ( this.oldValue !== value ) {
- this.oldValue = value;
- this._trigger( "change" );
- }
- if ( value === this.options.max ) {
- this._trigger( "complete" );
- }
- }
-} );
-
-
-/*!
- * jQuery UI Selectable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Selectable
-//>>group: Interactions
-//>>description: Allows groups of elements to be selected with the mouse.
-//>>docs: http://api.jqueryui.com/selectable/
-//>>demos: http://jqueryui.com/selectable/
-//>>css.structure: ../../themes/base/selectable.css
-
-
-var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
- version: "1.13.1",
- options: {
- appendTo: "body",
- autoRefresh: true,
- distance: 0,
- filter: "*",
- tolerance: "touch",
-
- // Callbacks
- selected: null,
- selecting: null,
- start: null,
- stop: null,
- unselected: null,
- unselecting: null
- },
- _create: function() {
- var that = this;
-
- this._addClass( "ui-selectable" );
-
- this.dragged = false;
-
- // Cache selectee children based on filter
- this.refresh = function() {
- that.elementPos = $( that.element[ 0 ] ).offset();
- that.selectees = $( that.options.filter, that.element[ 0 ] );
- that._addClass( that.selectees, "ui-selectee" );
- that.selectees.each( function() {
- var $this = $( this ),
- selecteeOffset = $this.offset(),
- pos = {
- left: selecteeOffset.left - that.elementPos.left,
- top: selecteeOffset.top - that.elementPos.top
- };
- $.data( this, "selectable-item", {
- element: this,
- $element: $this,
- left: pos.left,
- top: pos.top,
- right: pos.left + $this.outerWidth(),
- bottom: pos.top + $this.outerHeight(),
- startselected: false,
- selected: $this.hasClass( "ui-selected" ),
- selecting: $this.hasClass( "ui-selecting" ),
- unselecting: $this.hasClass( "ui-unselecting" )
- } );
- } );
- };
- this.refresh();
-
- this._mouseInit();
-
- this.helper = $( "<div>" );
- this._addClass( this.helper, "ui-selectable-helper" );
- },
-
- _destroy: function() {
- this.selectees.removeData( "selectable-item" );
- this._mouseDestroy();
- },
-
- _mouseStart: function( event ) {
- var that = this,
- options = this.options;
-
- this.opos = [ event.pageX, event.pageY ];
- this.elementPos = $( this.element[ 0 ] ).offset();
-
- if ( this.options.disabled ) {
- return;
- }
-
- this.selectees = $( options.filter, this.element[ 0 ] );
-
- this._trigger( "start", event );
-
- $( options.appendTo ).append( this.helper );
-
- // position helper (lasso)
- this.helper.css( {
- "left": event.pageX,
- "top": event.pageY,
- "width": 0,
- "height": 0
- } );
-
- if ( options.autoRefresh ) {
- this.refresh();
- }
-
- this.selectees.filter( ".ui-selected" ).each( function() {
- var selectee = $.data( this, "selectable-item" );
- selectee.startselected = true;
- if ( !event.metaKey && !event.ctrlKey ) {
- that._removeClass( selectee.$element, "ui-selected" );
- selectee.selected = false;
- that._addClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = true;
-
- // selectable UNSELECTING callback
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- } );
-
- $( event.target ).parents().addBack().each( function() {
- var doSelect,
- selectee = $.data( this, "selectable-item" );
- if ( selectee ) {
- doSelect = ( !event.metaKey && !event.ctrlKey ) ||
- !selectee.$element.hasClass( "ui-selected" );
- that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
- ._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
- selectee.unselecting = !doSelect;
- selectee.selecting = doSelect;
- selectee.selected = doSelect;
-
- // selectable (UN)SELECTING callback
- if ( doSelect ) {
- that._trigger( "selecting", event, {
- selecting: selectee.element
- } );
- } else {
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- return false;
- }
- } );
-
- },
-
- _mouseDrag: function( event ) {
-
- this.dragged = true;
-
- if ( this.options.disabled ) {
- return;
- }
-
- var tmp,
- that = this,
- options = this.options,
- x1 = this.opos[ 0 ],
- y1 = this.opos[ 1 ],
- x2 = event.pageX,
- y2 = event.pageY;
-
- if ( x1 > x2 ) {
- tmp = x2; x2 = x1; x1 = tmp;
- }
- if ( y1 > y2 ) {
- tmp = y2; y2 = y1; y1 = tmp;
- }
- this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
-
- this.selectees.each( function() {
- var selectee = $.data( this, "selectable-item" ),
- hit = false,
- offset = {};
-
- //prevent helper from being selected if appendTo: selectable
- if ( !selectee || selectee.element === that.element[ 0 ] ) {
- return;
- }
-
- offset.left = selectee.left + that.elementPos.left;
- offset.right = selectee.right + that.elementPos.left;
- offset.top = selectee.top + that.elementPos.top;
- offset.bottom = selectee.bottom + that.elementPos.top;
-
- if ( options.tolerance === "touch" ) {
- hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
- offset.bottom < y1 ) );
- } else if ( options.tolerance === "fit" ) {
- hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
- offset.bottom < y2 );
- }
-
- if ( hit ) {
-
- // SELECT
- if ( selectee.selected ) {
- that._removeClass( selectee.$element, "ui-selected" );
- selectee.selected = false;
- }
- if ( selectee.unselecting ) {
- that._removeClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = false;
- }
- if ( !selectee.selecting ) {
- that._addClass( selectee.$element, "ui-selecting" );
- selectee.selecting = true;
-
- // selectable SELECTING callback
- that._trigger( "selecting", event, {
- selecting: selectee.element
- } );
- }
- } else {
-
- // UNSELECT
- if ( selectee.selecting ) {
- if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
- that._removeClass( selectee.$element, "ui-selecting" );
- selectee.selecting = false;
- that._addClass( selectee.$element, "ui-selected" );
- selectee.selected = true;
- } else {
- that._removeClass( selectee.$element, "ui-selecting" );
- selectee.selecting = false;
- if ( selectee.startselected ) {
- that._addClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = true;
- }
-
- // selectable UNSELECTING callback
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- }
- if ( selectee.selected ) {
- if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
- that._removeClass( selectee.$element, "ui-selected" );
- selectee.selected = false;
-
- that._addClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = true;
-
- // selectable UNSELECTING callback
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- }
- }
- } );
-
- return false;
- },
-
- _mouseStop: function( event ) {
- var that = this;
-
- this.dragged = false;
-
- $( ".ui-unselecting", this.element[ 0 ] ).each( function() {
- var selectee = $.data( this, "selectable-item" );
- that._removeClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = false;
- selectee.startselected = false;
- that._trigger( "unselected", event, {
- unselected: selectee.element
- } );
- } );
- $( ".ui-selecting", this.element[ 0 ] ).each( function() {
- var selectee = $.data( this, "selectable-item" );
- that._removeClass( selectee.$element, "ui-selecting" )
- ._addClass( selectee.$element, "ui-selected" );
- selectee.selecting = false;
- selectee.selected = true;
- selectee.startselected = true;
- that._trigger( "selected", event, {
- selected: selectee.element
- } );
- } );
- this._trigger( "stop", event );
-
- this.helper.remove();
-
- return false;
- }
-
-} );
-
-
-/*!
- * jQuery UI Selectmenu 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Selectmenu
-//>>group: Widgets
-/* eslint-disable max-len */
-//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
-/* eslint-enable max-len */
-//>>docs: http://api.jqueryui.com/selectmenu/
-//>>demos: http://jqueryui.com/selectmenu/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
- version: "1.13.1",
- defaultElement: "<select>",
- options: {
- appendTo: null,
- classes: {
- "ui-selectmenu-button-open": "ui-corner-top",
- "ui-selectmenu-button-closed": "ui-corner-all"
- },
- disabled: null,
- icons: {
- button: "ui-icon-triangle-1-s"
- },
- position: {
- my: "left top",
- at: "left bottom",
- collision: "none"
- },
- width: false,
-
- // Callbacks
- change: null,
- close: null,
- focus: null,
- open: null,
- select: null
- },
-
- _create: function() {
- var selectmenuId = this.element.uniqueId().attr( "id" );
- this.ids = {
- element: selectmenuId,
- button: selectmenuId + "-button",
- menu: selectmenuId + "-menu"
- };
-
- this._drawButton();
- this._drawMenu();
- this._bindFormResetHandler();
-
- this._rendered = false;
- this.menuItems = $();
- },
-
- _drawButton: function() {
- var icon,
- that = this,
- item = this._parseOption(
- this.element.find( "option:selected" ),
- this.element[ 0 ].selectedIndex
- );
-
- // Associate existing label with the new button
- this.labels = this.element.labels().attr( "for", this.ids.button );
- this._on( this.labels, {
- click: function( event ) {
- this.button.trigger( "focus" );
- event.preventDefault();
- }
- } );
-
- // Hide original select element
- this.element.hide();
-
- // Create button
- this.button = $( "<span>", {
- tabindex: this.options.disabled ? -1 : 0,
- id: this.ids.button,
- role: "combobox",
- "aria-expanded": "false",
- "aria-autocomplete": "list",
- "aria-owns": this.ids.menu,
- "aria-haspopup": "true",
- title: this.element.attr( "title" )
- } )
- .insertAfter( this.element );
-
- this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
- "ui-button ui-widget" );
-
- icon = $( "<span>" ).appendTo( this.button );
- this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
- this.buttonItem = this._renderButtonItem( item )
- .appendTo( this.button );
-
- if ( this.options.width !== false ) {
- this._resizeButton();
- }
-
- this._on( this.button, this._buttonEvents );
- this.button.one( "focusin", function() {
-
- // Delay rendering the menu items until the button receives focus.
- // The menu may have already been rendered via a programmatic open.
- if ( !that._rendered ) {
- that._refreshMenu();
- }
- } );
- },
-
- _drawMenu: function() {
- var that = this;
-
- // Create menu
- this.menu = $( "<ul>", {
- "aria-hidden": "true",
- "aria-labelledby": this.ids.button,
- id: this.ids.menu
- } );
-
- // Wrap menu
- this.menuWrap = $( "<div>" ).append( this.menu );
- this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
- this.menuWrap.appendTo( this._appendTo() );
-
- // Initialize menu widget
- this.menuInstance = this.menu
- .menu( {
- classes: {
- "ui-menu": "ui-corner-bottom"
- },
- role: "listbox",
- select: function( event, ui ) {
- event.preventDefault();
-
- // Support: IE8
- // If the item was selected via a click, the text selection
- // will be destroyed in IE
- that._setSelection();
-
- that._select( ui.item.data( "ui-selectmenu-item" ), event );
- },
- focus: function( event, ui ) {
- var item = ui.item.data( "ui-selectmenu-item" );
-
- // Prevent inital focus from firing and check if its a newly focused item
- if ( that.focusIndex != null && item.index !== that.focusIndex ) {
- that._trigger( "focus", event, { item: item } );
- if ( !that.isOpen ) {
- that._select( item, event );
- }
- }
- that.focusIndex = item.index;
-
- that.button.attr( "aria-activedescendant",
- that.menuItems.eq( item.index ).attr( "id" ) );
- }
- } )
- .menu( "instance" );
-
- // Don't close the menu on mouseleave
- this.menuInstance._off( this.menu, "mouseleave" );
-
- // Cancel the menu's collapseAll on document click
- this.menuInstance._closeOnDocumentClick = function() {
- return false;
- };
-
- // Selects often contain empty items, but never contain dividers
- this.menuInstance._isDivider = function() {
- return false;
- };
- },
-
- refresh: function() {
- this._refreshMenu();
- this.buttonItem.replaceWith(
- this.buttonItem = this._renderButtonItem(
-
- // Fall back to an empty object in case there are no options
- this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
- )
- );
- if ( this.options.width === null ) {
- this._resizeButton();
- }
- },
-
- _refreshMenu: function() {
- var item,
- options = this.element.find( "option" );
-
- this.menu.empty();
-
- this._parseOptions( options );
- this._renderMenu( this.menu, this.items );
-
- this.menuInstance.refresh();
- this.menuItems = this.menu.find( "li" )
- .not( ".ui-selectmenu-optgroup" )
- .find( ".ui-menu-item-wrapper" );
-
- this._rendered = true;
-
- if ( !options.length ) {
- return;
- }
-
- item = this._getSelectedItem();
-
- // Update the menu to have the correct item focused
- this.menuInstance.focus( null, item );
- this._setAria( item.data( "ui-selectmenu-item" ) );
-
- // Set disabled state
- this._setOption( "disabled", this.element.prop( "disabled" ) );
- },
-
- open: function( event ) {
- if ( this.options.disabled ) {
- return;
- }
-
- // If this is the first time the menu is being opened, render the items
- if ( !this._rendered ) {
- this._refreshMenu();
- } else {
-
- // Menu clears focus on close, reset focus to selected item
- this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
- this.menuInstance.focus( null, this._getSelectedItem() );
- }
-
- // If there are no options, don't open the menu
- if ( !this.menuItems.length ) {
- return;
- }
-
- this.isOpen = true;
- this._toggleAttr();
- this._resizeMenu();
- this._position();
-
- this._on( this.document, this._documentClick );
-
- this._trigger( "open", event );
- },
-
- _position: function() {
- this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
- },
-
- close: function( event ) {
- if ( !this.isOpen ) {
- return;
- }
-
- this.isOpen = false;
- this._toggleAttr();
-
- this.range = null;
- this._off( this.document );
-
- this._trigger( "close", event );
- },
-
- widget: function() {
- return this.button;
- },
-
- menuWidget: function() {
- return this.menu;
- },
-
- _renderButtonItem: function( item ) {
- var buttonItem = $( "<span>" );
-
- this._setText( buttonItem, item.label );
- this._addClass( buttonItem, "ui-selectmenu-text" );
-
- return buttonItem;
- },
-
- _renderMenu: function( ul, items ) {
- var that = this,
- currentOptgroup = "";
-
- $.each( items, function( index, item ) {
- var li;
-
- if ( item.optgroup !== currentOptgroup ) {
- li = $( "<li>", {
- text: item.optgroup
- } );
- that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
- ( item.element.parent( "optgroup" ).prop( "disabled" ) ?
- " ui-state-disabled" :
- "" ) );
-
- li.appendTo( ul );
-
- currentOptgroup = item.optgroup;
- }
-
- that._renderItemData( ul, item );
- } );
- },
-
- _renderItemData: function( ul, item ) {
- return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
- },
-
- _renderItem: function( ul, item ) {
- var li = $( "<li>" ),
- wrapper = $( "<div>", {
- title: item.element.attr( "title" )
- } );
-
- if ( item.disabled ) {
- this._addClass( li, null, "ui-state-disabled" );
- }
- this._setText( wrapper, item.label );
-
- return li.append( wrapper ).appendTo( ul );
- },
-
- _setText: function( element, value ) {
- if ( value ) {
- element.text( value );
- } else {
- element.html( "&#160;" );
- }
- },
-
- _move: function( direction, event ) {
- var item, next,
- filter = ".ui-menu-item";
-
- if ( this.isOpen ) {
- item = this.menuItems.eq( this.focusIndex ).parent( "li" );
- } else {
- item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
- filter += ":not(.ui-state-disabled)";
- }
-
- if ( direction === "first" || direction === "last" ) {
- next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
- } else {
- next = item[ direction + "All" ]( filter ).eq( 0 );
- }
-
- if ( next.length ) {
- this.menuInstance.focus( event, next );
- }
- },
-
- _getSelectedItem: function() {
- return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
- },
-
- _toggle: function( event ) {
- this[ this.isOpen ? "close" : "open" ]( event );
- },
-
- _setSelection: function() {
- var selection;
-
- if ( !this.range ) {
- return;
- }
-
- if ( window.getSelection ) {
- selection = window.getSelection();
- selection.removeAllRanges();
- selection.addRange( this.range );
-
- // Support: IE8
- } else {
- this.range.select();
- }
-
- // Support: IE
- // Setting the text selection kills the button focus in IE, but
- // restoring the focus doesn't kill the selection.
- this.button.focus();
- },
-
- _documentClick: {
- mousedown: function( event ) {
- if ( !this.isOpen ) {
- return;
- }
-
- if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
- $.escapeSelector( this.ids.button ) ).length ) {
- this.close( event );
- }
- }
- },
-
- _buttonEvents: {
-
- // Prevent text selection from being reset when interacting with the selectmenu (#10144)
- mousedown: function() {
- var selection;
-
- if ( window.getSelection ) {
- selection = window.getSelection();
- if ( selection.rangeCount ) {
- this.range = selection.getRangeAt( 0 );
- }
-
- // Support: IE8
- } else {
- this.range = document.selection.createRange();
- }
- },
-
- click: function( event ) {
- this._setSelection();
- this._toggle( event );
- },
-
- keydown: function( event ) {
- var preventDefault = true;
- switch ( event.keyCode ) {
- case $.ui.keyCode.TAB:
- case $.ui.keyCode.ESCAPE:
- this.close( event );
- preventDefault = false;
- break;
- case $.ui.keyCode.ENTER:
- if ( this.isOpen ) {
- this._selectFocusedItem( event );
- }
- break;
- case $.ui.keyCode.UP:
- if ( event.altKey ) {
- this._toggle( event );
- } else {
- this._move( "prev", event );
- }
- break;
- case $.ui.keyCode.DOWN:
- if ( event.altKey ) {
- this._toggle( event );
- } else {
- this._move( "next", event );
- }
- break;
- case $.ui.keyCode.SPACE:
- if ( this.isOpen ) {
- this._selectFocusedItem( event );
- } else {
- this._toggle( event );
- }
- break;
- case $.ui.keyCode.LEFT:
- this._move( "prev", event );
- break;
- case $.ui.keyCode.RIGHT:
- this._move( "next", event );
- break;
- case $.ui.keyCode.HOME:
- case $.ui.keyCode.PAGE_UP:
- this._move( "first", event );
- break;
- case $.ui.keyCode.END:
- case $.ui.keyCode.PAGE_DOWN:
- this._move( "last", event );
- break;
- default:
- this.menu.trigger( event );
- preventDefault = false;
- }
-
- if ( preventDefault ) {
- event.preventDefault();
- }
- }
- },
-
- _selectFocusedItem: function( event ) {
- var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
- if ( !item.hasClass( "ui-state-disabled" ) ) {
- this._select( item.data( "ui-selectmenu-item" ), event );
- }
- },
-
- _select: function( item, event ) {
- var oldIndex = this.element[ 0 ].selectedIndex;
-
- // Change native select element
- this.element[ 0 ].selectedIndex = item.index;
- this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
- this._setAria( item );
- this._trigger( "select", event, { item: item } );
-
- if ( item.index !== oldIndex ) {
- this._trigger( "change", event, { item: item } );
- }
-
- this.close( event );
- },
-
- _setAria: function( item ) {
- var id = this.menuItems.eq( item.index ).attr( "id" );
-
- this.button.attr( {
- "aria-labelledby": id,
- "aria-activedescendant": id
- } );
- this.menu.attr( "aria-activedescendant", id );
- },
-
- _setOption: function( key, value ) {
- if ( key === "icons" ) {
- var icon = this.button.find( "span.ui-icon" );
- this._removeClass( icon, null, this.options.icons.button )
- ._addClass( icon, null, value.button );
- }
-
- this._super( key, value );
-
- if ( key === "appendTo" ) {
- this.menuWrap.appendTo( this._appendTo() );
- }
-
- if ( key === "width" ) {
- this._resizeButton();
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.menuInstance.option( "disabled", value );
- this.button.attr( "aria-disabled", value );
- this._toggleClass( this.button, null, "ui-state-disabled", value );
-
- this.element.prop( "disabled", value );
- if ( value ) {
- this.button.attr( "tabindex", -1 );
- this.close();
- } else {
- this.button.attr( "tabindex", 0 );
- }
- },
-
- _appendTo: function() {
- var element = this.options.appendTo;
-
- if ( element ) {
- element = element.jquery || element.nodeType ?
- $( element ) :
- this.document.find( element ).eq( 0 );
- }
-
- if ( !element || !element[ 0 ] ) {
- element = this.element.closest( ".ui-front, dialog" );
- }
-
- if ( !element.length ) {
- element = this.document[ 0 ].body;
- }
-
- return element;
- },
-
- _toggleAttr: function() {
- this.button.attr( "aria-expanded", this.isOpen );
-
- // We can't use two _toggleClass() calls here, because we need to make sure
- // we always remove classes first and add them second, otherwise if both classes have the
- // same theme class, it will be removed after we add it.
- this._removeClass( this.button, "ui-selectmenu-button-" +
- ( this.isOpen ? "closed" : "open" ) )
- ._addClass( this.button, "ui-selectmenu-button-" +
- ( this.isOpen ? "open" : "closed" ) )
- ._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
-
- this.menu.attr( "aria-hidden", !this.isOpen );
- },
-
- _resizeButton: function() {
- var width = this.options.width;
-
- // For `width: false`, just remove inline style and stop
- if ( width === false ) {
- this.button.css( "width", "" );
- return;
- }
-
- // For `width: null`, match the width of the original element
- if ( width === null ) {
- width = this.element.show().outerWidth();
- this.element.hide();
- }
-
- this.button.outerWidth( width );
- },
-
- _resizeMenu: function() {
- this.menu.outerWidth( Math.max(
- this.button.outerWidth(),
-
- // Support: IE10
- // IE10 wraps long text (possibly a rounding bug)
- // so we add 1px to avoid the wrapping
- this.menu.width( "" ).outerWidth() + 1
- ) );
- },
-
- _getCreateOptions: function() {
- var options = this._super();
-
- options.disabled = this.element.prop( "disabled" );
-
- return options;
- },
-
- _parseOptions: function( options ) {
- var that = this,
- data = [];
- options.each( function( index, item ) {
- if ( item.hidden ) {
- return;
- }
-
- data.push( that._parseOption( $( item ), index ) );
- } );
- this.items = data;
- },
-
- _parseOption: function( option, index ) {
- var optgroup = option.parent( "optgroup" );
-
- return {
- element: option,
- index: index,
- value: option.val(),
- label: option.text(),
- optgroup: optgroup.attr( "label" ) || "",
- disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
- };
- },
-
- _destroy: function() {
- this._unbindFormResetHandler();
- this.menuWrap.remove();
- this.button.remove();
- this.element.show();
- this.element.removeUniqueId();
- this.labels.attr( "for", this.ids.element );
- }
-} ] );
-
-
-/*!
- * jQuery UI Slider 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Slider
-//>>group: Widgets
-//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
-//>>docs: http://api.jqueryui.com/slider/
-//>>demos: http://jqueryui.com/slider/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/slider.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
- version: "1.13.1",
- widgetEventPrefix: "slide",
-
- options: {
- animate: false,
- classes: {
- "ui-slider": "ui-corner-all",
- "ui-slider-handle": "ui-corner-all",
-
- // Note: ui-widget-header isn't the most fittingly semantic framework class for this
- // element, but worked best visually with a variety of themes
- "ui-slider-range": "ui-corner-all ui-widget-header"
- },
- distance: 0,
- max: 100,
- min: 0,
- orientation: "horizontal",
- range: false,
- step: 1,
- value: 0,
- values: null,
-
- // Callbacks
- change: null,
- slide: null,
- start: null,
- stop: null
- },
-
- // Number of pages in a slider
- // (how many times can you page up/down to go through the whole range)
- numPages: 5,
-
- _create: function() {
- this._keySliding = false;
- this._mouseSliding = false;
- this._animateOff = true;
- this._handleIndex = null;
- this._detectOrientation();
- this._mouseInit();
- this._calculateNewMax();
-
- this._addClass( "ui-slider ui-slider-" + this.orientation,
- "ui-widget ui-widget-content" );
-
- this._refresh();
-
- this._animateOff = false;
- },
-
- _refresh: function() {
- this._createRange();
- this._createHandles();
- this._setupEvents();
- this._refreshValue();
- },
-
- _createHandles: function() {
- var i, handleCount,
- options = this.options,
- existingHandles = this.element.find( ".ui-slider-handle" ),
- handle = "<span tabindex='0'></span>",
- handles = [];
-
- handleCount = ( options.values && options.values.length ) || 1;
-
- if ( existingHandles.length > handleCount ) {
- existingHandles.slice( handleCount ).remove();
- existingHandles = existingHandles.slice( 0, handleCount );
- }
-
- for ( i = existingHandles.length; i < handleCount; i++ ) {
- handles.push( handle );
- }
-
- this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
-
- this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
-
- this.handle = this.handles.eq( 0 );
-
- this.handles.each( function( i ) {
- $( this )
- .data( "ui-slider-handle-index", i )
- .attr( "tabIndex", 0 );
- } );
- },
-
- _createRange: function() {
- var options = this.options;
-
- if ( options.range ) {
- if ( options.range === true ) {
- if ( !options.values ) {
- options.values = [ this._valueMin(), this._valueMin() ];
- } else if ( options.values.length && options.values.length !== 2 ) {
- options.values = [ options.values[ 0 ], options.values[ 0 ] ];
- } else if ( Array.isArray( options.values ) ) {
- options.values = options.values.slice( 0 );
- }
- }
-
- if ( !this.range || !this.range.length ) {
- this.range = $( "<div>" )
- .appendTo( this.element );
-
- this._addClass( this.range, "ui-slider-range" );
- } else {
- this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
-
- // Handle range switching from true to min/max
- this.range.css( {
- "left": "",
- "bottom": ""
- } );
- }
- if ( options.range === "min" || options.range === "max" ) {
- this._addClass( this.range, "ui-slider-range-" + options.range );
- }
- } else {
- if ( this.range ) {
- this.range.remove();
- }
- this.range = null;
- }
- },
-
- _setupEvents: function() {
- this._off( this.handles );
- this._on( this.handles, this._handleEvents );
- this._hoverable( this.handles );
- this._focusable( this.handles );
- },
-
- _destroy: function() {
- this.handles.remove();
- if ( this.range ) {
- this.range.remove();
- }
-
- this._mouseDestroy();
- },
-
- _mouseCapture: function( event ) {
- var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
- that = this,
- o = this.options;
-
- if ( o.disabled ) {
- return false;
- }
-
- this.elementSize = {
- width: this.element.outerWidth(),
- height: this.element.outerHeight()
- };
- this.elementOffset = this.element.offset();
-
- position = { x: event.pageX, y: event.pageY };
- normValue = this._normValueFromMouse( position );
- distance = this._valueMax() - this._valueMin() + 1;
- this.handles.each( function( i ) {
- var thisDistance = Math.abs( normValue - that.values( i ) );
- if ( ( distance > thisDistance ) ||
- ( distance === thisDistance &&
- ( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
- distance = thisDistance;
- closestHandle = $( this );
- index = i;
- }
- } );
-
- allowed = this._start( event, index );
- if ( allowed === false ) {
- return false;
- }
- this._mouseSliding = true;
-
- this._handleIndex = index;
-
- this._addClass( closestHandle, null, "ui-state-active" );
- closestHandle.trigger( "focus" );
-
- offset = closestHandle.offset();
- mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
- this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
- left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
- top: event.pageY - offset.top -
- ( closestHandle.height() / 2 ) -
- ( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
- ( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
- ( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
- };
-
- if ( !this.handles.hasClass( "ui-state-hover" ) ) {
- this._slide( event, index, normValue );
- }
- this._animateOff = true;
- return true;
- },
-
- _mouseStart: function() {
- return true;
- },
-
- _mouseDrag: function( event ) {
- var position = { x: event.pageX, y: event.pageY },
- normValue = this._normValueFromMouse( position );
-
- this._slide( event, this._handleIndex, normValue );
-
- return false;
- },
-
- _mouseStop: function( event ) {
- this._removeClass( this.handles, null, "ui-state-active" );
- this._mouseSliding = false;
-
- this._stop( event, this._handleIndex );
- this._change( event, this._handleIndex );
-
- this._handleIndex = null;
- this._clickOffset = null;
- this._animateOff = false;
-
- return false;
- },
-
- _detectOrientation: function() {
- this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
- },
-
- _normValueFromMouse: function( position ) {
- var pixelTotal,
- pixelMouse,
- percentMouse,
- valueTotal,
- valueMouse;
-
- if ( this.orientation === "horizontal" ) {
- pixelTotal = this.elementSize.width;
- pixelMouse = position.x - this.elementOffset.left -
- ( this._clickOffset ? this._clickOffset.left : 0 );
- } else {
- pixelTotal = this.elementSize.height;
- pixelMouse = position.y - this.elementOffset.top -
- ( this._clickOffset ? this._clickOffset.top : 0 );
- }
-
- percentMouse = ( pixelMouse / pixelTotal );
- if ( percentMouse > 1 ) {
- percentMouse = 1;
- }
- if ( percentMouse < 0 ) {
- percentMouse = 0;
- }
- if ( this.orientation === "vertical" ) {
- percentMouse = 1 - percentMouse;
- }
-
- valueTotal = this._valueMax() - this._valueMin();
- valueMouse = this._valueMin() + percentMouse * valueTotal;
-
- return this._trimAlignValue( valueMouse );
- },
-
- _uiHash: function( index, value, values ) {
- var uiHash = {
- handle: this.handles[ index ],
- handleIndex: index,
- value: value !== undefined ? value : this.value()
- };
-
- if ( this._hasMultipleValues() ) {
- uiHash.value = value !== undefined ? value : this.values( index );
- uiHash.values = values || this.values();
- }
-
- return uiHash;
- },
-
- _hasMultipleValues: function() {
- return this.options.values && this.options.values.length;
- },
-
- _start: function( event, index ) {
- return this._trigger( "start", event, this._uiHash( index ) );
- },
-
- _slide: function( event, index, newVal ) {
- var allowed, otherVal,
- currentValue = this.value(),
- newValues = this.values();
-
- if ( this._hasMultipleValues() ) {
- otherVal = this.values( index ? 0 : 1 );
- currentValue = this.values( index );
-
- if ( this.options.values.length === 2 && this.options.range === true ) {
- newVal = index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
- }
-
- newValues[ index ] = newVal;
- }
-
- if ( newVal === currentValue ) {
- return;
- }
-
- allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
-
- // A slide can be canceled by returning false from the slide callback
- if ( allowed === false ) {
- return;
- }
-
- if ( this._hasMultipleValues() ) {
- this.values( index, newVal );
- } else {
- this.value( newVal );
- }
- },
-
- _stop: function( event, index ) {
- this._trigger( "stop", event, this._uiHash( index ) );
- },
-
- _change: function( event, index ) {
- if ( !this._keySliding && !this._mouseSliding ) {
-
- //store the last changed value index for reference when handles overlap
- this._lastChangedValue = index;
- this._trigger( "change", event, this._uiHash( index ) );
- }
- },
-
- value: function( newValue ) {
- if ( arguments.length ) {
- this.options.value = this._trimAlignValue( newValue );
- this._refreshValue();
- this._change( null, 0 );
- return;
- }
-
- return this._value();
- },
-
- values: function( index, newValue ) {
- var vals,
- newValues,
- i;
-
- if ( arguments.length > 1 ) {
- this.options.values[ index ] = this._trimAlignValue( newValue );
- this._refreshValue();
- this._change( null, index );
- return;
- }
-
- if ( arguments.length ) {
- if ( Array.isArray( arguments[ 0 ] ) ) {
- vals = this.options.values;
- newValues = arguments[ 0 ];
- for ( i = 0; i < vals.length; i += 1 ) {
- vals[ i ] = this._trimAlignValue( newValues[ i ] );
- this._change( null, i );
- }
- this._refreshValue();
- } else {
- if ( this._hasMultipleValues() ) {
- return this._values( index );
- } else {
- return this.value();
- }
- }
- } else {
- return this._values();
- }
- },
-
- _setOption: function( key, value ) {
- var i,
- valsLength = 0;
-
- if ( key === "range" && this.options.range === true ) {
- if ( value === "min" ) {
- this.options.value = this._values( 0 );
- this.options.values = null;
- } else if ( value === "max" ) {
- this.options.value = this._values( this.options.values.length - 1 );
- this.options.values = null;
- }
- }
-
- if ( Array.isArray( this.options.values ) ) {
- valsLength = this.options.values.length;
- }
-
- this._super( key, value );
-
- switch ( key ) {
- case "orientation":
- this._detectOrientation();
- this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
- ._addClass( "ui-slider-" + this.orientation );
- this._refreshValue();
- if ( this.options.range ) {
- this._refreshRange( value );
- }
-
- // Reset positioning from previous orientation
- this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
- break;
- case "value":
- this._animateOff = true;
- this._refreshValue();
- this._change( null, 0 );
- this._animateOff = false;
- break;
- case "values":
- this._animateOff = true;
- this._refreshValue();
-
- // Start from the last handle to prevent unreachable handles (#9046)
- for ( i = valsLength - 1; i >= 0; i-- ) {
- this._change( null, i );
- }
- this._animateOff = false;
- break;
- case "step":
- case "min":
- case "max":
- this._animateOff = true;
- this._calculateNewMax();
- this._refreshValue();
- this._animateOff = false;
- break;
- case "range":
- this._animateOff = true;
- this._refresh();
- this._animateOff = false;
- break;
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this._toggleClass( null, "ui-state-disabled", !!value );
- },
-
- //internal value getter
- // _value() returns value trimmed by min and max, aligned by step
- _value: function() {
- var val = this.options.value;
- val = this._trimAlignValue( val );
-
- return val;
- },
-
- //internal values getter
- // _values() returns array of values trimmed by min and max, aligned by step
- // _values( index ) returns single value trimmed by min and max, aligned by step
- _values: function( index ) {
- var val,
- vals,
- i;
-
- if ( arguments.length ) {
- val = this.options.values[ index ];
- val = this._trimAlignValue( val );
-
- return val;
- } else if ( this._hasMultipleValues() ) {
-
- // .slice() creates a copy of the array
- // this copy gets trimmed by min and max and then returned
- vals = this.options.values.slice();
- for ( i = 0; i < vals.length; i += 1 ) {
- vals[ i ] = this._trimAlignValue( vals[ i ] );
- }
-
- return vals;
- } else {
- return [];
- }
- },
-
- // Returns the step-aligned value that val is closest to, between (inclusive) min and max
- _trimAlignValue: function( val ) {
- if ( val <= this._valueMin() ) {
- return this._valueMin();
- }
- if ( val >= this._valueMax() ) {
- return this._valueMax();
- }
- var step = ( this.options.step > 0 ) ? this.options.step : 1,
- valModStep = ( val - this._valueMin() ) % step,
- alignValue = val - valModStep;
-
- if ( Math.abs( valModStep ) * 2 >= step ) {
- alignValue += ( valModStep > 0 ) ? step : ( -step );
- }
-
- // Since JavaScript has problems with large floats, round
- // the final value to 5 digits after the decimal point (see #4124)
- return parseFloat( alignValue.toFixed( 5 ) );
- },
-
- _calculateNewMax: function() {
- var max = this.options.max,
- min = this._valueMin(),
- step = this.options.step,
- aboveMin = Math.round( ( max - min ) / step ) * step;
- max = aboveMin + min;
- if ( max > this.options.max ) {
-
- //If max is not divisible by step, rounding off may increase its value
- max -= step;
- }
- this.max = parseFloat( max.toFixed( this._precision() ) );
- },
-
- _precision: function() {
- var precision = this._precisionOf( this.options.step );
- if ( this.options.min !== null ) {
- precision = Math.max( precision, this._precisionOf( this.options.min ) );
- }
- return precision;
- },
-
- _precisionOf: function( num ) {
- var str = num.toString(),
- decimal = str.indexOf( "." );
- return decimal === -1 ? 0 : str.length - decimal - 1;
- },
-
- _valueMin: function() {
- return this.options.min;
- },
-
- _valueMax: function() {
- return this.max;
- },
-
- _refreshRange: function( orientation ) {
- if ( orientation === "vertical" ) {
- this.range.css( { "width": "", "left": "" } );
- }
- if ( orientation === "horizontal" ) {
- this.range.css( { "height": "", "bottom": "" } );
- }
- },
-
- _refreshValue: function() {
- var lastValPercent, valPercent, value, valueMin, valueMax,
- oRange = this.options.range,
- o = this.options,
- that = this,
- animate = ( !this._animateOff ) ? o.animate : false,
- _set = {};
-
- if ( this._hasMultipleValues() ) {
- this.handles.each( function( i ) {
- valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
- that._valueMin() ) * 100;
- _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
- $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
- if ( that.options.range === true ) {
- if ( that.orientation === "horizontal" ) {
- if ( i === 0 ) {
- that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- left: valPercent + "%"
- }, o.animate );
- }
- if ( i === 1 ) {
- that.range[ animate ? "animate" : "css" ]( {
- width: ( valPercent - lastValPercent ) + "%"
- }, {
- queue: false,
- duration: o.animate
- } );
- }
- } else {
- if ( i === 0 ) {
- that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- bottom: ( valPercent ) + "%"
- }, o.animate );
- }
- if ( i === 1 ) {
- that.range[ animate ? "animate" : "css" ]( {
- height: ( valPercent - lastValPercent ) + "%"
- }, {
- queue: false,
- duration: o.animate
- } );
- }
- }
- }
- lastValPercent = valPercent;
- } );
- } else {
- value = this.value();
- valueMin = this._valueMin();
- valueMax = this._valueMax();
- valPercent = ( valueMax !== valueMin ) ?
- ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
- 0;
- _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
- this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-
- if ( oRange === "min" && this.orientation === "horizontal" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- width: valPercent + "%"
- }, o.animate );
- }
- if ( oRange === "max" && this.orientation === "horizontal" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- width: ( 100 - valPercent ) + "%"
- }, o.animate );
- }
- if ( oRange === "min" && this.orientation === "vertical" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- height: valPercent + "%"
- }, o.animate );
- }
- if ( oRange === "max" && this.orientation === "vertical" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- height: ( 100 - valPercent ) + "%"
- }, o.animate );
- }
- }
- },
-
- _handleEvents: {
- keydown: function( event ) {
- var allowed, curVal, newVal, step,
- index = $( event.target ).data( "ui-slider-handle-index" );
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.HOME:
- case $.ui.keyCode.END:
- case $.ui.keyCode.PAGE_UP:
- case $.ui.keyCode.PAGE_DOWN:
- case $.ui.keyCode.UP:
- case $.ui.keyCode.RIGHT:
- case $.ui.keyCode.DOWN:
- case $.ui.keyCode.LEFT:
- event.preventDefault();
- if ( !this._keySliding ) {
- this._keySliding = true;
- this._addClass( $( event.target ), null, "ui-state-active" );
- allowed = this._start( event, index );
- if ( allowed === false ) {
- return;
- }
- }
- break;
- }
-
- step = this.options.step;
- if ( this._hasMultipleValues() ) {
- curVal = newVal = this.values( index );
- } else {
- curVal = newVal = this.value();
- }
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.HOME:
- newVal = this._valueMin();
- break;
- case $.ui.keyCode.END:
- newVal = this._valueMax();
- break;
- case $.ui.keyCode.PAGE_UP:
- newVal = this._trimAlignValue(
- curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
- );
- break;
- case $.ui.keyCode.PAGE_DOWN:
- newVal = this._trimAlignValue(
- curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
- break;
- case $.ui.keyCode.UP:
- case $.ui.keyCode.RIGHT:
- if ( curVal === this._valueMax() ) {
- return;
- }
- newVal = this._trimAlignValue( curVal + step );
- break;
- case $.ui.keyCode.DOWN:
- case $.ui.keyCode.LEFT:
- if ( curVal === this._valueMin() ) {
- return;
- }
- newVal = this._trimAlignValue( curVal - step );
- break;
- }
-
- this._slide( event, index, newVal );
- },
- keyup: function( event ) {
- var index = $( event.target ).data( "ui-slider-handle-index" );
-
- if ( this._keySliding ) {
- this._keySliding = false;
- this._stop( event, index );
- this._change( event, index );
- this._removeClass( $( event.target ), null, "ui-state-active" );
- }
- }
- }
-} );
-
-
-/*!
- * jQuery UI Sortable 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Sortable
-//>>group: Interactions
-//>>description: Enables items in a list to be sorted using the mouse.
-//>>docs: http://api.jqueryui.com/sortable/
-//>>demos: http://jqueryui.com/sortable/
-//>>css.structure: ../../themes/base/sortable.css
-
-
-var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
- version: "1.13.1",
- widgetEventPrefix: "sort",
- ready: false,
- options: {
- appendTo: "parent",
- axis: false,
- connectWith: false,
- containment: false,
- cursor: "auto",
- cursorAt: false,
- dropOnEmpty: true,
- forcePlaceholderSize: false,
- forceHelperSize: false,
- grid: false,
- handle: false,
- helper: "original",
- items: "> *",
- opacity: false,
- placeholder: false,
- revert: false,
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- scope: "default",
- tolerance: "intersect",
- zIndex: 1000,
-
- // Callbacks
- activate: null,
- beforeStop: null,
- change: null,
- deactivate: null,
- out: null,
- over: null,
- receive: null,
- remove: null,
- sort: null,
- start: null,
- stop: null,
- update: null
- },
-
- _isOverAxis: function( x, reference, size ) {
- return ( x >= reference ) && ( x < ( reference + size ) );
- },
-
- _isFloating: function( item ) {
- return ( /left|right/ ).test( item.css( "float" ) ) ||
- ( /inline|table-cell/ ).test( item.css( "display" ) );
- },
-
- _create: function() {
- this.containerCache = {};
- this._addClass( "ui-sortable" );
-
- //Get the items
- this.refresh();
-
- //Let's determine the parent's offset
- this.offset = this.element.offset();
-
- //Initialize mouse events for interaction
- this._mouseInit();
-
- this._setHandleClassName();
-
- //We're ready to go
- this.ready = true;
-
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
-
- if ( key === "handle" ) {
- this._setHandleClassName();
- }
- },
-
- _setHandleClassName: function() {
- var that = this;
- this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
- $.each( this.items, function() {
- that._addClass(
- this.instance.options.handle ?
- this.item.find( this.instance.options.handle ) :
- this.item,
- "ui-sortable-handle"
- );
- } );
- },
-
- _destroy: function() {
- this._mouseDestroy();
-
- for ( var i = this.items.length - 1; i >= 0; i-- ) {
- this.items[ i ].item.removeData( this.widgetName + "-item" );
- }
-
- return this;
- },
-
- _mouseCapture: function( event, overrideHandle ) {
- var currentItem = null,
- validHandle = false,
- that = this;
-
- if ( this.reverting ) {
- return false;
- }
-
- if ( this.options.disabled || this.options.type === "static" ) {
- return false;
- }
-
- //We have to refresh the items data once first
- this._refreshItems( event );
-
- //Find out if the clicked node (or one of its parents) is a actual item in this.items
- $( event.target ).parents().each( function() {
- if ( $.data( this, that.widgetName + "-item" ) === that ) {
- currentItem = $( this );
- return false;
- }
- } );
- if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
- currentItem = $( event.target );
- }
-
- if ( !currentItem ) {
- return false;
- }
- if ( this.options.handle && !overrideHandle ) {
- $( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
- if ( this === event.target ) {
- validHandle = true;
- }
- } );
- if ( !validHandle ) {
- return false;
- }
- }
-
- this.currentItem = currentItem;
- this._removeCurrentsFromItems();
- return true;
-
- },
-
- _mouseStart: function( event, overrideHandle, noActivation ) {
-
- var i, body,
- o = this.options;
-
- this.currentContainer = this;
-
- //We only need to call refreshPositions, because the refreshItems call has been moved to
- // mouseCapture
- this.refreshPositions();
-
- //Prepare the dragged items parent
- this.appendTo = $( o.appendTo !== "parent" ?
- o.appendTo :
- this.currentItem.parent() );
-
- //Create and append the visible helper
- this.helper = this._createHelper( event );
-
- //Cache the helper size
- this._cacheHelperProportions();
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- //Cache the margins of the original element
- this._cacheMargins();
-
- //The element's absolute position on the page minus margins
- this.offset = this.currentItem.offset();
- this.offset = {
- top: this.offset.top - this.margins.top,
- left: this.offset.left - this.margins.left
- };
-
- $.extend( this.offset, {
- click: { //Where the click happened, relative to the element
- left: event.pageX - this.offset.left,
- top: event.pageY - this.offset.top
- },
-
- // This is a relative to absolute position minus the actual position calculation -
- // only used for relative positioned helper
- relative: this._getRelativeOffset()
- } );
-
- // After we get the helper offset, but before we get the parent offset we can
- // change the helper's position to absolute
- // TODO: Still need to figure out a way to make relative sorting possible
- this.helper.css( "position", "absolute" );
- this.cssPosition = this.helper.css( "position" );
-
- //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
- if ( o.cursorAt ) {
- this._adjustOffsetFromHelper( o.cursorAt );
- }
-
- //Cache the former DOM position
- this.domPosition = {
- prev: this.currentItem.prev()[ 0 ],
- parent: this.currentItem.parent()[ 0 ]
- };
-
- // If the helper is not the original, hide the original so it's not playing any role during
- // the drag, won't cause anything bad this way
- if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
- this.currentItem.hide();
- }
-
- //Create the placeholder
- this._createPlaceholder();
-
- //Get the next scrolling parent
- this.scrollParent = this.placeholder.scrollParent();
-
- $.extend( this.offset, {
- parent: this._getParentOffset()
- } );
-
- //Set a containment if given in the options
- if ( o.containment ) {
- this._setContainment();
- }
-
- if ( o.cursor && o.cursor !== "auto" ) { // cursor option
- body = this.document.find( "body" );
-
- // Support: IE
- this.storedCursor = body.css( "cursor" );
- body.css( "cursor", o.cursor );
-
- this.storedStylesheet =
- $( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
- }
-
- // We need to make sure to grab the zIndex before setting the
- // opacity, because setting the opacity to anything lower than 1
- // causes the zIndex to change from "auto" to 0.
- if ( o.zIndex ) { // zIndex option
- if ( this.helper.css( "zIndex" ) ) {
- this._storedZIndex = this.helper.css( "zIndex" );
- }
- this.helper.css( "zIndex", o.zIndex );
- }
-
- if ( o.opacity ) { // opacity option
- if ( this.helper.css( "opacity" ) ) {
- this._storedOpacity = this.helper.css( "opacity" );
- }
- this.helper.css( "opacity", o.opacity );
- }
-
- //Prepare scrolling
- if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ].tagName !== "HTML" ) {
- this.overflowOffset = this.scrollParent.offset();
- }
-
- //Call callbacks
- this._trigger( "start", event, this._uiHash() );
-
- //Recache the helper size
- if ( !this._preserveHelperProportions ) {
- this._cacheHelperProportions();
- }
-
- //Post "activate" events to possible containers
- if ( !noActivation ) {
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
- this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
- }
- }
-
- //Prepare possible droppables
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.current = this;
- }
-
- if ( $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( this, event );
- }
-
- this.dragging = true;
-
- this._addClass( this.helper, "ui-sortable-helper" );
-
- //Move the helper, if needed
- if ( !this.helper.parent().is( this.appendTo ) ) {
- this.helper.detach().appendTo( this.appendTo );
-
- //Update position
- this.offset.parent = this._getParentOffset();
- }
-
- //Generate the original position
- this.position = this.originalPosition = this._generatePosition( event );
- this.originalPageX = event.pageX;
- this.originalPageY = event.pageY;
- this.lastPositionAbs = this.positionAbs = this._convertPositionTo( "absolute" );
-
- this._mouseDrag( event );
-
- return true;
-
- },
-
- _scroll: function( event ) {
- var o = this.options,
- scrolled = false;
-
- if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ].tagName !== "HTML" ) {
-
- if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
- event.pageY < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollTop =
- scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
- } else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollTop =
- scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
- }
-
- if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
- event.pageX < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollLeft = scrolled =
- this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
- } else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollLeft = scrolled =
- this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
- }
-
- } else {
-
- if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
- scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
- } else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
- o.scrollSensitivity ) {
- scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
- }
-
- if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
- scrolled = this.document.scrollLeft(
- this.document.scrollLeft() - o.scrollSpeed
- );
- } else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
- o.scrollSensitivity ) {
- scrolled = this.document.scrollLeft(
- this.document.scrollLeft() + o.scrollSpeed
- );
- }
-
- }
-
- return scrolled;
- },
-
- _mouseDrag: function( event ) {
- var i, item, itemElement, intersection,
- o = this.options;
-
- //Compute the helpers position
- this.position = this._generatePosition( event );
- this.positionAbs = this._convertPositionTo( "absolute" );
-
- //Set the helper position
- if ( !this.options.axis || this.options.axis !== "y" ) {
- this.helper[ 0 ].style.left = this.position.left + "px";
- }
- if ( !this.options.axis || this.options.axis !== "x" ) {
- this.helper[ 0 ].style.top = this.position.top + "px";
- }
-
- //Do scrolling
- if ( o.scroll ) {
- if ( this._scroll( event ) !== false ) {
-
- //Update item positions used in position checks
- this._refreshItemPositions( true );
-
- if ( $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( this, event );
- }
- }
- }
-
- this.dragDirection = {
- vertical: this._getDragVerticalDirection(),
- horizontal: this._getDragHorizontalDirection()
- };
-
- //Rearrange
- for ( i = this.items.length - 1; i >= 0; i-- ) {
-
- //Cache variables and intersection, continue if no intersection
- item = this.items[ i ];
- itemElement = item.item[ 0 ];
- intersection = this._intersectsWithPointer( item );
- if ( !intersection ) {
- continue;
- }
-
- // Only put the placeholder inside the current Container, skip all
- // items from other containers. This works because when moving
- // an item from one container to another the
- // currentContainer is switched before the placeholder is moved.
- //
- // Without this, moving items in "sub-sortables" can cause
- // the placeholder to jitter between the outer and inner container.
- if ( item.instance !== this.currentContainer ) {
- continue;
- }
-
- // Cannot intersect with itself
- // no useless actions that have been done before
- // no action if the item moved is the parent of the item checked
- if ( itemElement !== this.currentItem[ 0 ] &&
- this.placeholder[ intersection === 1 ?
- "next" : "prev" ]()[ 0 ] !== itemElement &&
- !$.contains( this.placeholder[ 0 ], itemElement ) &&
- ( this.options.type === "semi-dynamic" ?
- !$.contains( this.element[ 0 ], itemElement ) :
- true
- )
- ) {
-
- this.direction = intersection === 1 ? "down" : "up";
-
- if ( this.options.tolerance === "pointer" ||
- this._intersectsWithSides( item ) ) {
- this._rearrange( event, item );
- } else {
- break;
- }
-
- this._trigger( "change", event, this._uiHash() );
- break;
- }
- }
-
- //Post events to containers
- this._contactContainers( event );
-
- //Interconnect with droppables
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.drag( this, event );
- }
-
- //Call callbacks
- this._trigger( "sort", event, this._uiHash() );
-
- this.lastPositionAbs = this.positionAbs;
- return false;
-
- },
-
- _mouseStop: function( event, noPropagation ) {
-
- if ( !event ) {
- return;
- }
-
- //If we are using droppables, inform the manager about the drop
- if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
- $.ui.ddmanager.drop( this, event );
- }
-
- if ( this.options.revert ) {
- var that = this,
- cur = this.placeholder.offset(),
- axis = this.options.axis,
- animation = {};
-
- if ( !axis || axis === "x" ) {
- animation.left = cur.left - this.offset.parent.left - this.margins.left +
- ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
- 0 :
- this.offsetParent[ 0 ].scrollLeft
- );
- }
- if ( !axis || axis === "y" ) {
- animation.top = cur.top - this.offset.parent.top - this.margins.top +
- ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
- 0 :
- this.offsetParent[ 0 ].scrollTop
- );
- }
- this.reverting = true;
- $( this.helper ).animate(
- animation,
- parseInt( this.options.revert, 10 ) || 500,
- function() {
- that._clear( event );
- }
- );
- } else {
- this._clear( event, noPropagation );
- }
-
- return false;
-
- },
-
- cancel: function() {
-
- if ( this.dragging ) {
-
- this._mouseUp( new $.Event( "mouseup", { target: null } ) );
-
- if ( this.options.helper === "original" ) {
- this.currentItem.css( this._storedCSS );
- this._removeClass( this.currentItem, "ui-sortable-helper" );
- } else {
- this.currentItem.show();
- }
-
- //Post deactivating events to containers
- for ( var i = this.containers.length - 1; i >= 0; i-- ) {
- this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
- if ( this.containers[ i ].containerCache.over ) {
- this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
- this.containers[ i ].containerCache.over = 0;
- }
- }
-
- }
-
- if ( this.placeholder ) {
-
- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
- // it unbinds ALL events from the original node!
- if ( this.placeholder[ 0 ].parentNode ) {
- this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
- }
- if ( this.options.helper !== "original" && this.helper &&
- this.helper[ 0 ].parentNode ) {
- this.helper.remove();
- }
-
- $.extend( this, {
- helper: null,
- dragging: false,
- reverting: false,
- _noFinalSort: null
- } );
-
- if ( this.domPosition.prev ) {
- $( this.domPosition.prev ).after( this.currentItem );
- } else {
- $( this.domPosition.parent ).prepend( this.currentItem );
- }
- }
-
- return this;
-
- },
-
- serialize: function( o ) {
-
- var items = this._getItemsAsjQuery( o && o.connected ),
- str = [];
- o = o || {};
-
- $( items ).each( function() {
- var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
- .match( o.expression || ( /(.+)[\-=_](.+)/ ) );
- if ( res ) {
- str.push(
- ( o.key || res[ 1 ] + "[]" ) +
- "=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
- }
- } );
-
- if ( !str.length && o.key ) {
- str.push( o.key + "=" );
- }
-
- return str.join( "&" );
-
- },
-
- toArray: function( o ) {
-
- var items = this._getItemsAsjQuery( o && o.connected ),
- ret = [];
-
- o = o || {};
-
- items.each( function() {
- ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
- } );
- return ret;
-
- },
-
- /* Be careful with the following core functions */
- _intersectsWith: function( item ) {
-
- var x1 = this.positionAbs.left,
- x2 = x1 + this.helperProportions.width,
- y1 = this.positionAbs.top,
- y2 = y1 + this.helperProportions.height,
- l = item.left,
- r = l + item.width,
- t = item.top,
- b = t + item.height,
- dyClick = this.offset.click.top,
- dxClick = this.offset.click.left,
- isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
- ( y1 + dyClick ) < b ),
- isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
- ( x1 + dxClick ) < r ),
- isOverElement = isOverElementHeight && isOverElementWidth;
-
- if ( this.options.tolerance === "pointer" ||
- this.options.forcePointerForContainers ||
- ( this.options.tolerance !== "pointer" &&
- this.helperProportions[ this.floating ? "width" : "height" ] >
- item[ this.floating ? "width" : "height" ] )
- ) {
- return isOverElement;
- } else {
-
- return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
- x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
- t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
- y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
-
- }
- },
-
- _intersectsWithPointer: function( item ) {
- var verticalDirection, horizontalDirection,
- isOverElementHeight = ( this.options.axis === "x" ) ||
- this._isOverAxis(
- this.positionAbs.top + this.offset.click.top, item.top, item.height ),
- isOverElementWidth = ( this.options.axis === "y" ) ||
- this._isOverAxis(
- this.positionAbs.left + this.offset.click.left, item.left, item.width ),
- isOverElement = isOverElementHeight && isOverElementWidth;
-
- if ( !isOverElement ) {
- return false;
- }
-
- verticalDirection = this.dragDirection.vertical;
- horizontalDirection = this.dragDirection.horizontal;
-
- return this.floating ?
- ( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 ) :
- ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
-
- },
-
- _intersectsWithSides: function( item ) {
-
- var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
- this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
- isOverRightHalf = this._isOverAxis( this.positionAbs.left +
- this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
- verticalDirection = this.dragDirection.vertical,
- horizontalDirection = this.dragDirection.horizontal;
-
- if ( this.floating && horizontalDirection ) {
- return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
- ( horizontalDirection === "left" && !isOverRightHalf ) );
- } else {
- return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
- ( verticalDirection === "up" && !isOverBottomHalf ) );
- }
-
- },
-
- _getDragVerticalDirection: function() {
- var delta = this.positionAbs.top - this.lastPositionAbs.top;
- return delta !== 0 && ( delta > 0 ? "down" : "up" );
- },
-
- _getDragHorizontalDirection: function() {
- var delta = this.positionAbs.left - this.lastPositionAbs.left;
- return delta !== 0 && ( delta > 0 ? "right" : "left" );
- },
-
- refresh: function( event ) {
- this._refreshItems( event );
- this._setHandleClassName();
- this.refreshPositions();
- return this;
- },
-
- _connectWith: function() {
- var options = this.options;
- return options.connectWith.constructor === String ?
- [ options.connectWith ] :
- options.connectWith;
- },
-
- _getItemsAsjQuery: function( connected ) {
-
- var i, j, cur, inst,
- items = [],
- queries = [],
- connectWith = this._connectWith();
-
- if ( connectWith && connected ) {
- for ( i = connectWith.length - 1; i >= 0; i-- ) {
- cur = $( connectWith[ i ], this.document[ 0 ] );
- for ( j = cur.length - 1; j >= 0; j-- ) {
- inst = $.data( cur[ j ], this.widgetFullName );
- if ( inst && inst !== this && !inst.options.disabled ) {
- queries.push( [ typeof inst.options.items === "function" ?
- inst.options.items.call( inst.element ) :
- $( inst.options.items, inst.element )
- .not( ".ui-sortable-helper" )
- .not( ".ui-sortable-placeholder" ), inst ] );
- }
- }
- }
- }
-
- queries.push( [ typeof this.options.items === "function" ?
- this.options.items
- .call( this.element, null, { options: this.options, item: this.currentItem } ) :
- $( this.options.items, this.element )
- .not( ".ui-sortable-helper" )
- .not( ".ui-sortable-placeholder" ), this ] );
-
- function addItems() {
- items.push( this );
- }
- for ( i = queries.length - 1; i >= 0; i-- ) {
- queries[ i ][ 0 ].each( addItems );
- }
-
- return $( items );
-
- },
-
- _removeCurrentsFromItems: function() {
-
- var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
-
- this.items = $.grep( this.items, function( item ) {
- for ( var j = 0; j < list.length; j++ ) {
- if ( list[ j ] === item.item[ 0 ] ) {
- return false;
- }
- }
- return true;
- } );
-
- },
-
- _refreshItems: function( event ) {
-
- this.items = [];
- this.containers = [ this ];
-
- var i, j, cur, inst, targetData, _queries, item, queriesLength,
- items = this.items,
- queries = [ [ typeof this.options.items === "function" ?
- this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
- $( this.options.items, this.element ), this ] ],
- connectWith = this._connectWith();
-
- //Shouldn't be run the first time through due to massive slow-down
- if ( connectWith && this.ready ) {
- for ( i = connectWith.length - 1; i >= 0; i-- ) {
- cur = $( connectWith[ i ], this.document[ 0 ] );
- for ( j = cur.length - 1; j >= 0; j-- ) {
- inst = $.data( cur[ j ], this.widgetFullName );
- if ( inst && inst !== this && !inst.options.disabled ) {
- queries.push( [ typeof inst.options.items === "function" ?
- inst.options.items
- .call( inst.element[ 0 ], event, { item: this.currentItem } ) :
- $( inst.options.items, inst.element ), inst ] );
- this.containers.push( inst );
- }
- }
- }
- }
-
- for ( i = queries.length - 1; i >= 0; i-- ) {
- targetData = queries[ i ][ 1 ];
- _queries = queries[ i ][ 0 ];
-
- for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
- item = $( _queries[ j ] );
-
- // Data for target checking (mouse manager)
- item.data( this.widgetName + "-item", targetData );
-
- items.push( {
- item: item,
- instance: targetData,
- width: 0, height: 0,
- left: 0, top: 0
- } );
- }
- }
-
- },
-
- _refreshItemPositions: function( fast ) {
- var i, item, t, p;
-
- for ( i = this.items.length - 1; i >= 0; i-- ) {
- item = this.items[ i ];
-
- //We ignore calculating positions of all connected containers when we're not over them
- if ( this.currentContainer && item.instance !== this.currentContainer &&
- item.item[ 0 ] !== this.currentItem[ 0 ] ) {
- continue;
- }
-
- t = this.options.toleranceElement ?
- $( this.options.toleranceElement, item.item ) :
- item.item;
-
- if ( !fast ) {
- item.width = t.outerWidth();
- item.height = t.outerHeight();
- }
-
- p = t.offset();
- item.left = p.left;
- item.top = p.top;
- }
- },
-
- refreshPositions: function( fast ) {
-
- // Determine whether items are being displayed horizontally
- this.floating = this.items.length ?
- this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
- false;
-
- // This has to be redone because due to the item being moved out/into the offsetParent,
- // the offsetParent's position will change
- if ( this.offsetParent && this.helper ) {
- this.offset.parent = this._getParentOffset();
- }
-
- this._refreshItemPositions( fast );
-
- var i, p;
-
- if ( this.options.custom && this.options.custom.refreshContainers ) {
- this.options.custom.refreshContainers.call( this );
- } else {
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
- p = this.containers[ i ].element.offset();
- this.containers[ i ].containerCache.left = p.left;
- this.containers[ i ].containerCache.top = p.top;
- this.containers[ i ].containerCache.width =
- this.containers[ i ].element.outerWidth();
- this.containers[ i ].containerCache.height =
- this.containers[ i ].element.outerHeight();
- }
- }
-
- return this;
- },
-
- _createPlaceholder: function( that ) {
- that = that || this;
- var className, nodeName,
- o = that.options;
-
- if ( !o.placeholder || o.placeholder.constructor === String ) {
- className = o.placeholder;
- nodeName = that.currentItem[ 0 ].nodeName.toLowerCase();
- o.placeholder = {
- element: function() {
-
- var element = $( "<" + nodeName + ">", that.document[ 0 ] );
-
- that._addClass( element, "ui-sortable-placeholder",
- className || that.currentItem[ 0 ].className )
- ._removeClass( element, "ui-sortable-helper" );
-
- if ( nodeName === "tbody" ) {
- that._createTrPlaceholder(
- that.currentItem.find( "tr" ).eq( 0 ),
- $( "<tr>", that.document[ 0 ] ).appendTo( element )
- );
- } else if ( nodeName === "tr" ) {
- that._createTrPlaceholder( that.currentItem, element );
- } else if ( nodeName === "img" ) {
- element.attr( "src", that.currentItem.attr( "src" ) );
- }
-
- if ( !className ) {
- element.css( "visibility", "hidden" );
- }
-
- return element;
- },
- update: function( container, p ) {
-
- // 1. If a className is set as 'placeholder option, we don't force sizes -
- // the class is responsible for that
- // 2. The option 'forcePlaceholderSize can be enabled to force it even if a
- // class name is specified
- if ( className && !o.forcePlaceholderSize ) {
- return;
- }
-
- // If the element doesn't have a actual height or width by itself (without
- // styles coming from a stylesheet), it receives the inline height and width
- // from the dragged item. Or, if it's a tbody or tr, it's going to have a height
- // anyway since we're populating them with <td>s above, but they're unlikely to
- // be the correct height on their own if the row heights are dynamic, so we'll
- // always assign the height of the dragged item given forcePlaceholderSize
- // is true.
- if ( !p.height() || ( o.forcePlaceholderSize &&
- ( nodeName === "tbody" || nodeName === "tr" ) ) ) {
- p.height(
- that.currentItem.innerHeight() -
- parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
- parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
- }
- if ( !p.width() ) {
- p.width(
- that.currentItem.innerWidth() -
- parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
- parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
- }
- }
- };
- }
-
- //Create the placeholder
- that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
-
- //Append it after the actual current item
- that.currentItem.after( that.placeholder );
-
- //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
- o.placeholder.update( that, that.placeholder );
-
- },
-
- _createTrPlaceholder: function( sourceTr, targetTr ) {
- var that = this;
-
- sourceTr.children().each( function() {
- $( "<td>&#160;</td>", that.document[ 0 ] )
- .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
- .appendTo( targetTr );
- } );
- },
-
- _contactContainers: function( event ) {
- var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
- floating, axis,
- innermostContainer = null,
- innermostIndex = null;
-
- // Get innermost container that intersects with item
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
-
- // Never consider a container that's located within the item itself
- if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
- continue;
- }
-
- if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
-
- // If we've already found a container and it's more "inner" than this, then continue
- if ( innermostContainer &&
- $.contains(
- this.containers[ i ].element[ 0 ],
- innermostContainer.element[ 0 ] ) ) {
- continue;
- }
-
- innermostContainer = this.containers[ i ];
- innermostIndex = i;
-
- } else {
-
- // container doesn't intersect. trigger "out" event if necessary
- if ( this.containers[ i ].containerCache.over ) {
- this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
- this.containers[ i ].containerCache.over = 0;
- }
- }
-
- }
-
- // If no intersecting containers found, return
- if ( !innermostContainer ) {
- return;
- }
-
- // Move the item into the container if it's not there already
- if ( this.containers.length === 1 ) {
- if ( !this.containers[ innermostIndex ].containerCache.over ) {
- this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
- this.containers[ innermostIndex ].containerCache.over = 1;
- }
- } else {
-
- // When entering a new container, we will find the item with the least distance and
- // append our item near it
- dist = 10000;
- itemWithLeastDistance = null;
- floating = innermostContainer.floating || this._isFloating( this.currentItem );
- posProperty = floating ? "left" : "top";
- sizeProperty = floating ? "width" : "height";
- axis = floating ? "pageX" : "pageY";
-
- for ( j = this.items.length - 1; j >= 0; j-- ) {
- if ( !$.contains(
- this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
- ) {
- continue;
- }
- if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
- continue;
- }
-
- cur = this.items[ j ].item.offset()[ posProperty ];
- nearBottom = false;
- if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
- nearBottom = true;
- }
-
- if ( Math.abs( event[ axis ] - cur ) < dist ) {
- dist = Math.abs( event[ axis ] - cur );
- itemWithLeastDistance = this.items[ j ];
- this.direction = nearBottom ? "up" : "down";
- }
- }
-
- //Check if dropOnEmpty is enabled
- if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
- return;
- }
-
- if ( this.currentContainer === this.containers[ innermostIndex ] ) {
- if ( !this.currentContainer.containerCache.over ) {
- this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
- this.currentContainer.containerCache.over = 1;
- }
- return;
- }
-
- if ( itemWithLeastDistance ) {
- this._rearrange( event, itemWithLeastDistance, null, true );
- } else {
- this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
- }
- this._trigger( "change", event, this._uiHash() );
- this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
- this.currentContainer = this.containers[ innermostIndex ];
-
- //Update the placeholder
- this.options.placeholder.update( this.currentContainer, this.placeholder );
-
- //Update scrollParent
- this.scrollParent = this.placeholder.scrollParent();
-
- //Update overflowOffset
- if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ].tagName !== "HTML" ) {
- this.overflowOffset = this.scrollParent.offset();
- }
-
- this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
- this.containers[ innermostIndex ].containerCache.over = 1;
- }
-
- },
-
- _createHelper: function( event ) {
-
- var o = this.options,
- helper = typeof o.helper === "function" ?
- $( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
- ( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
-
- //Add the helper to the DOM if that didn't happen already
- if ( !helper.parents( "body" ).length ) {
- this.appendTo[ 0 ].appendChild( helper[ 0 ] );
- }
-
- if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
- this._storedCSS = {
- width: this.currentItem[ 0 ].style.width,
- height: this.currentItem[ 0 ].style.height,
- position: this.currentItem.css( "position" ),
- top: this.currentItem.css( "top" ),
- left: this.currentItem.css( "left" )
- };
- }
-
- if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
- helper.width( this.currentItem.width() );
- }
- if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
- helper.height( this.currentItem.height() );
- }
-
- return helper;
-
- },
-
- _adjustOffsetFromHelper: function( obj ) {
- if ( typeof obj === "string" ) {
- obj = obj.split( " " );
- }
- if ( Array.isArray( obj ) ) {
- obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
- }
- if ( "left" in obj ) {
- this.offset.click.left = obj.left + this.margins.left;
- }
- if ( "right" in obj ) {
- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
- }
- if ( "top" in obj ) {
- this.offset.click.top = obj.top + this.margins.top;
- }
- if ( "bottom" in obj ) {
- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
- }
- },
-
- _getParentOffset: function() {
-
- //Get the offsetParent and cache its position
- this.offsetParent = this.helper.offsetParent();
- var po = this.offsetParent.offset();
-
- // This is a special case where we need to modify a offset calculated on start, since the
- // following happened:
- // 1. The position of the helper is absolute, so it's position is calculated based on the
- // next positioned parent
- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
- // the document, which means that the scroll is included in the initial calculation of the
- // offset of the parent, and never recalculated upon drag
- if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
- po.left += this.scrollParent.scrollLeft();
- po.top += this.scrollParent.scrollTop();
- }
-
- // This needs to be actually done for all browsers, since pageX/pageY includes this
- // information with an ugly IE fix
- if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
- ( this.offsetParent[ 0 ].tagName &&
- this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
- po = { top: 0, left: 0 };
- }
-
- return {
- top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
- left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
- };
-
- },
-
- _getRelativeOffset: function() {
-
- if ( this.cssPosition === "relative" ) {
- var p = this.currentItem.position();
- return {
- top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
- this.scrollParent.scrollTop(),
- left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
- this.scrollParent.scrollLeft()
- };
- } else {
- return { top: 0, left: 0 };
- }
-
- },
-
- _cacheMargins: function() {
- this.margins = {
- left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
- top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
- };
- },
-
- _cacheHelperProportions: function() {
- this.helperProportions = {
- width: this.helper.outerWidth(),
- height: this.helper.outerHeight()
- };
- },
-
- _setContainment: function() {
-
- var ce, co, over,
- o = this.options;
- if ( o.containment === "parent" ) {
- o.containment = this.helper[ 0 ].parentNode;
- }
- if ( o.containment === "document" || o.containment === "window" ) {
- this.containment = [
- 0 - this.offset.relative.left - this.offset.parent.left,
- 0 - this.offset.relative.top - this.offset.parent.top,
- o.containment === "document" ?
- this.document.width() :
- this.window.width() - this.helperProportions.width - this.margins.left,
- ( o.containment === "document" ?
- ( this.document.height() || document.body.parentNode.scrollHeight ) :
- this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
- ) - this.helperProportions.height - this.margins.top
- ];
- }
-
- if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
- ce = $( o.containment )[ 0 ];
- co = $( o.containment ).offset();
- over = ( $( ce ).css( "overflow" ) !== "hidden" );
-
- this.containment = [
- co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
- ( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
- co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
- ( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
- co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
- ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
- ( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
- this.helperProportions.width - this.margins.left,
- co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
- ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
- ( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
- this.helperProportions.height - this.margins.top
- ];
- }
-
- },
-
- _convertPositionTo: function( d, pos ) {
-
- if ( !pos ) {
- pos = this.position;
- }
- var mod = d === "absolute" ? 1 : -1,
- scroll = this.cssPosition === "absolute" &&
- !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
- this.offsetParent :
- this.scrollParent,
- scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
-
- return {
- top: (
-
- // The absolute mouse position
- pos.top +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollTop() :
- ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
- ),
- left: (
-
- // The absolute mouse position
- pos.left +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
- scroll.scrollLeft() ) * mod )
- )
- };
-
- },
-
- _generatePosition: function( event ) {
-
- var top, left,
- o = this.options,
- pageX = event.pageX,
- pageY = event.pageY,
- scroll = this.cssPosition === "absolute" &&
- !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
- this.offsetParent :
- this.scrollParent,
- scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
-
- // This is another very weird special case that only happens for relative elements:
- // 1. If the css position is relative
- // 2. and the scroll parent is the document or similar to the offset parent
- // we have to refresh the relative offset during the scroll so there are no jumps
- if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
- this.offset.relative = this._getRelativeOffset();
- }
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
-
- if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
-
- if ( this.containment ) {
- if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
- pageX = this.containment[ 0 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
- pageY = this.containment[ 1 ] + this.offset.click.top;
- }
- if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
- pageX = this.containment[ 2 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
- pageY = this.containment[ 3 ] + this.offset.click.top;
- }
- }
-
- if ( o.grid ) {
- top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
- o.grid[ 1 ] ) * o.grid[ 1 ];
- pageY = this.containment ?
- ( ( top - this.offset.click.top >= this.containment[ 1 ] &&
- top - this.offset.click.top <= this.containment[ 3 ] ) ?
- top :
- ( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
- top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
- top;
-
- left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
- o.grid[ 0 ] ) * o.grid[ 0 ];
- pageX = this.containment ?
- ( ( left - this.offset.click.left >= this.containment[ 0 ] &&
- left - this.offset.click.left <= this.containment[ 2 ] ) ?
- left :
- ( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
- left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
- left;
- }
-
- }
-
- return {
- top: (
-
- // The absolute mouse position
- pageY -
-
- // Click offset (relative to the element)
- this.offset.click.top -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top +
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollTop() :
- ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
- ),
- left: (
-
- // The absolute mouse position
- pageX -
-
- // Click offset (relative to the element)
- this.offset.click.left -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left +
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollLeft() :
- scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
- )
- };
-
- },
-
- _rearrange: function( event, i, a, hardRefresh ) {
-
- if ( a ) {
- a[ 0 ].appendChild( this.placeholder[ 0 ] );
- } else {
- i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
- ( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
- }
-
- //Various things done here to improve the performance:
- // 1. we create a setTimeout, that calls refreshPositions
- // 2. on the instance, we have a counter variable, that get's higher after every append
- // 3. on the local scope, we copy the counter variable, and check in the timeout,
- // if it's still the same
- // 4. this lets only the last addition to the timeout stack through
- this.counter = this.counter ? ++this.counter : 1;
- var counter = this.counter;
-
- this._delay( function() {
- if ( counter === this.counter ) {
-
- //Precompute after each DOM insertion, NOT on mousemove
- this.refreshPositions( !hardRefresh );
- }
- } );
-
- },
-
- _clear: function( event, noPropagation ) {
-
- this.reverting = false;
-
- // We delay all events that have to be triggered to after the point where the placeholder
- // has been removed and everything else normalized again
- var i,
- delayedTriggers = [];
-
- // We first have to update the dom position of the actual currentItem
- // Note: don't do it if the current item is already removed (by a user), or it gets
- // reappended (see #4088)
- if ( !this._noFinalSort && this.currentItem.parent().length ) {
- this.placeholder.before( this.currentItem );
- }
- this._noFinalSort = null;
-
- if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
- for ( i in this._storedCSS ) {
- if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
- this._storedCSS[ i ] = "";
- }
- }
- this.currentItem.css( this._storedCSS );
- this._removeClass( this.currentItem, "ui-sortable-helper" );
- } else {
- this.currentItem.show();
- }
-
- if ( this.fromOutside && !noPropagation ) {
- delayedTriggers.push( function( event ) {
- this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
- } );
- }
- if ( ( this.fromOutside ||
- this.domPosition.prev !==
- this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
- this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
-
- // Trigger update callback if the DOM position has changed
- delayedTriggers.push( function( event ) {
- this._trigger( "update", event, this._uiHash() );
- } );
- }
-
- // Check if the items Container has Changed and trigger appropriate
- // events.
- if ( this !== this.currentContainer ) {
- if ( !noPropagation ) {
- delayedTriggers.push( function( event ) {
- this._trigger( "remove", event, this._uiHash() );
- } );
- delayedTriggers.push( ( function( c ) {
- return function( event ) {
- c._trigger( "receive", event, this._uiHash( this ) );
- };
- } ).call( this, this.currentContainer ) );
- delayedTriggers.push( ( function( c ) {
- return function( event ) {
- c._trigger( "update", event, this._uiHash( this ) );
- };
- } ).call( this, this.currentContainer ) );
- }
- }
-
- //Post events to containers
- function delayEvent( type, instance, container ) {
- return function( event ) {
- container._trigger( type, event, instance._uiHash( instance ) );
- };
- }
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
- if ( !noPropagation ) {
- delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
- }
- if ( this.containers[ i ].containerCache.over ) {
- delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
- this.containers[ i ].containerCache.over = 0;
- }
- }
-
- //Do what was originally in plugins
- if ( this.storedCursor ) {
- this.document.find( "body" ).css( "cursor", this.storedCursor );
- this.storedStylesheet.remove();
- }
- if ( this._storedOpacity ) {
- this.helper.css( "opacity", this._storedOpacity );
- }
- if ( this._storedZIndex ) {
- this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
- }
-
- this.dragging = false;
-
- if ( !noPropagation ) {
- this._trigger( "beforeStop", event, this._uiHash() );
- }
-
- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
- // it unbinds ALL events from the original node!
- this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
-
- if ( !this.cancelHelperRemoval ) {
- if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
- this.helper.remove();
- }
- this.helper = null;
- }
-
- if ( !noPropagation ) {
- for ( i = 0; i < delayedTriggers.length; i++ ) {
-
- // Trigger all delayed events
- delayedTriggers[ i ].call( this, event );
- }
- this._trigger( "stop", event, this._uiHash() );
- }
-
- this.fromOutside = false;
- return !this.cancelHelperRemoval;
-
- },
-
- _trigger: function() {
- if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
- this.cancel();
- }
- },
-
- _uiHash: function( _inst ) {
- var inst = _inst || this;
- return {
- helper: inst.helper,
- placeholder: inst.placeholder || $( [] ),
- position: inst.position,
- originalPosition: inst.originalPosition,
- offset: inst.positionAbs,
- item: inst.currentItem,
- sender: _inst ? _inst.element : null
- };
- }
-
-} );
-
-
-/*!
- * jQuery UI Spinner 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Spinner
-//>>group: Widgets
-//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
-//>>docs: http://api.jqueryui.com/spinner/
-//>>demos: http://jqueryui.com/spinner/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/spinner.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-function spinnerModifier( fn ) {
- return function() {
- var previous = this.element.val();
- fn.apply( this, arguments );
- this._refresh();
- if ( previous !== this.element.val() ) {
- this._trigger( "change" );
- }
- };
-}
-
-$.widget( "ui.spinner", {
- version: "1.13.1",
- defaultElement: "<input>",
- widgetEventPrefix: "spin",
- options: {
- classes: {
- "ui-spinner": "ui-corner-all",
- "ui-spinner-down": "ui-corner-br",
- "ui-spinner-up": "ui-corner-tr"
- },
- culture: null,
- icons: {
- down: "ui-icon-triangle-1-s",
- up: "ui-icon-triangle-1-n"
- },
- incremental: true,
- max: null,
- min: null,
- numberFormat: null,
- page: 10,
- step: 1,
-
- change: null,
- spin: null,
- start: null,
- stop: null
- },
-
- _create: function() {
-
- // handle string values that need to be parsed
- this._setOption( "max", this.options.max );
- this._setOption( "min", this.options.min );
- this._setOption( "step", this.options.step );
-
- // Only format if there is a value, prevents the field from being marked
- // as invalid in Firefox, see #9573.
- if ( this.value() !== "" ) {
-
- // Format the value, but don't constrain.
- this._value( this.element.val(), true );
- }
-
- this._draw();
- this._on( this._events );
- this._refresh();
-
- // Turning off autocomplete prevents the browser from remembering the
- // value when navigating through history, so we re-enable autocomplete
- // if the page is unloaded before the widget is destroyed. #7790
- this._on( this.window, {
- beforeunload: function() {
- this.element.removeAttr( "autocomplete" );
- }
- } );
- },
-
- _getCreateOptions: function() {
- var options = this._super();
- var element = this.element;
-
- $.each( [ "min", "max", "step" ], function( i, option ) {
- var value = element.attr( option );
- if ( value != null && value.length ) {
- options[ option ] = value;
- }
- } );
-
- return options;
- },
-
- _events: {
- keydown: function( event ) {
- if ( this._start( event ) && this._keydown( event ) ) {
- event.preventDefault();
- }
- },
- keyup: "_stop",
- focus: function() {
- this.previous = this.element.val();
- },
- blur: function( event ) {
- if ( this.cancelBlur ) {
- delete this.cancelBlur;
- return;
- }
-
- this._stop();
- this._refresh();
- if ( this.previous !== this.element.val() ) {
- this._trigger( "change", event );
- }
- },
- mousewheel: function( event, delta ) {
- var activeElement = $.ui.safeActiveElement( this.document[ 0 ] );
- var isActive = this.element[ 0 ] === activeElement;
-
- if ( !isActive || !delta ) {
- return;
- }
-
- if ( !this.spinning && !this._start( event ) ) {
- return false;
- }
-
- this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
- clearTimeout( this.mousewheelTimer );
- this.mousewheelTimer = this._delay( function() {
- if ( this.spinning ) {
- this._stop( event );
- }
- }, 100 );
- event.preventDefault();
- },
- "mousedown .ui-spinner-button": function( event ) {
- var previous;
-
- // We never want the buttons to have focus; whenever the user is
- // interacting with the spinner, the focus should be on the input.
- // If the input is focused then this.previous is properly set from
- // when the input first received focus. If the input is not focused
- // then we need to set this.previous based on the value before spinning.
- previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
- this.previous : this.element.val();
- function checkFocus() {
- var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
- if ( !isActive ) {
- this.element.trigger( "focus" );
- this.previous = previous;
-
- // support: IE
- // IE sets focus asynchronously, so we need to check if focus
- // moved off of the input because the user clicked on the button.
- this._delay( function() {
- this.previous = previous;
- } );
- }
- }
-
- // Ensure focus is on (or stays on) the text field
- event.preventDefault();
- checkFocus.call( this );
-
- // Support: IE
- // IE doesn't prevent moving focus even with event.preventDefault()
- // so we set a flag to know when we should ignore the blur event
- // and check (again) if focus moved off of the input.
- this.cancelBlur = true;
- this._delay( function() {
- delete this.cancelBlur;
- checkFocus.call( this );
- } );
-
- if ( this._start( event ) === false ) {
- return;
- }
-
- this._repeat( null, $( event.currentTarget )
- .hasClass( "ui-spinner-up" ) ? 1 : -1, event );
- },
- "mouseup .ui-spinner-button": "_stop",
- "mouseenter .ui-spinner-button": function( event ) {
-
- // button will add ui-state-active if mouse was down while mouseleave and kept down
- if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
- return;
- }
-
- if ( this._start( event ) === false ) {
- return false;
- }
- this._repeat( null, $( event.currentTarget )
- .hasClass( "ui-spinner-up" ) ? 1 : -1, event );
- },
-
- // TODO: do we really want to consider this a stop?
- // shouldn't we just stop the repeater and wait until mouseup before
- // we trigger the stop event?
- "mouseleave .ui-spinner-button": "_stop"
- },
-
- // Support mobile enhanced option and make backcompat more sane
- _enhance: function() {
- this.uiSpinner = this.element
- .attr( "autocomplete", "off" )
- .wrap( "<span>" )
- .parent()
-
- // Add buttons
- .append(
- "<a></a><a></a>"
- );
- },
-
- _draw: function() {
- this._enhance();
-
- this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
- this._addClass( "ui-spinner-input" );
-
- this.element.attr( "role", "spinbutton" );
-
- // Button bindings
- this.buttons = this.uiSpinner.children( "a" )
- .attr( "tabIndex", -1 )
- .attr( "aria-hidden", true )
- .button( {
- classes: {
- "ui-button": ""
- }
- } );
-
- // TODO: Right now button does not support classes this is already updated in button PR
- this._removeClass( this.buttons, "ui-corner-all" );
-
- this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
- this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
- this.buttons.first().button( {
- "icon": this.options.icons.up,
- "showLabel": false
- } );
- this.buttons.last().button( {
- "icon": this.options.icons.down,
- "showLabel": false
- } );
-
- // IE 6 doesn't understand height: 50% for the buttons
- // unless the wrapper has an explicit height
- if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
- this.uiSpinner.height() > 0 ) {
- this.uiSpinner.height( this.uiSpinner.height() );
- }
- },
-
- _keydown: function( event ) {
- var options = this.options,
- keyCode = $.ui.keyCode;
-
- switch ( event.keyCode ) {
- case keyCode.UP:
- this._repeat( null, 1, event );
- return true;
- case keyCode.DOWN:
- this._repeat( null, -1, event );
- return true;
- case keyCode.PAGE_UP:
- this._repeat( null, options.page, event );
- return true;
- case keyCode.PAGE_DOWN:
- this._repeat( null, -options.page, event );
- return true;
- }
-
- return false;
- },
-
- _start: function( event ) {
- if ( !this.spinning && this._trigger( "start", event ) === false ) {
- return false;
- }
-
- if ( !this.counter ) {
- this.counter = 1;
- }
- this.spinning = true;
- return true;
- },
-
- _repeat: function( i, steps, event ) {
- i = i || 500;
-
- clearTimeout( this.timer );
- this.timer = this._delay( function() {
- this._repeat( 40, steps, event );
- }, i );
-
- this._spin( steps * this.options.step, event );
- },
-
- _spin: function( step, event ) {
- var value = this.value() || 0;
-
- if ( !this.counter ) {
- this.counter = 1;
- }
-
- value = this._adjustValue( value + step * this._increment( this.counter ) );
-
- if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
- this._value( value );
- this.counter++;
- }
- },
-
- _increment: function( i ) {
- var incremental = this.options.incremental;
-
- if ( incremental ) {
- return typeof incremental === "function" ?
- incremental( i ) :
- Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
- }
-
- return 1;
- },
-
- _precision: function() {
- var precision = this._precisionOf( this.options.step );
- if ( this.options.min !== null ) {
- precision = Math.max( precision, this._precisionOf( this.options.min ) );
- }
- return precision;
- },
-
- _precisionOf: function( num ) {
- var str = num.toString(),
- decimal = str.indexOf( "." );
- return decimal === -1 ? 0 : str.length - decimal - 1;
- },
-
- _adjustValue: function( value ) {
- var base, aboveMin,
- options = this.options;
-
- // Make sure we're at a valid step
- // - find out where we are relative to the base (min or 0)
- base = options.min !== null ? options.min : 0;
- aboveMin = value - base;
-
- // - round to the nearest step
- aboveMin = Math.round( aboveMin / options.step ) * options.step;
-
- // - rounding is based on 0, so adjust back to our base
- value = base + aboveMin;
-
- // Fix precision from bad JS floating point math
- value = parseFloat( value.toFixed( this._precision() ) );
-
- // Clamp the value
- if ( options.max !== null && value > options.max ) {
- return options.max;
- }
- if ( options.min !== null && value < options.min ) {
- return options.min;
- }
-
- return value;
- },
-
- _stop: function( event ) {
- if ( !this.spinning ) {
- return;
- }
-
- clearTimeout( this.timer );
- clearTimeout( this.mousewheelTimer );
- this.counter = 0;
- this.spinning = false;
- this._trigger( "stop", event );
- },
-
- _setOption: function( key, value ) {
- var prevValue, first, last;
-
- if ( key === "culture" || key === "numberFormat" ) {
- prevValue = this._parse( this.element.val() );
- this.options[ key ] = value;
- this.element.val( this._format( prevValue ) );
- return;
- }
-
- if ( key === "max" || key === "min" || key === "step" ) {
- if ( typeof value === "string" ) {
- value = this._parse( value );
- }
- }
- if ( key === "icons" ) {
- first = this.buttons.first().find( ".ui-icon" );
- this._removeClass( first, null, this.options.icons.up );
- this._addClass( first, null, value.up );
- last = this.buttons.last().find( ".ui-icon" );
- this._removeClass( last, null, this.options.icons.down );
- this._addClass( last, null, value.down );
- }
-
- this._super( key, value );
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
- this.element.prop( "disabled", !!value );
- this.buttons.button( value ? "disable" : "enable" );
- },
-
- _setOptions: spinnerModifier( function( options ) {
- this._super( options );
- } ),
-
- _parse: function( val ) {
- if ( typeof val === "string" && val !== "" ) {
- val = window.Globalize && this.options.numberFormat ?
- Globalize.parseFloat( val, 10, this.options.culture ) : +val;
- }
- return val === "" || isNaN( val ) ? null : val;
- },
-
- _format: function( value ) {
- if ( value === "" ) {
- return "";
- }
- return window.Globalize && this.options.numberFormat ?
- Globalize.format( value, this.options.numberFormat, this.options.culture ) :
- value;
- },
-
- _refresh: function() {
- this.element.attr( {
- "aria-valuemin": this.options.min,
- "aria-valuemax": this.options.max,
-
- // TODO: what should we do with values that can't be parsed?
- "aria-valuenow": this._parse( this.element.val() )
- } );
- },
-
- isValid: function() {
- var value = this.value();
-
- // Null is invalid
- if ( value === null ) {
- return false;
- }
-
- // If value gets adjusted, it's invalid
- return value === this._adjustValue( value );
- },
-
- // Update the value without triggering change
- _value: function( value, allowAny ) {
- var parsed;
- if ( value !== "" ) {
- parsed = this._parse( value );
- if ( parsed !== null ) {
- if ( !allowAny ) {
- parsed = this._adjustValue( parsed );
- }
- value = this._format( parsed );
- }
- }
- this.element.val( value );
- this._refresh();
- },
-
- _destroy: function() {
- this.element
- .prop( "disabled", false )
- .removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
-
- this.uiSpinner.replaceWith( this.element );
- },
-
- stepUp: spinnerModifier( function( steps ) {
- this._stepUp( steps );
- } ),
- _stepUp: function( steps ) {
- if ( this._start() ) {
- this._spin( ( steps || 1 ) * this.options.step );
- this._stop();
- }
- },
-
- stepDown: spinnerModifier( function( steps ) {
- this._stepDown( steps );
- } ),
- _stepDown: function( steps ) {
- if ( this._start() ) {
- this._spin( ( steps || 1 ) * -this.options.step );
- this._stop();
- }
- },
-
- pageUp: spinnerModifier( function( pages ) {
- this._stepUp( ( pages || 1 ) * this.options.page );
- } ),
-
- pageDown: spinnerModifier( function( pages ) {
- this._stepDown( ( pages || 1 ) * this.options.page );
- } ),
-
- value: function( newVal ) {
- if ( !arguments.length ) {
- return this._parse( this.element.val() );
- }
- spinnerModifier( this._value ).call( this, newVal );
- },
-
- widget: function() {
- return this.uiSpinner;
- }
-} );
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for spinner html extension points
- $.widget( "ui.spinner", $.ui.spinner, {
- _enhance: function() {
- this.uiSpinner = this.element
- .attr( "autocomplete", "off" )
- .wrap( this._uiSpinnerHtml() )
- .parent()
-
- // Add buttons
- .append( this._buttonHtml() );
- },
- _uiSpinnerHtml: function() {
- return "<span>";
- },
-
- _buttonHtml: function() {
- return "<a></a><a></a>";
- }
- } );
-}
-
-var widgetsSpinner = $.ui.spinner;
-
-
-/*!
- * jQuery UI Tabs 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Tabs
-//>>group: Widgets
-//>>description: Transforms a set of container elements into a tab structure.
-//>>docs: http://api.jqueryui.com/tabs/
-//>>demos: http://jqueryui.com/tabs/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/tabs.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.tabs", {
- version: "1.13.1",
- delay: 300,
- options: {
- active: null,
- classes: {
- "ui-tabs": "ui-corner-all",
- "ui-tabs-nav": "ui-corner-all",
- "ui-tabs-panel": "ui-corner-bottom",
- "ui-tabs-tab": "ui-corner-top"
- },
- collapsible: false,
- event: "click",
- heightStyle: "content",
- hide: null,
- show: null,
-
- // Callbacks
- activate: null,
- beforeActivate: null,
- beforeLoad: null,
- load: null
- },
-
- _isLocal: ( function() {
- var rhash = /#.*$/;
-
- return function( anchor ) {
- var anchorUrl, locationUrl;
-
- anchorUrl = anchor.href.replace( rhash, "" );
- locationUrl = location.href.replace( rhash, "" );
-
- // Decoding may throw an error if the URL isn't UTF-8 (#9518)
- try {
- anchorUrl = decodeURIComponent( anchorUrl );
- } catch ( error ) {}
- try {
- locationUrl = decodeURIComponent( locationUrl );
- } catch ( error ) {}
-
- return anchor.hash.length > 1 && anchorUrl === locationUrl;
- };
- } )(),
-
- _create: function() {
- var that = this,
- options = this.options;
-
- this.running = false;
-
- this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
- this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
-
- this._processTabs();
- options.active = this._initialActive();
-
- // Take disabling tabs via class attribute from HTML
- // into account and update option properly.
- if ( Array.isArray( options.disabled ) ) {
- options.disabled = $.uniqueSort( options.disabled.concat(
- $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
- return that.tabs.index( li );
- } )
- ) ).sort();
- }
-
- // Check for length avoids error when initializing empty list
- if ( this.options.active !== false && this.anchors.length ) {
- this.active = this._findActive( options.active );
- } else {
- this.active = $();
- }
-
- this._refresh();
-
- if ( this.active.length ) {
- this.load( options.active );
- }
- },
-
- _initialActive: function() {
- var active = this.options.active,
- collapsible = this.options.collapsible,
- locationHash = location.hash.substring( 1 );
-
- if ( active === null ) {
-
- // check the fragment identifier in the URL
- if ( locationHash ) {
- this.tabs.each( function( i, tab ) {
- if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
- active = i;
- return false;
- }
- } );
- }
-
- // Check for a tab marked active via a class
- if ( active === null ) {
- active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
- }
-
- // No active tab, set to false
- if ( active === null || active === -1 ) {
- active = this.tabs.length ? 0 : false;
- }
- }
-
- // Handle numbers: negative, out of range
- if ( active !== false ) {
- active = this.tabs.index( this.tabs.eq( active ) );
- if ( active === -1 ) {
- active = collapsible ? false : 0;
- }
- }
-
- // Don't allow collapsible: false and active: false
- if ( !collapsible && active === false && this.anchors.length ) {
- active = 0;
- }
-
- return active;
- },
-
- _getCreateEventData: function() {
- return {
- tab: this.active,
- panel: !this.active.length ? $() : this._getPanelForTab( this.active )
- };
- },
-
- _tabKeydown: function( event ) {
- var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
- selectedIndex = this.tabs.index( focusedTab ),
- goingForward = true;
-
- if ( this._handlePageNav( event ) ) {
- return;
- }
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.RIGHT:
- case $.ui.keyCode.DOWN:
- selectedIndex++;
- break;
- case $.ui.keyCode.UP:
- case $.ui.keyCode.LEFT:
- goingForward = false;
- selectedIndex--;
- break;
- case $.ui.keyCode.END:
- selectedIndex = this.anchors.length - 1;
- break;
- case $.ui.keyCode.HOME:
- selectedIndex = 0;
- break;
- case $.ui.keyCode.SPACE:
-
- // Activate only, no collapsing
- event.preventDefault();
- clearTimeout( this.activating );
- this._activate( selectedIndex );
- return;
- case $.ui.keyCode.ENTER:
-
- // Toggle (cancel delayed activation, allow collapsing)
- event.preventDefault();
- clearTimeout( this.activating );
-
- // Determine if we should collapse or activate
- this._activate( selectedIndex === this.options.active ? false : selectedIndex );
- return;
- default:
- return;
- }
-
- // Focus the appropriate tab, based on which key was pressed
- event.preventDefault();
- clearTimeout( this.activating );
- selectedIndex = this._focusNextTab( selectedIndex, goingForward );
-
- // Navigating with control/command key will prevent automatic activation
- if ( !event.ctrlKey && !event.metaKey ) {
-
- // Update aria-selected immediately so that AT think the tab is already selected.
- // Otherwise AT may confuse the user by stating that they need to activate the tab,
- // but the tab will already be activated by the time the announcement finishes.
- focusedTab.attr( "aria-selected", "false" );
- this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
-
- this.activating = this._delay( function() {
- this.option( "active", selectedIndex );
- }, this.delay );
- }
- },
-
- _panelKeydown: function( event ) {
- if ( this._handlePageNav( event ) ) {
- return;
- }
-
- // Ctrl+up moves focus to the current tab
- if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
- event.preventDefault();
- this.active.trigger( "focus" );
- }
- },
-
- // Alt+page up/down moves focus to the previous/next tab (and activates)
- _handlePageNav: function( event ) {
- if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
- this._activate( this._focusNextTab( this.options.active - 1, false ) );
- return true;
- }
- if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
- this._activate( this._focusNextTab( this.options.active + 1, true ) );
- return true;
- }
- },
-
- _findNextTab: function( index, goingForward ) {
- var lastTabIndex = this.tabs.length - 1;
-
- function constrain() {
- if ( index > lastTabIndex ) {
- index = 0;
- }
- if ( index < 0 ) {
- index = lastTabIndex;
- }
- return index;
- }
-
- while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
- index = goingForward ? index + 1 : index - 1;
- }
-
- return index;
- },
-
- _focusNextTab: function( index, goingForward ) {
- index = this._findNextTab( index, goingForward );
- this.tabs.eq( index ).trigger( "focus" );
- return index;
- },
-
- _setOption: function( key, value ) {
- if ( key === "active" ) {
-
- // _activate() will handle invalid values and update this.options
- this._activate( value );
- return;
- }
-
- this._super( key, value );
-
- if ( key === "collapsible" ) {
- this._toggleClass( "ui-tabs-collapsible", null, value );
-
- // Setting collapsible: false while collapsed; open first panel
- if ( !value && this.options.active === false ) {
- this._activate( 0 );
- }
- }
-
- if ( key === "event" ) {
- this._setupEvents( value );
- }
-
- if ( key === "heightStyle" ) {
- this._setupHeightStyle( value );
- }
- },
-
- _sanitizeSelector: function( hash ) {
- return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
- },
-
- refresh: function() {
- var options = this.options,
- lis = this.tablist.children( ":has(a[href])" );
-
- // Get disabled tabs from class attribute from HTML
- // this will get converted to a boolean if needed in _refresh()
- options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
- return lis.index( tab );
- } );
-
- this._processTabs();
-
- // Was collapsed or no tabs
- if ( options.active === false || !this.anchors.length ) {
- options.active = false;
- this.active = $();
-
- // was active, but active tab is gone
- } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
-
- // all remaining tabs are disabled
- if ( this.tabs.length === options.disabled.length ) {
- options.active = false;
- this.active = $();
-
- // activate previous tab
- } else {
- this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
- }
-
- // was active, active tab still exists
- } else {
-
- // make sure active index is correct
- options.active = this.tabs.index( this.active );
- }
-
- this._refresh();
- },
-
- _refresh: function() {
- this._setOptionDisabled( this.options.disabled );
- this._setupEvents( this.options.event );
- this._setupHeightStyle( this.options.heightStyle );
-
- this.tabs.not( this.active ).attr( {
- "aria-selected": "false",
- "aria-expanded": "false",
- tabIndex: -1
- } );
- this.panels.not( this._getPanelForTab( this.active ) )
- .hide()
- .attr( {
- "aria-hidden": "true"
- } );
-
- // Make sure one tab is in the tab order
- if ( !this.active.length ) {
- this.tabs.eq( 0 ).attr( "tabIndex", 0 );
- } else {
- this.active
- .attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } );
- this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
- this._getPanelForTab( this.active )
- .show()
- .attr( {
- "aria-hidden": "false"
- } );
- }
- },
-
- _processTabs: function() {
- var that = this,
- prevTabs = this.tabs,
- prevAnchors = this.anchors,
- prevPanels = this.panels;
-
- this.tablist = this._getList().attr( "role", "tablist" );
- this._addClass( this.tablist, "ui-tabs-nav",
- "ui-helper-reset ui-helper-clearfix ui-widget-header" );
-
- // Prevent users from focusing disabled tabs via click
- this.tablist
- .on( "mousedown" + this.eventNamespace, "> li", function( event ) {
- if ( $( this ).is( ".ui-state-disabled" ) ) {
- event.preventDefault();
- }
- } )
-
- // Support: IE <9
- // Preventing the default action in mousedown doesn't prevent IE
- // from focusing the element, so if the anchor gets focused, blur.
- // We don't have to worry about focusing the previously focused
- // element since clicking on a non-focusable element should focus
- // the body anyway.
- .on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
- if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
- this.blur();
- }
- } );
-
- this.tabs = this.tablist.find( "> li:has(a[href])" )
- .attr( {
- role: "tab",
- tabIndex: -1
- } );
- this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
-
- this.anchors = this.tabs.map( function() {
- return $( "a", this )[ 0 ];
- } )
- .attr( {
- tabIndex: -1
- } );
- this._addClass( this.anchors, "ui-tabs-anchor" );
-
- this.panels = $();
-
- this.anchors.each( function( i, anchor ) {
- var selector, panel, panelId,
- anchorId = $( anchor ).uniqueId().attr( "id" ),
- tab = $( anchor ).closest( "li" ),
- originalAriaControls = tab.attr( "aria-controls" );
-
- // Inline tab
- if ( that._isLocal( anchor ) ) {
- selector = anchor.hash;
- panelId = selector.substring( 1 );
- panel = that.element.find( that._sanitizeSelector( selector ) );
-
- // remote tab
- } else {
-
- // If the tab doesn't already have aria-controls,
- // generate an id by using a throw-away element
- panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
- selector = "#" + panelId;
- panel = that.element.find( selector );
- if ( !panel.length ) {
- panel = that._createPanel( panelId );
- panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
- }
- panel.attr( "aria-live", "polite" );
- }
-
- if ( panel.length ) {
- that.panels = that.panels.add( panel );
- }
- if ( originalAriaControls ) {
- tab.data( "ui-tabs-aria-controls", originalAriaControls );
- }
- tab.attr( {
- "aria-controls": panelId,
- "aria-labelledby": anchorId
- } );
- panel.attr( "aria-labelledby", anchorId );
- } );
-
- this.panels.attr( "role", "tabpanel" );
- this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
-
- // Avoid memory leaks (#10056)
- if ( prevTabs ) {
- this._off( prevTabs.not( this.tabs ) );
- this._off( prevAnchors.not( this.anchors ) );
- this._off( prevPanels.not( this.panels ) );
- }
- },
-
- // Allow overriding how to find the list for rare usage scenarios (#7715)
- _getList: function() {
- return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
- },
-
- _createPanel: function( id ) {
- return $( "<div>" )
- .attr( "id", id )
- .data( "ui-tabs-destroy", true );
- },
-
- _setOptionDisabled: function( disabled ) {
- var currentItem, li, i;
-
- if ( Array.isArray( disabled ) ) {
- if ( !disabled.length ) {
- disabled = false;
- } else if ( disabled.length === this.anchors.length ) {
- disabled = true;
- }
- }
-
- // Disable tabs
- for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
- currentItem = $( li );
- if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
- currentItem.attr( "aria-disabled", "true" );
- this._addClass( currentItem, null, "ui-state-disabled" );
- } else {
- currentItem.removeAttr( "aria-disabled" );
- this._removeClass( currentItem, null, "ui-state-disabled" );
- }
- }
-
- this.options.disabled = disabled;
-
- this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
- disabled === true );
- },
-
- _setupEvents: function( event ) {
- var events = {};
- if ( event ) {
- $.each( event.split( " " ), function( index, eventName ) {
- events[ eventName ] = "_eventHandler";
- } );
- }
-
- this._off( this.anchors.add( this.tabs ).add( this.panels ) );
-
- // Always prevent the default action, even when disabled
- this._on( true, this.anchors, {
- click: function( event ) {
- event.preventDefault();
- }
- } );
- this._on( this.anchors, events );
- this._on( this.tabs, { keydown: "_tabKeydown" } );
- this._on( this.panels, { keydown: "_panelKeydown" } );
-
- this._focusable( this.tabs );
- this._hoverable( this.tabs );
- },
-
- _setupHeightStyle: function( heightStyle ) {
- var maxHeight,
- parent = this.element.parent();
-
- if ( heightStyle === "fill" ) {
- maxHeight = parent.height();
- maxHeight -= this.element.outerHeight() - this.element.height();
-
- this.element.siblings( ":visible" ).each( function() {
- var elem = $( this ),
- position = elem.css( "position" );
-
- if ( position === "absolute" || position === "fixed" ) {
- return;
- }
- maxHeight -= elem.outerHeight( true );
- } );
-
- this.element.children().not( this.panels ).each( function() {
- maxHeight -= $( this ).outerHeight( true );
- } );
-
- this.panels.each( function() {
- $( this ).height( Math.max( 0, maxHeight -
- $( this ).innerHeight() + $( this ).height() ) );
- } )
- .css( "overflow", "auto" );
- } else if ( heightStyle === "auto" ) {
- maxHeight = 0;
- this.panels.each( function() {
- maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
- } ).height( maxHeight );
- }
- },
-
- _eventHandler: function( event ) {
- var options = this.options,
- active = this.active,
- anchor = $( event.currentTarget ),
- tab = anchor.closest( "li" ),
- clickedIsActive = tab[ 0 ] === active[ 0 ],
- collapsing = clickedIsActive && options.collapsible,
- toShow = collapsing ? $() : this._getPanelForTab( tab ),
- toHide = !active.length ? $() : this._getPanelForTab( active ),
- eventData = {
- oldTab: active,
- oldPanel: toHide,
- newTab: collapsing ? $() : tab,
- newPanel: toShow
- };
-
- event.preventDefault();
-
- if ( tab.hasClass( "ui-state-disabled" ) ||
-
- // tab is already loading
- tab.hasClass( "ui-tabs-loading" ) ||
-
- // can't switch durning an animation
- this.running ||
-
- // click on active header, but not collapsible
- ( clickedIsActive && !options.collapsible ) ||
-
- // allow canceling activation
- ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
- return;
- }
-
- options.active = collapsing ? false : this.tabs.index( tab );
-
- this.active = clickedIsActive ? $() : tab;
- if ( this.xhr ) {
- this.xhr.abort();
- }
-
- if ( !toHide.length && !toShow.length ) {
- $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
- }
-
- if ( toShow.length ) {
- this.load( this.tabs.index( tab ), event );
- }
- this._toggle( event, eventData );
- },
-
- // Handles show/hide for selecting tabs
- _toggle: function( event, eventData ) {
- var that = this,
- toShow = eventData.newPanel,
- toHide = eventData.oldPanel;
-
- this.running = true;
-
- function complete() {
- that.running = false;
- that._trigger( "activate", event, eventData );
- }
-
- function show() {
- that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
-
- if ( toShow.length && that.options.show ) {
- that._show( toShow, that.options.show, complete );
- } else {
- toShow.show();
- complete();
- }
- }
-
- // Start out by hiding, then showing, then completing
- if ( toHide.length && this.options.hide ) {
- this._hide( toHide, this.options.hide, function() {
- that._removeClass( eventData.oldTab.closest( "li" ),
- "ui-tabs-active", "ui-state-active" );
- show();
- } );
- } else {
- this._removeClass( eventData.oldTab.closest( "li" ),
- "ui-tabs-active", "ui-state-active" );
- toHide.hide();
- show();
- }
-
- toHide.attr( "aria-hidden", "true" );
- eventData.oldTab.attr( {
- "aria-selected": "false",
- "aria-expanded": "false"
- } );
-
- // If we're switching tabs, remove the old tab from the tab order.
- // If we're opening from collapsed state, remove the previous tab from the tab order.
- // If we're collapsing, then keep the collapsing tab in the tab order.
- if ( toShow.length && toHide.length ) {
- eventData.oldTab.attr( "tabIndex", -1 );
- } else if ( toShow.length ) {
- this.tabs.filter( function() {
- return $( this ).attr( "tabIndex" ) === 0;
- } )
- .attr( "tabIndex", -1 );
- }
-
- toShow.attr( "aria-hidden", "false" );
- eventData.newTab.attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } );
- },
-
- _activate: function( index ) {
- var anchor,
- active = this._findActive( index );
-
- // Trying to activate the already active panel
- if ( active[ 0 ] === this.active[ 0 ] ) {
- return;
- }
-
- // Trying to collapse, simulate a click on the current active header
- if ( !active.length ) {
- active = this.active;
- }
-
- anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
- this._eventHandler( {
- target: anchor,
- currentTarget: anchor,
- preventDefault: $.noop
- } );
- },
-
- _findActive: function( index ) {
- return index === false ? $() : this.tabs.eq( index );
- },
-
- _getIndex: function( index ) {
-
- // meta-function to give users option to provide a href string instead of a numerical index.
- if ( typeof index === "string" ) {
- index = this.anchors.index( this.anchors.filter( "[href$='" +
- $.escapeSelector( index ) + "']" ) );
- }
-
- return index;
- },
-
- _destroy: function() {
- if ( this.xhr ) {
- this.xhr.abort();
- }
-
- this.tablist
- .removeAttr( "role" )
- .off( this.eventNamespace );
-
- this.anchors
- .removeAttr( "role tabIndex" )
- .removeUniqueId();
-
- this.tabs.add( this.panels ).each( function() {
- if ( $.data( this, "ui-tabs-destroy" ) ) {
- $( this ).remove();
- } else {
- $( this ).removeAttr( "role tabIndex " +
- "aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
- }
- } );
-
- this.tabs.each( function() {
- var li = $( this ),
- prev = li.data( "ui-tabs-aria-controls" );
- if ( prev ) {
- li
- .attr( "aria-controls", prev )
- .removeData( "ui-tabs-aria-controls" );
- } else {
- li.removeAttr( "aria-controls" );
- }
- } );
-
- this.panels.show();
-
- if ( this.options.heightStyle !== "content" ) {
- this.panels.css( "height", "" );
- }
- },
-
- enable: function( index ) {
- var disabled = this.options.disabled;
- if ( disabled === false ) {
- return;
- }
-
- if ( index === undefined ) {
- disabled = false;
- } else {
- index = this._getIndex( index );
- if ( Array.isArray( disabled ) ) {
- disabled = $.map( disabled, function( num ) {
- return num !== index ? num : null;
- } );
- } else {
- disabled = $.map( this.tabs, function( li, num ) {
- return num !== index ? num : null;
- } );
- }
- }
- this._setOptionDisabled( disabled );
- },
-
- disable: function( index ) {
- var disabled = this.options.disabled;
- if ( disabled === true ) {
- return;
- }
-
- if ( index === undefined ) {
- disabled = true;
- } else {
- index = this._getIndex( index );
- if ( $.inArray( index, disabled ) !== -1 ) {
- return;
- }
- if ( Array.isArray( disabled ) ) {
- disabled = $.merge( [ index ], disabled ).sort();
- } else {
- disabled = [ index ];
- }
- }
- this._setOptionDisabled( disabled );
- },
-
- load: function( index, event ) {
- index = this._getIndex( index );
- var that = this,
- tab = this.tabs.eq( index ),
- anchor = tab.find( ".ui-tabs-anchor" ),
- panel = this._getPanelForTab( tab ),
- eventData = {
- tab: tab,
- panel: panel
- },
- complete = function( jqXHR, status ) {
- if ( status === "abort" ) {
- that.panels.stop( false, true );
- }
-
- that._removeClass( tab, "ui-tabs-loading" );
- panel.removeAttr( "aria-busy" );
-
- if ( jqXHR === that.xhr ) {
- delete that.xhr;
- }
- };
-
- // Not remote
- if ( this._isLocal( anchor[ 0 ] ) ) {
- return;
- }
-
- this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
-
- // Support: jQuery <1.8
- // jQuery <1.8 returns false if the request is canceled in beforeSend,
- // but as of 1.8, $.ajax() always returns a jqXHR object.
- if ( this.xhr && this.xhr.statusText !== "canceled" ) {
- this._addClass( tab, "ui-tabs-loading" );
- panel.attr( "aria-busy", "true" );
-
- this.xhr
- .done( function( response, status, jqXHR ) {
-
- // support: jQuery <1.8
- // http://bugs.jquery.com/ticket/11778
- setTimeout( function() {
- panel.html( response );
- that._trigger( "load", event, eventData );
-
- complete( jqXHR, status );
- }, 1 );
- } )
- .fail( function( jqXHR, status ) {
-
- // support: jQuery <1.8
- // http://bugs.jquery.com/ticket/11778
- setTimeout( function() {
- complete( jqXHR, status );
- }, 1 );
- } );
- }
- },
-
- _ajaxSettings: function( anchor, event, eventData ) {
- var that = this;
- return {
-
- // Support: IE <11 only
- // Strip any hash that exists to prevent errors with the Ajax request
- url: anchor.attr( "href" ).replace( /#.*$/, "" ),
- beforeSend: function( jqXHR, settings ) {
- return that._trigger( "beforeLoad", event,
- $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
- }
- };
- },
-
- _getPanelForTab: function( tab ) {
- var id = $( tab ).attr( "aria-controls" );
- return this.element.find( this._sanitizeSelector( "#" + id ) );
- }
-} );
-
-// DEPRECATED
-// TODO: Switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for ui-tab class (now ui-tabs-tab)
- $.widget( "ui.tabs", $.ui.tabs, {
- _processTabs: function() {
- this._superApply( arguments );
- this._addClass( this.tabs, "ui-tab" );
- }
- } );
-}
-
-var widgetsTabs = $.ui.tabs;
-
-
-/*!
- * jQuery UI Tooltip 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Tooltip
-//>>group: Widgets
-//>>description: Shows additional information for any element on hover or focus.
-//>>docs: http://api.jqueryui.com/tooltip/
-//>>demos: http://jqueryui.com/tooltip/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/tooltip.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-$.widget( "ui.tooltip", {
- version: "1.13.1",
- options: {
- classes: {
- "ui-tooltip": "ui-corner-all ui-widget-shadow"
- },
- content: function() {
- var title = $( this ).attr( "title" );
-
- // Escape title, since we're going from an attribute to raw HTML
- return $( "<a>" ).text( title ).html();
- },
- hide: true,
-
- // Disabled elements have inconsistent behavior across browsers (#8661)
- items: "[title]:not([disabled])",
- position: {
- my: "left top+15",
- at: "left bottom",
- collision: "flipfit flip"
- },
- show: true,
- track: false,
-
- // Callbacks
- close: null,
- open: null
- },
-
- _addDescribedBy: function( elem, id ) {
- var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
- describedby.push( id );
- elem
- .data( "ui-tooltip-id", id )
- .attr( "aria-describedby", String.prototype.trim.call( describedby.join( " " ) ) );
- },
-
- _removeDescribedBy: function( elem ) {
- var id = elem.data( "ui-tooltip-id" ),
- describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
- index = $.inArray( id, describedby );
-
- if ( index !== -1 ) {
- describedby.splice( index, 1 );
- }
-
- elem.removeData( "ui-tooltip-id" );
- describedby = String.prototype.trim.call( describedby.join( " " ) );
- if ( describedby ) {
- elem.attr( "aria-describedby", describedby );
- } else {
- elem.removeAttr( "aria-describedby" );
- }
- },
-
- _create: function() {
- this._on( {
- mouseover: "open",
- focusin: "open"
- } );
-
- // IDs of generated tooltips, needed for destroy
- this.tooltips = {};
-
- // IDs of parent tooltips where we removed the title attribute
- this.parents = {};
-
- // Append the aria-live region so tooltips announce correctly
- this.liveRegion = $( "<div>" )
- .attr( {
- role: "log",
- "aria-live": "assertive",
- "aria-relevant": "additions"
- } )
- .appendTo( this.document[ 0 ].body );
- this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
-
- this.disabledTitles = $( [] );
- },
-
- _setOption: function( key, value ) {
- var that = this;
-
- this._super( key, value );
-
- if ( key === "content" ) {
- $.each( this.tooltips, function( id, tooltipData ) {
- that._updateContent( tooltipData.element );
- } );
- }
- },
-
- _setOptionDisabled: function( value ) {
- this[ value ? "_disable" : "_enable" ]();
- },
-
- _disable: function() {
- var that = this;
-
- // Close open tooltips
- $.each( this.tooltips, function( id, tooltipData ) {
- var event = $.Event( "blur" );
- event.target = event.currentTarget = tooltipData.element[ 0 ];
- that.close( event, true );
- } );
-
- // Remove title attributes to prevent native tooltips
- this.disabledTitles = this.disabledTitles.add(
- this.element.find( this.options.items ).addBack()
- .filter( function() {
- var element = $( this );
- if ( element.is( "[title]" ) ) {
- return element
- .data( "ui-tooltip-title", element.attr( "title" ) )
- .removeAttr( "title" );
- }
- } )
- );
- },
-
- _enable: function() {
-
- // restore title attributes
- this.disabledTitles.each( function() {
- var element = $( this );
- if ( element.data( "ui-tooltip-title" ) ) {
- element.attr( "title", element.data( "ui-tooltip-title" ) );
- }
- } );
- this.disabledTitles = $( [] );
- },
-
- open: function( event ) {
- var that = this,
- target = $( event ? event.target : this.element )
-
- // we need closest here due to mouseover bubbling,
- // but always pointing at the same event target
- .closest( this.options.items );
-
- // No element to show a tooltip for or the tooltip is already open
- if ( !target.length || target.data( "ui-tooltip-id" ) ) {
- return;
- }
-
- if ( target.attr( "title" ) ) {
- target.data( "ui-tooltip-title", target.attr( "title" ) );
- }
-
- target.data( "ui-tooltip-open", true );
-
- // Kill parent tooltips, custom or native, for hover
- if ( event && event.type === "mouseover" ) {
- target.parents().each( function() {
- var parent = $( this ),
- blurEvent;
- if ( parent.data( "ui-tooltip-open" ) ) {
- blurEvent = $.Event( "blur" );
- blurEvent.target = blurEvent.currentTarget = this;
- that.close( blurEvent, true );
- }
- if ( parent.attr( "title" ) ) {
- parent.uniqueId();
- that.parents[ this.id ] = {
- element: this,
- title: parent.attr( "title" )
- };
- parent.attr( "title", "" );
- }
- } );
- }
-
- this._registerCloseHandlers( event, target );
- this._updateContent( target, event );
- },
-
- _updateContent: function( target, event ) {
- var content,
- contentOption = this.options.content,
- that = this,
- eventType = event ? event.type : null;
-
- if ( typeof contentOption === "string" || contentOption.nodeType ||
- contentOption.jquery ) {
- return this._open( event, target, contentOption );
- }
-
- content = contentOption.call( target[ 0 ], function( response ) {
-
- // IE may instantly serve a cached response for ajax requests
- // delay this call to _open so the other call to _open runs first
- that._delay( function() {
-
- // Ignore async response if tooltip was closed already
- if ( !target.data( "ui-tooltip-open" ) ) {
- return;
- }
-
- // JQuery creates a special event for focusin when it doesn't
- // exist natively. To improve performance, the native event
- // object is reused and the type is changed. Therefore, we can't
- // rely on the type being correct after the event finished
- // bubbling, so we set it back to the previous value. (#8740)
- if ( event ) {
- event.type = eventType;
- }
- this._open( event, target, response );
- } );
- } );
- if ( content ) {
- this._open( event, target, content );
- }
- },
-
- _open: function( event, target, content ) {
- var tooltipData, tooltip, delayedShow, a11yContent,
- positionOption = $.extend( {}, this.options.position );
-
- if ( !content ) {
- return;
- }
-
- // Content can be updated multiple times. If the tooltip already
- // exists, then just update the content and bail.
- tooltipData = this._find( target );
- if ( tooltipData ) {
- tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
- return;
- }
-
- // If we have a title, clear it to prevent the native tooltip
- // we have to check first to avoid defining a title if none exists
- // (we don't want to cause an element to start matching [title])
- //
- // We use removeAttr only for key events, to allow IE to export the correct
- // accessible attributes. For mouse events, set to empty string to avoid
- // native tooltip showing up (happens only when removing inside mouseover).
- if ( target.is( "[title]" ) ) {
- if ( event && event.type === "mouseover" ) {
- target.attr( "title", "" );
- } else {
- target.removeAttr( "title" );
- }
- }
-
- tooltipData = this._tooltip( target );
- tooltip = tooltipData.tooltip;
- this._addDescribedBy( target, tooltip.attr( "id" ) );
- tooltip.find( ".ui-tooltip-content" ).html( content );
-
- // Support: Voiceover on OS X, JAWS on IE <= 9
- // JAWS announces deletions even when aria-relevant="additions"
- // Voiceover will sometimes re-read the entire log region's contents from the beginning
- this.liveRegion.children().hide();
- a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
- a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
- a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
- a11yContent.appendTo( this.liveRegion );
-
- function position( event ) {
- positionOption.of = event;
- if ( tooltip.is( ":hidden" ) ) {
- return;
- }
- tooltip.position( positionOption );
- }
- if ( this.options.track && event && /^mouse/.test( event.type ) ) {
- this._on( this.document, {
- mousemove: position
- } );
-
- // trigger once to override element-relative positioning
- position( event );
- } else {
- tooltip.position( $.extend( {
- of: target
- }, this.options.position ) );
- }
-
- tooltip.hide();
-
- this._show( tooltip, this.options.show );
-
- // Handle tracking tooltips that are shown with a delay (#8644). As soon
- // as the tooltip is visible, position the tooltip using the most recent
- // event.
- // Adds the check to add the timers only when both delay and track options are set (#14682)
- if ( this.options.track && this.options.show && this.options.show.delay ) {
- delayedShow = this.delayedShow = setInterval( function() {
- if ( tooltip.is( ":visible" ) ) {
- position( positionOption.of );
- clearInterval( delayedShow );
- }
- }, 13 );
- }
-
- this._trigger( "open", event, { tooltip: tooltip } );
- },
-
- _registerCloseHandlers: function( event, target ) {
- var events = {
- keyup: function( event ) {
- if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
- var fakeEvent = $.Event( event );
- fakeEvent.currentTarget = target[ 0 ];
- this.close( fakeEvent, true );
- }
- }
- };
-
- // Only bind remove handler for delegated targets. Non-delegated
- // tooltips will handle this in destroy.
- if ( target[ 0 ] !== this.element[ 0 ] ) {
- events.remove = function() {
- var targetElement = this._find( target );
- if ( targetElement ) {
- this._removeTooltip( targetElement.tooltip );
- }
- };
- }
-
- if ( !event || event.type === "mouseover" ) {
- events.mouseleave = "close";
- }
- if ( !event || event.type === "focusin" ) {
- events.focusout = "close";
- }
- this._on( true, target, events );
- },
-
- close: function( event ) {
- var tooltip,
- that = this,
- target = $( event ? event.currentTarget : this.element ),
- tooltipData = this._find( target );
-
- // The tooltip may already be closed
- if ( !tooltipData ) {
-
- // We set ui-tooltip-open immediately upon open (in open()), but only set the
- // additional data once there's actually content to show (in _open()). So even if the
- // tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
- // the period between open() and _open().
- target.removeData( "ui-tooltip-open" );
- return;
- }
-
- tooltip = tooltipData.tooltip;
-
- // Disabling closes the tooltip, so we need to track when we're closing
- // to avoid an infinite loop in case the tooltip becomes disabled on close
- if ( tooltipData.closing ) {
- return;
- }
-
- // Clear the interval for delayed tracking tooltips
- clearInterval( this.delayedShow );
-
- // Only set title if we had one before (see comment in _open())
- // If the title attribute has changed since open(), don't restore
- if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
- target.attr( "title", target.data( "ui-tooltip-title" ) );
- }
-
- this._removeDescribedBy( target );
-
- tooltipData.hiding = true;
- tooltip.stop( true );
- this._hide( tooltip, this.options.hide, function() {
- that._removeTooltip( $( this ) );
- } );
-
- target.removeData( "ui-tooltip-open" );
- this._off( target, "mouseleave focusout keyup" );
-
- // Remove 'remove' binding only on delegated targets
- if ( target[ 0 ] !== this.element[ 0 ] ) {
- this._off( target, "remove" );
- }
- this._off( this.document, "mousemove" );
-
- if ( event && event.type === "mouseleave" ) {
- $.each( this.parents, function( id, parent ) {
- $( parent.element ).attr( "title", parent.title );
- delete that.parents[ id ];
- } );
- }
-
- tooltipData.closing = true;
- this._trigger( "close", event, { tooltip: tooltip } );
- if ( !tooltipData.hiding ) {
- tooltipData.closing = false;
- }
- },
-
- _tooltip: function( element ) {
- var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
- content = $( "<div>" ).appendTo( tooltip ),
- id = tooltip.uniqueId().attr( "id" );
-
- this._addClass( content, "ui-tooltip-content" );
- this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
-
- tooltip.appendTo( this._appendTo( element ) );
-
- return this.tooltips[ id ] = {
- element: element,
- tooltip: tooltip
- };
- },
-
- _find: function( target ) {
- var id = target.data( "ui-tooltip-id" );
- return id ? this.tooltips[ id ] : null;
- },
-
- _removeTooltip: function( tooltip ) {
-
- // Clear the interval for delayed tracking tooltips
- clearInterval( this.delayedShow );
-
- tooltip.remove();
- delete this.tooltips[ tooltip.attr( "id" ) ];
- },
-
- _appendTo: function( target ) {
- var element = target.closest( ".ui-front, dialog" );
-
- if ( !element.length ) {
- element = this.document[ 0 ].body;
- }
-
- return element;
- },
-
- _destroy: function() {
- var that = this;
-
- // Close open tooltips
- $.each( this.tooltips, function( id, tooltipData ) {
-
- // Delegate to close method to handle common cleanup
- var event = $.Event( "blur" ),
- element = tooltipData.element;
- event.target = event.currentTarget = element[ 0 ];
- that.close( event, true );
-
- // Remove immediately; destroying an open tooltip doesn't use the
- // hide animation
- $( "#" + id ).remove();
-
- // Restore the title
- if ( element.data( "ui-tooltip-title" ) ) {
-
- // If the title attribute has changed since open(), don't restore
- if ( !element.attr( "title" ) ) {
- element.attr( "title", element.data( "ui-tooltip-title" ) );
- }
- element.removeData( "ui-tooltip-title" );
- }
- } );
- this.liveRegion.remove();
- }
-} );
-
-// DEPRECATED
-// TODO: Switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for tooltipClass option
- $.widget( "ui.tooltip", $.ui.tooltip, {
- options: {
- tooltipClass: null
- },
- _tooltip: function() {
- var tooltipData = this._superApply( arguments );
- if ( this.options.tooltipClass ) {
- tooltipData.tooltip.addClass( this.options.tooltipClass );
- }
- return tooltipData;
- }
- } );
-}
-
-var widgetsTooltip = $.ui.tooltip;
-
-
-
-
-} ); \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.css b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.css
deleted file mode 100644
index accf0a83..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.13.1 - 2022-01-20
-* http://jqueryui.com
-* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;-ms-filter:"alpha(opacity=25)";opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;-ms-filter:"alpha(opacity=70)";font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;-ms-filter:"alpha(opacity=35)";background-image:none}.ui-state-disabled .ui-icon{-ms-filter:"alpha(opacity=35)"}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank.ui-icon-blank.ui-icon-blank{background-image:none}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;-ms-filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.js b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.js
deleted file mode 100644
index c1cbc8b4..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery UI - v1.13.1 - 2022-01-20
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(V){"use strict";V.ui=V.ui||{};V.ui.version="1.13.1";var n,i=0,a=Array.prototype.hasOwnProperty,r=Array.prototype.slice;V.cleanData=(n=V.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=V._data(i,"events"))&&e.remove&&V(i).triggerHandler("remove");n(t)}),V.widget=function(t,i,e){var s,n,o,a={},r=t.split(".")[0],l=r+"-"+(t=t.split(".")[1]);return e||(e=i,i=V.Widget),Array.isArray(e)&&(e=V.extend.apply(null,[{}].concat(e))),V.expr.pseudos[l.toLowerCase()]=function(t){return!!V.data(t,l)},V[r]=V[r]||{},s=V[r][t],n=V[r][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},V.extend(n,s,{version:e.version,_proto:V.extend({},e),_childConstructors:[]}),(o=new i).options=V.widget.extend({},o.options),V.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}a[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=V.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},a,{constructor:n,namespace:r,widgetName:t,widgetFullName:l}),s?(V.each(s._childConstructors,function(t,e){var i=e.prototype;V.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),V.widget.bridge(t,n),n},V.widget.extend=function(t){for(var e,i,s=r.call(arguments,1),n=0,o=s.length;n<o;n++)for(e in s[n])i=s[n][e],a.call(s[n],e)&&void 0!==i&&(V.isPlainObject(i)?t[e]=V.isPlainObject(t[e])?V.widget.extend({},t[e],i):V.widget.extend({},i):t[e]=i);return t},V.widget.bridge=function(o,e){var a=e.prototype.widgetFullName||o;V.fn[o]=function(i){var t="string"==typeof i,s=r.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t,e=V.data(this,a);return"instance"===i?(n=e,!1):e?"function"!=typeof e[i]||"_"===i.charAt(0)?V.error("no such method '"+i+"' for "+o+" widget instance"):(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:V.error("cannot call methods on "+o+" prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=V.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=V.data(this,a);t?(t.option(i||{}),t._init&&t._init()):V.data(this,a,new e(i,this))})),n}},V.Widget=function(){},V.Widget._childConstructors=[],V.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=V(e||this.defaultElement||this)[0],this.element=V(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=V(),this.hoverable=V(),this.focusable=V(),this.classesElementLookup={},e!==this&&(V.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=V(e.style?e.ownerDocument:e.document||e),this.window=V(this.document[0].defaultView||this.document[0].parentWindow)),this.options=V.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:V.noop,_create:V.noop,_init:V.noop,destroy:function(){var i=this;this._destroy(),V.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:V.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return V.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=V.widget.extend({},this.options[t]),n=0;n<i.length-1;n++)s[i[n]]=s[i[n]]||{},s=s[i[n]];if(t=i.pop(),1===arguments.length)return void 0===s[t]?null:s[t];s[t]=e}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=e}return this._setOptions(o),this},_setOptions:function(t){for(var e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(t){var e,i,s;for(e in t)s=this.classesElementLookup[e],t[e]!==this.options.classes[e]&&s&&s.length&&(i=V(s.get()),this._removeClass(s,e),i.addClass(this._classes({element:i,keys:e,classes:t,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(n){var o=[],a=this;function t(t,e){for(var i,s=0;s<t.length;s++)i=a.classesElementLookup[t[s]]||V(),i=n.add?(function(){var i=[];n.element.each(function(t,e){V.map(a.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),a._on(V(i),{remove:"_untrackClassesElement"})}(),V(V.uniqueSort(i.get().concat(n.element.get())))):V(i.not(n.element).get()),a.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=V.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;V.each(s.classesElementLookup,function(t,e){-1!==V.inArray(i.target,e)&&(s.classesElementLookup[t]=V(e.not(i.target).get()))}),this._off(V(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,i={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return i.element.toggleClass(this._classes(i),s),this},_on:function(n,o,t){var a,r=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=a=V(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,a=this.widget()),V.each(t,function(t,e){function i(){if(n||!0!==r.options.disabled&&!V(this).hasClass("ui-state-disabled"))return("string"==typeof e?r[e]:e).apply(r,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||V.guid++);var s=t.match(/^([\w:-]*)\s*(.*)$/),t=s[1]+r.eventNamespace,s=s[2];s?a.on(t,s,i):o.on(t,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=V(this.bindings.not(t).get()),this.focusable=V(this.focusable.not(t).get()),this.hoverable=V(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(V(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(V(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(V(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(V(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=V.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},V.each({show:"fadeIn",hide:"fadeOut"},function(o,a){V.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||a:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!V.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&V.effects&&V.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){V(this)[o](),i&&i.call(e[0]),t()})}});var s,x,k,o,l,h,c,u,C;V.widget;function D(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function I(t,e){return parseInt(V.css(t,e),10)||0}function T(t){return null!=t&&t===t.window}x=Math.max,k=Math.abs,o=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,C=V.fn.position,V.position={scrollbarWidth:function(){if(void 0!==s)return s;var t,e=V("<div style='display:block;position:absolute;width:200px;height:200px;overflow:hidden;'><div style='height:300px;width:auto;'></div></div>"),i=e.children()[0];return V("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.width<t.element[0].scrollWidth;return{width:"scroll"===i||"auto"===i&&t.height<t.element[0].scrollHeight?V.position.scrollbarWidth():0,height:e?V.position.scrollbarWidth():0}},getWithinInfo:function(t){var e=V(t||window),i=T(e[0]),s=!!e[0]&&9===e[0].nodeType;return{element:e,isWindow:i,isDocument:s,offset:!i&&!s?V(t).offset():{left:0,top:0},scrollLeft:e.scrollLeft(),scrollTop:e.scrollTop(),width:e.outerWidth(),height:e.outerHeight()}}},V.fn.position=function(u){if(!u||!u.of)return C.apply(this,arguments);var d,p,f,g,m,t,_="string"==typeof(u=V.extend({},u)).of?V(document).find(u.of):V(u.of),v=V.position.getWithinInfo(u.within),b=V.position.getScrollInfo(v),y=(u.collision||"flip").split(" "),w={},e=9===(t=(e=_)[0]).nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:T(t)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:t.preventDefault?{width:0,height:0,offset:{top:t.pageY,left:t.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()};return _[0].preventDefault&&(u.at="left top"),p=e.width,f=e.height,m=V.extend({},g=e.offset),V.each(["my","at"],function(){var t,e,i=(u[this]||"").split(" ");(i=1===i.length?o.test(i[0])?i.concat(["center"]):l.test(i[0])?["center"].concat(i):["center","center"]:i)[0]=o.test(i[0])?i[0]:"center",i[1]=l.test(i[1])?i[1]:"center",t=h.exec(i[0]),e=h.exec(i[1]),w[this]=[t?t[0]:0,e?e[0]:0],u[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===y.length&&(y[1]=y[0]),"right"===u.at[0]?m.left+=p:"center"===u.at[0]&&(m.left+=p/2),"bottom"===u.at[1]?m.top+=f:"center"===u.at[1]&&(m.top+=f/2),d=D(w.at,p,f),m.left+=d[0],m.top+=d[1],this.each(function(){var i,t,a=V(this),r=a.outerWidth(),l=a.outerHeight(),e=I(this,"marginLeft"),s=I(this,"marginTop"),n=r+e+I(this,"marginRight")+b.width,o=l+s+I(this,"marginBottom")+b.height,h=V.extend({},m),c=D(w.my,a.outerWidth(),a.outerHeight());"right"===u.my[0]?h.left-=r:"center"===u.my[0]&&(h.left-=r/2),"bottom"===u.my[1]?h.top-=l:"center"===u.my[1]&&(h.top-=l/2),h.left+=c[0],h.top+=c[1],i={marginLeft:e,marginTop:s},V.each(["left","top"],function(t,e){V.ui.position[y[t]]&&V.ui.position[y[t]][e](h,{targetWidth:p,targetHeight:f,elemWidth:r,elemHeight:l,collisionPosition:i,collisionWidth:n,collisionHeight:o,offset:[d[0]+c[0],d[1]+c[1]],my:u.my,at:u.at,within:v,elem:a})}),u.using&&(t=function(t){var e=g.left-h.left,i=e+p-r,s=g.top-h.top,n=s+f-l,o={target:{element:_,left:g.left,top:g.top,width:p,height:f},element:{element:a,left:h.left,top:h.top,width:r,height:l},horizontal:i<0?"left":0<e?"right":"center",vertical:n<0?"top":0<s?"bottom":"middle"};p<r&&k(e+i)<p&&(o.horizontal="center"),f<l&&k(s+n)<f&&(o.vertical="middle"),x(k(e),k(i))>x(k(s),k(n))?o.important="horizontal":o.important="vertical",u.using.call(this,t,o)}),a.offset(V.extend(h,{using:t}))})},V.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,a=s-o,r=o+e.collisionWidth-n-s;e.collisionWidth>n?0<a&&r<=0?(i=t.left+a+e.collisionWidth-n-s,t.left+=a-i):t.left=!(0<r&&a<=0)&&r<a?s+n-e.collisionWidth:s:0<a?t.left+=a:0<r?t.left-=r:t.left=x(t.left-o,t.left)},top:function(t,e){var i=e.within,s=i.isWindow?i.scrollTop:i.offset.top,n=e.within.height,o=t.top-e.collisionPosition.marginTop,a=s-o,r=o+e.collisionHeight-n-s;e.collisionHeight>n?0<a&&r<=0?(i=t.top+a+e.collisionHeight-n-s,t.top+=a-i):t.top=!(0<r&&a<=0)&&r<a?s+n-e.collisionHeight:s:0<a?t.top+=a:0<r?t.top-=r:t.top=x(t.top-o,t.top)}},flip:{left:function(t,e){var i=e.within,s=i.offset.left+i.scrollLeft,n=i.width,o=i.isWindow?i.scrollLeft:i.offset.left,a=t.left-e.collisionPosition.marginLeft,r=a-o,l=a+e.collisionWidth-n-o,h="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,i="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,a=-2*e.offset[0];r<0?((s=t.left+h+i+a+e.collisionWidth-n-s)<0||s<k(r))&&(t.left+=h+i+a):0<l&&(0<(o=t.left-e.collisionPosition.marginLeft+h+i+a-o)||k(o)<l)&&(t.left+=h+i+a)},top:function(t,e){var i=e.within,s=i.offset.top+i.scrollTop,n=i.height,o=i.isWindow?i.scrollTop:i.offset.top,a=t.top-e.collisionPosition.marginTop,r=a-o,l=a+e.collisionHeight-n-o,h="top"===e.my[1]?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,i="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,a=-2*e.offset[1];r<0?((s=t.top+h+i+a+e.collisionHeight-n-s)<0||s<k(r))&&(t.top+=h+i+a):0<l&&(0<(o=t.top-e.collisionPosition.marginTop+h+i+a-o)||k(o)<l)&&(t.top+=h+i+a)}},flipfit:{left:function(){V.ui.position.flip.left.apply(this,arguments),V.ui.position.fit.left.apply(this,arguments)},top:function(){V.ui.position.flip.top.apply(this,arguments),V.ui.position.fit.top.apply(this,arguments)}}};V.ui.position,V.extend(V.expr.pseudos,{data:V.expr.createPseudo?V.expr.createPseudo(function(e){return function(t){return!!V.data(t,e)}}):function(t,e,i){return!!V.data(t,i[3])}}),V.fn.extend({disableSelection:(t="onselectstart"in document.createElement("div")?"selectstart":"mousedown",function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}),enableSelection:function(){return this.off(".ui-disableSelection")}});var t,d=V,p={},e=p.toString,f=/^([\-+])=\s*(\d+\.?\d*)/,g=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16),t[4]?(parseInt(t[4],16)/255).toFixed(2):1]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16),t[4]?(parseInt(t[4]+t[4],16)/255).toFixed(2):1]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],m=d.Color=function(t,e,i,s){return new d.Color.fn.parse(t,e,i,s)},_={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},v={byte:{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},b=m.support={},y=d("<p>")[0],w=d.each;function P(t){return null==t?t+"":"object"==typeof t?p[e.call(t)]||"object":typeof t}function M(t,e,i){var s=v[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:Math.min(s.max,Math.max(0,t)))}function S(s){var n=m(),o=n._rgba=[];return s=s.toLowerCase(),w(g,function(t,e){var i=e.re.exec(s),i=i&&e.parse(i),e=e.space||"rgba";if(i)return i=n[e](i),n[_[e].cache]=i[_[e].cache],o=n._rgba=i._rgba,!1}),o.length?("0,0,0,0"===o.join()&&d.extend(o,B.transparent),n):B[s]}function H(t,e,i){return 6*(i=(i+1)%1)<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}y.style.cssText="background-color:rgba(1,1,1,.5)",b.rgba=-1<y.style.backgroundColor.indexOf("rgba"),w(_,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),d.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(t,e){p["[object "+e+"]"]=e.toLowerCase()}),(m.fn=d.extend(m.prototype,{parse:function(n,t,e,i){if(void 0===n)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=d(n).css(t),t=void 0);var o=this,s=P(n),a=this._rgba=[];return void 0!==t&&(n=[n,t,e,i],s="array"),"string"===s?this.parse(S(n)||B._default):"array"===s?(w(_.rgba.props,function(t,e){a[e.idx]=M(n[e.idx],e)}),this):"object"===s?(w(_,n instanceof m?function(t,e){n[e.cache]&&(o[e.cache]=n[e.cache].slice())}:function(t,i){var s=i.cache;w(i.props,function(t,e){if(!o[s]&&i.to){if("alpha"===t||null==n[t])return;o[s]=i.to(o._rgba)}o[s][e.idx]=M(n[t],e,!0)}),o[s]&&d.inArray(null,o[s].slice(0,3))<0&&(null==o[s][3]&&(o[s][3]=1),i.from&&(o._rgba=i.from(o[s])))}),this):void 0},is:function(t){var n=m(t),o=!0,a=this;return w(_,function(t,e){var i,s=n[e.cache];return s&&(i=a[e.cache]||e.to&&e.to(a._rgba)||[],w(e.props,function(t,e){if(null!=s[e.idx])return o=s[e.idx]===i[e.idx]})),o}),o},_space:function(){var i=[],s=this;return w(_,function(t,e){s[e.cache]&&i.push(t)}),i.pop()},transition:function(t,a){var e=(h=m(t))._space(),i=_[e],t=0===this.alpha()?m("transparent"):this,r=t[i.cache]||i.to(t._rgba),l=r.slice(),h=h[i.cache];return w(i.props,function(t,e){var i=e.idx,s=r[i],n=h[i],o=v[e.type]||{};null!==n&&(null===s?l[i]=n:(o.mod&&(n-s>o.mod/2?s+=o.mod:s-n>o.mod/2&&(s-=o.mod)),l[i]=M((n-s)*a+s,e)))}),this[e](l)},blend:function(t){if(1===this._rgba[3])return this;var e=this._rgba.slice(),i=e.pop(),s=m(t)._rgba;return m(d.map(e,function(t,e){return(1-i)*s[e]+i*t}))},toRgbaString:function(){var t="rgba(",e=d.map(this._rgba,function(t,e){return null!=t?t:2<e?1:0});return 1===e[3]&&(e.pop(),t="rgb("),t+e.join()+")"},toHslaString:function(){var t="hsla(",e=d.map(this.hsla(),function(t,e){return null==t&&(t=2<e?1:0),t=e&&e<3?Math.round(100*t)+"%":t});return 1===e[3]&&(e.pop(),t="hsl("),t+e.join()+")"},toHexString:function(t){var e=this._rgba.slice(),i=e.pop();return t&&e.push(~~(255*i)),"#"+d.map(e,function(t){return 1===(t=(t||0).toString(16)).length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}})).parse.prototype=m.fn,_.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/255,i=t[1]/255,s=t[2]/255,n=t[3],o=Math.max(e,i,s),a=Math.min(e,i,s),r=o-a,l=o+a,t=.5*l,i=a===o?0:e===o?60*(i-s)/r+360:i===o?60*(s-e)/r+120:60*(e-i)/r+240,l=0==r?0:t<=.5?r/l:r/(2-l);return[Math.round(i)%360,l,t,null==n?1:n]},_.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],t=t[3],i=s<=.5?s*(1+i):s+i-s*i,s=2*s-i;return[Math.round(255*H(s,i,e+1/3)),Math.round(255*H(s,i,e)),Math.round(255*H(s,i,e-1/3)),t]},w(_,function(l,t){var e=t.props,o=t.cache,a=t.to,r=t.from;m.fn[l]=function(t){if(a&&!this[o]&&(this[o]=a(this._rgba)),void 0===t)return this[o].slice();var i=P(t),s="array"===i||"object"===i?t:arguments,n=this[o].slice();return w(e,function(t,e){t=s["object"===i?t:e.idx];null==t&&(t=n[e.idx]),n[e.idx]=M(t,e)}),r?((t=m(r(n)))[o]=n,t):m(n)},w(e,function(a,r){m.fn[a]||(m.fn[a]=function(t){var e,i=P(t),s="alpha"===a?this._hsla?"hsla":"rgba":l,n=this[s](),o=n[r.idx];return"undefined"===i?o:("function"===i&&(i=P(t=t.call(this,o))),null==t&&r.empty?this:("string"===i&&(e=f.exec(t))&&(t=o+parseFloat(e[2])*("+"===e[1]?1:-1)),n[r.idx]=t,this[s](n)))})})}),(m.hook=function(t){t=t.split(" ");w(t,function(t,o){d.cssHooks[o]={set:function(t,e){var i,s,n="";if("transparent"!==e&&("string"!==P(e)||(i=S(e)))){if(e=m(i||e),!b.rgba&&1!==e._rgba[3]){for(s="backgroundColor"===o?t.parentNode:t;(""===n||"transparent"===n)&&s&&s.style;)try{n=d.css(s,"backgroundColor"),s=s.parentNode}catch(t){}e=e.blend(n&&"transparent"!==n?n:"_default")}e=e.toRgbaString()}try{t.style[o]=e}catch(t){}}},d.fx.step[o]=function(t){t.colorInit||(t.start=m(t.elem,o),t.end=m(t.end),t.colorInit=!0),d.cssHooks[o].set(t.elem,t.start.transition(t.end,t.pos))}})})("backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor"),d.cssHooks.borderColor={expand:function(i){var s={};return w(["Top","Right","Bottom","Left"],function(t,e){s["border"+e+"Color"]=i}),s}};var z,A,O,N,E,W,F,L,R,Y,B=d.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"},j="ui-effects-",q="ui-effects-style",K="ui-effects-animated";function U(t){var e,i,s=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,n={};if(s&&s.length&&s[0]&&s[s[0]])for(i=s.length;i--;)"string"==typeof s[e=s[i]]&&(n[e.replace(/-([\da-z])/gi,function(t,e){return e.toUpperCase()})]=s[e]);else for(e in s)"string"==typeof s[e]&&(n[e]=s[e]);return n}function X(t,e,i,s){return t={effect:t=V.isPlainObject(t)?(e=t).effect:t},"function"==typeof(e=null==e?{}:e)&&(s=e,i=null,e={}),"number"!=typeof e&&!V.fx.speeds[e]||(s=i,i=e,e={}),"function"==typeof i&&(s=i,i=null),e&&V.extend(t,e),i=i||e.duration,t.duration=V.fx.off?0:"number"==typeof i?i:i in V.fx.speeds?V.fx.speeds[i]:V.fx.speeds._default,t.complete=s||e.complete,t}function $(t){return!t||"number"==typeof t||V.fx.speeds[t]||("string"==typeof t&&!V.effects.effect[t]||("function"==typeof t||"object"==typeof t&&!t.effect))}function G(t,e){var i=e.outerWidth(),e=e.outerHeight(),t=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/.exec(t)||["",0,i,e,0];return{top:parseFloat(t[1])||0,right:"auto"===t[2]?i:parseFloat(t[2]),bottom:"auto"===t[3]?e:parseFloat(t[3]),left:parseFloat(t[4])||0}}V.effects={effect:{}},N=["add","remove","toggle"],E={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1},V.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,e){V.fx.step[e]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(d.style(t.elem,e,t.end),t.setAttr=!0)}}),V.fn.addBack||(V.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),V.effects.animateClass=function(n,t,e,i){var o=V.speed(t,e,i);return this.queue(function(){var i=V(this),t=i.attr("class")||"",e=(e=o.children?i.find("*").addBack():i).map(function(){return{el:V(this),start:U(this)}}),s=function(){V.each(N,function(t,e){n[e]&&i[e+"Class"](n[e])})};s(),e=e.map(function(){return this.end=U(this.el[0]),this.diff=function(t,e){var i,s,n={};for(i in e)s=e[i],t[i]!==s&&(E[i]||!V.fx.step[i]&&isNaN(parseFloat(s))||(n[i]=s));return n}(this.start,this.end),this}),i.attr("class",t),e=e.map(function(){var t=this,e=V.Deferred(),i=V.extend({},o,{queue:!1,complete:function(){e.resolve(t)}});return this.el.animate(this.diff,i),e.promise()}),V.when.apply(V,e.get()).done(function(){s(),V.each(arguments,function(){var e=this.el;V.each(this.diff,function(t){e.css(t,"")})}),o.complete.call(i[0])})})},V.fn.extend({addClass:(O=V.fn.addClass,function(t,e,i,s){return e?V.effects.animateClass.call(this,{add:t},e,i,s):O.apply(this,arguments)}),removeClass:(A=V.fn.removeClass,function(t,e,i,s){return 1<arguments.length?V.effects.animateClass.call(this,{remove:t},e,i,s):A.apply(this,arguments)}),toggleClass:(z=V.fn.toggleClass,function(t,e,i,s,n){return"boolean"==typeof e||void 0===e?i?V.effects.animateClass.call(this,e?{add:t}:{remove:t},i,s,n):z.apply(this,arguments):V.effects.animateClass.call(this,{toggle:t},e,i,s)}),switchClass:function(t,e,i,s,n){return V.effects.animateClass.call(this,{add:e,remove:t},i,s,n)}}),V.expr&&V.expr.pseudos&&V.expr.pseudos.animated&&(V.expr.pseudos.animated=(W=V.expr.pseudos.animated,function(t){return!!V(t).data(K)||W(t)})),!1!==V.uiBackCompat&&V.extend(V.effects,{save:function(t,e){for(var i=0,s=e.length;i<s;i++)null!==e[i]&&t.data(j+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;s<n;s++)null!==e[s]&&(i=t.data(j+e[s]),t.css(e[s],i))},setMode:function(t,e){return e="toggle"===e?t.is(":hidden")?"show":"hide":e},createWrapper:function(i){if(i.parent().is(".ui-effects-wrapper"))return i.parent();var s={width:i.outerWidth(!0),height:i.outerHeight(!0),float:i.css("float")},t=V("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e={width:i.width(),height:i.height()},n=document.activeElement;try{n.id}catch(t){n=document.body}return i.wrap(t),i[0]!==n&&!V.contains(i[0],n)||V(n).trigger("focus"),t=i.parent(),"static"===i.css("position")?(t.css({position:"relative"}),i.css({position:"relative"})):(V.extend(s,{position:i.css("position"),zIndex:i.css("z-index")}),V.each(["top","left","bottom","right"],function(t,e){s[e]=i.css(e),isNaN(parseInt(s[e],10))&&(s[e]="auto")}),i.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),i.css(e),t.css(s).show()},removeWrapper:function(t){var e=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),t[0]!==e&&!V.contains(t[0],e)||V(e).trigger("focus")),t}}),V.extend(V.effects,{version:"1.13.1",define:function(t,e,i){return i||(i=e,e="effect"),V.effects.effect[t]=i,V.effects.effect[t].mode=e,i},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,e="vertical"!==i?(e||100)/100:1;return{height:t.height()*e,width:t.width()*s,outerHeight:t.outerHeight()*e,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();1<e&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(q,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(q)||"",t.removeData(q)},mode:function(t,e){t=t.is(":hidden");return"toggle"===e&&(e=t?"show":"hide"),e=(t?"hide"===e:"show"===e)?"none":e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(t){var e,i=t.css("position"),s=t.position();return t.css({marginTop:t.css("marginTop"),marginBottom:t.css("marginBottom"),marginLeft:t.css("marginLeft"),marginRight:t.css("marginRight")}).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()),/^(static|relative)/.test(i)&&(i="absolute",e=V("<"+t[0].nodeName+">").insertAfter(t).css({display:/^(inline|ruby)/.test(t.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:t.css("marginTop"),marginBottom:t.css("marginBottom"),marginLeft:t.css("marginLeft"),marginRight:t.css("marginRight"),float:t.css("float")}).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).addClass("ui-effects-placeholder"),t.data(j+"placeholder",e)),t.css({position:i,left:s.left,top:s.top}),e},removePlaceholder:function(t){var e=j+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(t){V.effects.restoreStyle(t),V.effects.removePlaceholder(t)},setTransition:function(s,t,n,o){return o=o||{},V.each(t,function(t,e){var i=s.cssUnit(e);0<i[0]&&(o[e]=i[0]*n+i[1])}),o}}),V.fn.extend({effect:function(){function t(t){var e=V(this),i=V.effects.mode(e,r)||o;e.data(K,!0),l.push(i),o&&("show"===i||i===o&&"hide"===i)&&e.show(),o&&"none"===i||V.effects.saveStyle(e),"function"==typeof t&&t()}var s=X.apply(this,arguments),n=V.effects.effect[s.effect],o=n.mode,e=s.queue,i=e||"fx",a=s.complete,r=s.mode,l=[];return V.fx.off||!n?r?this[r](s.duration,a):this.each(function(){a&&a.call(this)}):!1===e?this.each(t).each(h):this.queue(i,t).queue(i,h);function h(t){var e=V(this);function i(){"function"==typeof a&&a.call(e[0]),"function"==typeof t&&t()}s.mode=l.shift(),!1===V.uiBackCompat||o?"none"===s.mode?(e[r](),i()):n.call(e[0],s,function(){e.removeData(K),V.effects.cleanUp(e),"hide"===s.mode&&e.hide(),i()}):(e.is(":hidden")?"hide"===r:"show"===r)?(e[r](),i()):n.call(e[0],s,i)}},show:(R=V.fn.show,function(t){if($(t))return R.apply(this,arguments);t=X.apply(this,arguments);return t.mode="show",this.effect.call(this,t)}),hide:(L=V.fn.hide,function(t){if($(t))return L.apply(this,arguments);t=X.apply(this,arguments);return t.mode="hide",this.effect.call(this,t)}),toggle:(F=V.fn.toggle,function(t){if($(t)||"boolean"==typeof t)return F.apply(this,arguments);t=X.apply(this,arguments);return t.mode="toggle",this.effect.call(this,t)}),cssUnit:function(t){var i=this.css(t),s=[];return V.each(["em","px","%","pt"],function(t,e){0<i.indexOf(e)&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):G(this.css("clip"),this)},transfer:function(t,e){var i=V(this),s=V(t.to),n="fixed"===s.css("position"),o=V("body"),a=n?o.scrollTop():0,r=n?o.scrollLeft():0,o=s.offset(),o={top:o.top-a,left:o.left-r,height:s.innerHeight(),width:s.innerWidth()},s=i.offset(),l=V("<div class='ui-effects-transfer'></div>");l.appendTo("body").addClass(t.className).css({top:s.top-a,left:s.left-r,height:i.innerHeight(),width:i.innerWidth(),position:n?"fixed":"absolute"}).animate(o,t.duration,t.easing,function(){l.remove(),"function"==typeof e&&e()})}}),V.fx.step.clip=function(t){t.clipInit||(t.start=V(t.elem).cssClip(),"string"==typeof t.end&&(t.end=G(t.end,t.elem)),t.clipInit=!0),V(t.elem).cssClip({top:t.pos*(t.end.top-t.start.top)+t.start.top,right:t.pos*(t.end.right-t.start.right)+t.start.right,bottom:t.pos*(t.end.bottom-t.start.bottom)+t.start.bottom,left:t.pos*(t.end.left-t.start.left)+t.start.left})},Y={},V.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,t){Y[t]=function(t){return Math.pow(t,e+2)}}),V.extend(Y,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;t<((e=Math.pow(2,--i))-1)/11;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),V.each(Y,function(t,e){V.easing["easeIn"+t]=e,V.easing["easeOut"+t]=function(t){return 1-e(1-t)},V.easing["easeInOut"+t]=function(t){return t<.5?e(2*t)/2:1-e(-2*t+2)/2}});y=V.effects,V.effects.define("blind","hide",function(t,e){var i={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},s=V(this),n=t.direction||"up",o=s.cssClip(),a={clip:V.extend({},o)},r=V.effects.createPlaceholder(s);a.clip[i[n][0]]=a.clip[i[n][1]],"show"===t.mode&&(s.cssClip(a.clip),r&&r.css(V.effects.clipToBox(a)),a.clip=o),r&&r.animate(V.effects.clipToBox(a),t.duration,t.easing),s.animate(a,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("bounce",function(t,e){var i,s,n=V(this),o=t.mode,a="hide"===o,r="show"===o,l=t.direction||"up",h=t.distance,c=t.times||5,o=2*c+(r||a?1:0),u=t.duration/o,d=t.easing,p="up"===l||"down"===l?"top":"left",f="up"===l||"left"===l,g=0,t=n.queue().length;for(V.effects.createPlaceholder(n),l=n.css(p),h=h||n["top"==p?"outerHeight":"outerWidth"]()/3,r&&((s={opacity:1})[p]=l,n.css("opacity",0).css(p,f?2*-h:2*h).animate(s,u,d)),a&&(h/=Math.pow(2,c-1)),(s={})[p]=l;g<c;g++)(i={})[p]=(f?"-=":"+=")+h,n.animate(i,u,d).animate(s,u,d),h=a?2*h:h/2;a&&((i={opacity:0})[p]=(f?"-=":"+=")+h,n.animate(i,u,d)),n.queue(e),V.effects.unshift(n,t,1+o)}),V.effects.define("clip","hide",function(t,e){var i={},s=V(this),n=t.direction||"vertical",o="both"===n,a=o||"horizontal"===n,o=o||"vertical"===n,n=s.cssClip();i.clip={top:o?(n.bottom-n.top)/2:n.top,right:a?(n.right-n.left)/2:n.right,bottom:o?(n.bottom-n.top)/2:n.bottom,left:a?(n.right-n.left)/2:n.left},V.effects.createPlaceholder(s),"show"===t.mode&&(s.cssClip(i.clip),i.clip=n),s.animate(i,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("drop","hide",function(t,e){var i=V(this),s="show"===t.mode,n=t.direction||"left",o="up"===n||"down"===n?"top":"left",a="up"===n||"left"===n?"-=":"+=",r="+="==a?"-=":"+=",l={opacity:0};V.effects.createPlaceholder(i),n=t.distance||i["top"==o?"outerHeight":"outerWidth"](!0)/2,l[o]=a+n,s&&(i.css(l),l[o]=r+n,l.opacity=1),i.animate(l,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("explode","hide",function(t,e){var i,s,n,o,a,r,l=t.pieces?Math.round(Math.sqrt(t.pieces)):3,h=l,c=V(this),u="show"===t.mode,d=c.show().css("visibility","hidden").offset(),p=Math.ceil(c.outerWidth()/h),f=Math.ceil(c.outerHeight()/l),g=[];function m(){g.push(this),g.length===l*h&&(c.css({visibility:"visible"}),V(g).remove(),e())}for(i=0;i<l;i++)for(o=d.top+i*f,r=i-(l-1)/2,s=0;s<h;s++)n=d.left+s*p,a=s-(h-1)/2,c.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-s*p,top:-i*f}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:f,left:n+(u?a*p:0),top:o+(u?r*f:0),opacity:u?0:1}).animate({left:n+(u?0:a*p),top:o+(u?0:r*f),opacity:u?1:0},t.duration||500,t.easing,m)}),V.effects.define("fade","toggle",function(t,e){var i="show"===t.mode;V(this).css("opacity",i?0:1).animate({opacity:i?1:0},{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("fold","hide",function(e,t){var i=V(this),s=e.mode,n="show"===s,o="hide"===s,a=e.size||15,r=/([0-9]+)%/.exec(a),l=!!e.horizFirst?["right","bottom"]:["bottom","right"],h=e.duration/2,c=V.effects.createPlaceholder(i),u=i.cssClip(),d={clip:V.extend({},u)},p={clip:V.extend({},u)},f=[u[l[0]],u[l[1]]],s=i.queue().length;r&&(a=parseInt(r[1],10)/100*f[o?0:1]),d.clip[l[0]]=a,p.clip[l[0]]=a,p.clip[l[1]]=0,n&&(i.cssClip(p.clip),c&&c.css(V.effects.clipToBox(p)),p.clip=u),i.queue(function(t){c&&c.animate(V.effects.clipToBox(d),h,e.easing).animate(V.effects.clipToBox(p),h,e.easing),t()}).animate(d,h,e.easing).animate(p,h,e.easing).queue(t),V.effects.unshift(i,s,4)}),V.effects.define("highlight","show",function(t,e){var i=V(this),s={backgroundColor:i.css("backgroundColor")};"hide"===t.mode&&(s.opacity=0),V.effects.saveStyle(i),i.css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(s,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("size",function(s,e){var n,i=V(this),t=["fontSize"],o=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],a=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],r=s.mode,l="effect"!==r,h=s.scale||"both",c=s.origin||["middle","center"],u=i.css("position"),d=i.position(),p=V.effects.scaledDimensions(i),f=s.from||p,g=s.to||V.effects.scaledDimensions(i,0);V.effects.createPlaceholder(i),"show"===r&&(r=f,f=g,g=r),n={from:{y:f.height/p.height,x:f.width/p.width},to:{y:g.height/p.height,x:g.width/p.width}},"box"!==h&&"both"!==h||(n.from.y!==n.to.y&&(f=V.effects.setTransition(i,o,n.from.y,f),g=V.effects.setTransition(i,o,n.to.y,g)),n.from.x!==n.to.x&&(f=V.effects.setTransition(i,a,n.from.x,f),g=V.effects.setTransition(i,a,n.to.x,g))),"content"!==h&&"both"!==h||n.from.y!==n.to.y&&(f=V.effects.setTransition(i,t,n.from.y,f),g=V.effects.setTransition(i,t,n.to.y,g)),c&&(c=V.effects.getBaseline(c,p),f.top=(p.outerHeight-f.outerHeight)*c.y+d.top,f.left=(p.outerWidth-f.outerWidth)*c.x+d.left,g.top=(p.outerHeight-g.outerHeight)*c.y+d.top,g.left=(p.outerWidth-g.outerWidth)*c.x+d.left),delete f.outerHeight,delete f.outerWidth,i.css(f),"content"!==h&&"both"!==h||(o=o.concat(["marginTop","marginBottom"]).concat(t),a=a.concat(["marginLeft","marginRight"]),i.find("*[width]").each(function(){var t=V(this),e=V.effects.scaledDimensions(t),i={height:e.height*n.from.y,width:e.width*n.from.x,outerHeight:e.outerHeight*n.from.y,outerWidth:e.outerWidth*n.from.x},e={height:e.height*n.to.y,width:e.width*n.to.x,outerHeight:e.height*n.to.y,outerWidth:e.width*n.to.x};n.from.y!==n.to.y&&(i=V.effects.setTransition(t,o,n.from.y,i),e=V.effects.setTransition(t,o,n.to.y,e)),n.from.x!==n.to.x&&(i=V.effects.setTransition(t,a,n.from.x,i),e=V.effects.setTransition(t,a,n.to.x,e)),l&&V.effects.saveStyle(t),t.css(i),t.animate(e,s.duration,s.easing,function(){l&&V.effects.restoreStyle(t)})})),i.animate(g,{queue:!1,duration:s.duration,easing:s.easing,complete:function(){var t=i.offset();0===g.opacity&&i.css("opacity",f.opacity),l||(i.css("position","static"===u?"relative":u).offset(t),V.effects.saveStyle(i)),e()}})}),V.effects.define("scale",function(t,e){var i=V(this),s=t.mode,s=parseInt(t.percent,10)||(0===parseInt(t.percent,10)||"effect"!==s?0:100),s=V.extend(!0,{from:V.effects.scaledDimensions(i),to:V.effects.scaledDimensions(i,s,t.direction||"both"),origin:t.origin||["middle","center"]},t);t.fade&&(s.from.opacity=1,s.to.opacity=0),V.effects.effect.size.call(this,s,e)}),V.effects.define("puff","hide",function(t,e){t=V.extend(!0,{},t,{fade:!0,percent:parseInt(t.percent,10)||150});V.effects.effect.scale.call(this,t,e)}),V.effects.define("pulsate","show",function(t,e){var i=V(this),s=t.mode,n="show"===s,o=2*(t.times||5)+(n||"hide"===s?1:0),a=t.duration/o,r=0,l=1,s=i.queue().length;for(!n&&i.is(":visible")||(i.css("opacity",0).show(),r=1);l<o;l++)i.animate({opacity:r},a,t.easing),r=1-r;i.animate({opacity:r},a,t.easing),i.queue(e),V.effects.unshift(i,s,1+o)}),V.effects.define("shake",function(t,e){var i=1,s=V(this),n=t.direction||"left",o=t.distance||20,a=t.times||3,r=2*a+1,l=Math.round(t.duration/r),h="up"===n||"down"===n?"top":"left",c="up"===n||"left"===n,u={},d={},p={},n=s.queue().length;for(V.effects.createPlaceholder(s),u[h]=(c?"-=":"+=")+o,d[h]=(c?"+=":"-=")+2*o,p[h]=(c?"-=":"+=")+2*o,s.animate(u,l,t.easing);i<a;i++)s.animate(d,l,t.easing).animate(p,l,t.easing);s.animate(d,l,t.easing).animate(u,l/2,t.easing).queue(e),V.effects.unshift(s,n,1+r)}),V.effects.define("slide","show",function(t,e){var i,s,n=V(this),o={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},a=t.mode,r=t.direction||"left",l="up"===r||"down"===r?"top":"left",h="up"===r||"left"===r,c=t.distance||n["top"==l?"outerHeight":"outerWidth"](!0),u={};V.effects.createPlaceholder(n),i=n.cssClip(),s=n.position()[l],u[l]=(h?-1:1)*c+s,u.clip=n.cssClip(),u.clip[o[r][1]]=u.clip[o[r][0]],"show"===a&&(n.cssClip(u.clip),n.css(l,u[l]),u.clip=i,u[l]=s),n.animate(u,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),y=!1!==V.uiBackCompat?V.effects.define("transfer",function(t,e){V(this).transfer(t,e)}):y;V.ui.focusable=function(t,e){var i,s,n,o,a=t.nodeName.toLowerCase();return"area"===a?(s=(i=t.parentNode).name,!(!t.href||!s||"map"!==i.nodeName.toLowerCase())&&(0<(s=V("img[usemap='#"+s+"']")).length&&s.is(":visible"))):(/^(input|select|textarea|button|object)$/.test(a)?(n=!t.disabled)&&(o=V(t).closest("fieldset")[0])&&(n=!o.disabled):n="a"===a&&t.href||e,n&&V(t).is(":visible")&&function(t){var e=t.css("visibility");for(;"inherit"===e;)t=t.parent(),e=t.css("visibility");return"visible"===e}(V(t)))},V.extend(V.expr.pseudos,{focusable:function(t){return V.ui.focusable(t,null!=V.attr(t,"tabindex"))}});var Q,J;V.ui.focusable,V.fn._form=function(){return"string"==typeof this[0].form?this.closest("form"):V(this[0].form)},V.ui.formResetMixin={_formResetHandler:function(){var e=V(this);setTimeout(function(){var t=e.data("ui-form-reset-instances");V.each(t,function(){this.refresh()})})},_bindFormResetHandler:function(){var t;this.form=this.element._form(),this.form.length&&((t=this.form.data("ui-form-reset-instances")||[]).length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t))},_unbindFormResetHandler:function(){var t;this.form.length&&((t=this.form.data("ui-form-reset-instances")).splice(V.inArray(this,t),1),t.length?this.form.data("ui-form-reset-instances",t):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset"))}};V.expr.pseudos||(V.expr.pseudos=V.expr[":"]),V.uniqueSort||(V.uniqueSort=V.unique),V.escapeSelector||(Q=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,J=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},V.escapeSelector=function(t){return(t+"").replace(Q,J)}),V.fn.even&&V.fn.odd||V.fn.extend({even:function(){return this.filter(function(t){return t%2==0})},odd:function(){return this.filter(function(t){return t%2==1})}});var Z;V.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},V.fn.labels=function(){var t,e,i;return this.length?this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+V.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e)):this.pushStack([])},V.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=V(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:V(this[0].ownerDocument||document)},V.extend(V.expr.pseudos,{tabbable:function(t){var e=V.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&V.ui.focusable(t,i)}}),V.fn.extend({uniqueId:(Z=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++Z)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&V(this).removeAttr("id")})}}),V.widget("ui.accordion",{version:"1.13.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:function(t){return t.find("> li > :first-child").add(t.find("> :not(li)").even())},heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=V(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),t.collapsible||!1!==t.active&&null!=t.active||(t.active=0),this._processPanels(),t.active<0&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():V()}},_createIcons:function(){var t,e=this.options.icons;e&&(t=V("<span>"),this._addClass(t,"ui-accordion-header-icon","ui-icon "+e.header),t.prependTo(this.headers),t=this.active.children(".ui-accordion-header-icon"),this._removeClass(t,e.header)._addClass(t,null,e.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){"active"!==t?("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons())):this._activate(e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var e=V.ui.keyCode,i=this.headers.length,s=this.headers.index(t.target),n=!1;switch(t.keyCode){case e.RIGHT:case e.DOWN:n=this.headers[(s+1)%i];break;case e.LEFT:case e.UP:n=this.headers[(s-1+i)%i];break;case e.SPACE:case e.ENTER:this._eventHandler(t);break;case e.HOME:n=this.headers[0];break;case e.END:n=this.headers[i-1]}n&&(V(t.target).attr("tabIndex",-1),V(n).attr("tabIndex",0),V(n).trigger("focus"),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===V.ui.keyCode.UP&&t.ctrlKey&&V(t.currentTarget).prev().trigger("focus")},refresh:function(){var t=this.options;this._processPanels(),!1===t.active&&!0===t.collapsible||!this.headers.length?(t.active=!1,this.active=V()):!1===t.active?this._activate(0):this.active.length&&!V.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=V()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;"function"==typeof this.options.header?this.headers=this.options.header(this.element):this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var i,t=this.options,e=t.heightStyle,s=this.element.parent();this.active=this._findActive(t.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var t=V(this),e=t.uniqueId().attr("id"),i=t.next(),s=i.uniqueId().attr("id");t.attr("aria-controls",s),i.attr("aria-labelledby",e)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(t.event),"fill"===e?(i=s.height(),this.element.siblings(":visible").each(function(){var t=V(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.headers.each(function(){i-=V(this).outerHeight(!0)}),this.headers.next().each(function(){V(this).height(Math.max(0,i-V(this).innerHeight()+V(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.headers.next().each(function(){var t=V(this).is(":visible");t||V(this).show(),i=Math.max(i,V(this).css("height","").height()),t||V(this).hide()}).height(i))},_activate:function(t){t=this._findActive(t)[0];t!==this.active[0]&&(t=t||this.active[0],this._eventHandler({target:t,currentTarget:t,preventDefault:V.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):V()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&V.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var e=this.options,i=this.active,s=V(t.currentTarget),n=s[0]===i[0],o=n&&e.collapsible,a=o?V():s.next(),r=i.next(),a={oldHeader:i,oldPanel:r,newHeader:o?V():s,newPanel:a};t.preventDefault(),n&&!e.collapsible||!1===this._trigger("beforeActivate",t,a)||(e.active=!o&&this.headers.index(s),this.active=n?V():s,this._toggle(a),this._removeClass(i,"ui-accordion-header-active","ui-state-active"),e.icons&&(i=i.children(".ui-accordion-header-icon"),this._removeClass(i,null,e.icons.activeHeader)._addClass(i,null,e.icons.header)),n||(this._removeClass(s,"ui-accordion-header-collapsed")._addClass(s,"ui-accordion-header-active","ui-state-active"),e.icons&&(n=s.children(".ui-accordion-header-icon"),this._removeClass(n,null,e.icons.header)._addClass(n,null,e.icons.activeHeader)),this._addClass(s.next(),"ui-accordion-content-active")))},_toggle:function(t){var e=t.newPanel,i=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=e,this.prevHide=i,this.options.animate?this._animate(e,i,t):(i.hide(),e.show(),this._toggleComplete(t)),i.attr({"aria-hidden":"true"}),i.prev().attr({"aria-selected":"false","aria-expanded":"false"}),e.length&&i.length?i.prev().attr({tabIndex:-1,"aria-expanded":"false"}):e.length&&this.headers.filter(function(){return 0===parseInt(V(this).attr("tabIndex"),10)}).attr("tabIndex",-1),e.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,i,e){var s,n,o,a=this,r=0,l=t.css("box-sizing"),h=t.length&&(!i.length||t.index()<i.index()),c=this.options.animate||{},u=h&&c.down||c,h=function(){a._toggleComplete(e)};return n=(n="string"==typeof u?u:n)||u.easing||c.easing,o=(o="number"==typeof u?u:o)||u.duration||c.duration,i.length?t.length?(s=t.show().outerHeight(),i.animate(this.hideProps,{duration:o,easing:n,step:function(t,e){e.now=Math.round(t)}}),void t.hide().animate(this.showProps,{duration:o,easing:n,complete:h,step:function(t,e){e.now=Math.round(t),"height"!==e.prop?"content-box"===l&&(r+=e.now):"content"!==a.options.heightStyle&&(e.now=Math.round(s-i.outerHeight()-r),r=0)}})):i.animate(this.hideProps,o,n,h):t.animate(this.showProps,o,n,h)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),V.ui.safeActiveElement=function(e){var i;try{i=e.activeElement}catch(t){i=e.body}return i=!(i=i||e.body).nodeName?e.body:i},V.widget("ui.menu",{version:"1.13.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=V(t.target),i=V(V.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){V.contains(this.element[0],V.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=V(t.target).closest(".ui-menu-item"),i=V(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=V(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case V.ui.keyCode.PAGE_UP:this.previousPage(t);break;case V.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case V.ui.keyCode.HOME:this._move("first","first",t);break;case V.ui.keyCode.END:this._move("last","last",t);break;case V.ui.keyCode.UP:this.previous(t);break;case V.ui.keyCode.DOWN:this.next(t);break;case V.ui.keyCode.LEFT:this.collapse(t);break;case V.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case V.ui.keyCode.ENTER:case V.ui.keyCode.SPACE:this._activate(t);break;case V.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=V(this),e=t.prev(),i=V("<span>").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=V(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!V.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(V.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(V.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s<e+t&&this.activeMenu.scrollTop(i+e-s+t))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(t){var e=V.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(e)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var t=i?this.element:V(e&&e.target).closest(this.element.find(".ui-menu"));t.length||(t=this.element),this._close(t),this.blur(e),this._removeClass(t.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=t},i?0:this.delay)},_close:function(t){(t=t||(this.active?this.active.parent():this.element)).find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(t){return!V(t.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this._menuItems(this.active.children(".ui-menu")).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_menuItems:function(t){return(t||this.element).find(this.options.items).filter(".ui-menu-item")},_move:function(t,e,i){var s;(s=this.active?"first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").last():this.active[t+"All"](".ui-menu-item").first():s)&&s.length&&this.active||(s=this._menuItems(this.activeMenu)[e]()),this.focus(i,s)},nextPage:function(t){var e,i,s;this.active?this.isLastItem()||(this._hasScroll()?(i=this.active.offset().top,s=this.element.innerHeight(),0===V.fn.jquery.indexOf("3.2.")&&(s+=this.element[0].offsetHeight-this.element.outerHeight()),this.active.nextAll(".ui-menu-item").each(function(){return(e=V(this)).offset().top-i-s<0}),this.focus(t,e)):this.focus(t,this._menuItems(this.activeMenu)[this.active?"last":"first"]())):this.next(t)},previousPage:function(t){var e,i,s;this.active?this.isFirstItem()||(this._hasScroll()?(i=this.active.offset().top,s=this.element.innerHeight(),0===V.fn.jquery.indexOf("3.2.")&&(s+=this.element[0].offsetHeight-this.element.outerHeight()),this.active.prevAll(".ui-menu-item").each(function(){return 0<(e=V(this)).offset().top-i+s}),this.focus(t,e)):this.focus(t,this._menuItems(this.activeMenu).first())):this.next(t)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||V(t.target).closest(".ui-menu-item");var e={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,e)},_filterMenuItems:function(t){var t=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),e=new RegExp("^"+t,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return e.test(String.prototype.trim.call(V(this).children(".ui-menu-item-wrapper").text()))})}});V.widget("ui.autocomplete",{version:"1.13.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=V.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=V.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=V("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().attr({unselectable:"on"}).menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){V(t.target).trigger(t.originalEvent)});s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(V("<div>").text(i))},100))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==V.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=V("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||V.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?V(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(V.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=V.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):!1!==this._trigger("search",e)?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")}.bind(this)},__response:function(t){t=t&&this._normalize(t),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:V.map(t,function(t){return"string"==typeof t?{label:t,value:t}:V.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var e=this.menu.element.empty();this._renderMenu(e,t),this.isNewMenu=!0,this.menu.refresh(),e.show(),this._resizeMenu(),e.position(V.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(i,t){var s=this;V.each(t,function(t,e){s._renderItemData(i,e)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(t,e){return V("<li>").append(V("<div>").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),V.extend(V.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(V.ui.autocomplete.escapeRegex(e),"i");return V.grep(t,function(t){return i.test(t.label||t.value||t)})}}),V.widget("ui.autocomplete",V.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1<t?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var e;this._superApply(arguments),this.options.disabled||this.cancelSearch||(e=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(V("<div>").text(e))},100))}});V.ui.autocomplete;var tt=/ui-corner-([a-z]){2,6}/g;V.widget("ui.controlgroup",{version:"1.13.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var o=this,a=[];V.each(this.options.items,function(s,t){var e,n={};if(t)return"controlgroupLabel"===s?((e=o.element.find(t)).each(function(){var t=V(this);t.children(".ui-controlgroup-label-contents").length||t.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),o._addClass(e,null,"ui-widget ui-widget-content ui-state-default"),void(a=a.concat(e.get()))):void(V.fn[s]&&(n=o["_"+s+"Options"]?o["_"+s+"Options"]("middle"):{classes:{}},o.element.find(t).each(function(){var t=V(this),e=t[s]("instance"),i=V.widget.extend({},n);"button"===s&&t.parent(".ui-spinner").length||((e=e||t[s]()[s]("instance"))&&(i.classes=o._resolveClassesValues(i.classes,e)),t[s](i),i=t[s]("widget"),V.data(i[0],"ui-controlgroup-data",e||t[s]("instance")),a.push(i[0]))})))}),this.childWidgets=V(V.uniqueSort(a)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var t=V(this).data("ui-controlgroup-data");t&&t[e]&&t[e]()})},_updateCornerClass:function(t,e){e=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"),this._addClass(t,null,e)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){t=this._buildSimpleOptions(t,"ui-spinner");return t.classes["ui-spinner-up"]="",t.classes["ui-spinner-down"]="",t},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e&&"auto",classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(i,s){var n={};return V.each(i,function(t){var e=s.options.classes[t]||"",e=String.prototype.trim.call(e.replace(tt,""));n[t]=(e+" "+i[t]).replace(/\s+/g," ")}),n},_setOption:function(t,e){"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"!==t?this.refresh():this._callChildMethod(e?"disable":"enable")},refresh:function(){var n,o=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),n=this.childWidgets,(n=this.options.onlyVisible?n.filter(":visible"):n).length&&(V.each(["first","last"],function(t,e){var i,s=n[e]().data("ui-controlgroup-data");s&&o["_"+s.widgetName+"Options"]?((i=o["_"+s.widgetName+"Options"](1===n.length?"only":e)).classes=o._resolveClassesValues(i.classes,s),s.element[s.widgetName](i)):o._updateCornerClass(n[e](),e)}),this._callChildMethod("refresh"))}});V.widget("ui.checkboxradio",[V.ui.formResetMixin,{version:"1.13.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var t,e=this,i=this._super()||{};return this._readType(),t=this.element.labels(),this.label=V(t[t.length-1]),this.label.length||V.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){e.originalLabel+=3===this.nodeType?V(this).text():this.outerHTML}),this.originalLabel&&(i.label=this.originalLabel),null!=(t=this.element[0].disabled)&&(i.disabled=t),i},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var t=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===t&&/radio|checkbox/.test(this.type)||V.error("Can't create checkboxradio on element.nodeName="+t+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var t=this.element[0].name,e="input[name='"+V.escapeSelector(t)+"']";return t?(this.form.length?V(this.form[0].elements).filter(e):V(e).filter(function(){return 0===V(this)._form().length})).not(this.element):V([])},_toggleClasses:function(){var t=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",t)._toggleClass(this.icon,null,"ui-icon-blank",!t),"radio"===this.type&&this._getRadioGroup().each(function(){var t=V(this).checkboxradio("instance");t&&t._removeClass(t.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){if("label"!==t||e){if(this._super(t,e),"disabled"===t)return this._toggleClass(this.label,null,"ui-state-disabled",e),void(this.element[0].disabled=e);this.refresh()}},_updateIcon:function(t){var e="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=V("<span>"),this.iconSpace=V("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(e+=t?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,t?"ui-icon-blank":"ui-icon-check")):e+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",e),t||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),(t=this.iconSpace?t.not(this.iconSpace[0]):t).remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]);var et;V.ui.checkboxradio;V.widget("ui.button",{version:"1.13.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),null!=(t=this.element[0].disabled)&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(t){t.keyCode===V.ui.keyCode.SPACE&&(t.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(t,e){var i="iconPosition"!==t,s=i?this.options.iconPosition:e,t="top"===s||"bottom"===s;this.icon?i&&this._removeClass(this.icon,null,this.options.icon):(this.icon=V("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),i&&this._addClass(this.icon,null,e),this._attachIcon(s),t?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=V("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(s))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=(void 0===t.showLabel?this.options:t).showLabel,i=(void 0===t.icon?this.options:t).icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),(this.element[0].disabled=e)&&this.element.trigger("blur"))},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),!1!==V.uiBackCompat&&(V.widget("ui.button",V.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){"text"!==t?("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),this._superApply(arguments)):this._super("showLabel",e)}}),V.fn.button=(et=V.fn.button,function(i){var t="string"==typeof i,s=Array.prototype.slice.call(arguments,1),n=this;return t?this.length||"instance"!==i?this.each(function(){var t=V(this).attr("type"),e=V.data(this,"ui-"+("checkbox"!==t&&"radio"!==t?"button":"checkboxradio"));return"instance"===i?(n=e,!1):e?"function"!=typeof e[i]||"_"===i.charAt(0)?V.error("no such method '"+i+"' for button widget instance"):(t=e[i].apply(e,s))!==e&&void 0!==t?(n=t&&t.jquery?n.pushStack(t.get()):t,!1):void 0:V.error("cannot call methods on button prior to initialization; attempted to call method '"+i+"'")}):n=void 0:(s.length&&(i=V.widget.extend.apply(null,[i].concat(s))),this.each(function(){var t=V(this).attr("type"),e="checkbox"!==t&&"radio"!==t?"button":"checkboxradio",t=V.data(this,"ui-"+e);t?(t.option(i||{}),t._init&&t._init()):"button"!=e?V(this).checkboxradio(V.extend({icon:!1},i)):et.call(V(this),i)})),n}),V.fn.buttonset=function(){return V.ui.controlgroup||V.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))});var it;V.ui.button;function st(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:"",selectMonthLabel:"Select month",selectYearLabel:"Select year"},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,onUpdateDatepicker:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},V.extend(this._defaults,this.regional[""]),this.regional.en=V.extend(!0,{},this.regional[""]),this.regional["en-US"]=V.extend(!0,{},this.regional.en),this.dpDiv=nt(V("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function nt(t){var e="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.on("mouseout",e,function(){V(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&V(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&V(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",e,ot)}function ot(){V.datepicker._isDisabledDatepicker((it.inline?it.dpDiv.parent():it.input)[0])||(V(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),V(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&V(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&V(this).addClass("ui-datepicker-next-hover"))}function at(t,e){for(var i in V.extend(t,e),e)null==e[i]&&(t[i]=e[i]);return t}V.extend(V.ui,{datepicker:{version:"1.13.1"}}),V.extend(st.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return at(this._defaults,t||{}),this},_attachDatepicker:function(t,e){var i,s=t.nodeName.toLowerCase(),n="div"===s||"span"===s;t.id||(this.uuid+=1,t.id="dp"+this.uuid),(i=this._newInst(V(t),n)).settings=V.extend({},e||{}),"input"===s?this._connectDatepicker(t,i):n&&this._inlineDatepicker(t,i)},_newInst:function(t,e){return{id:t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1"),input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:e,dpDiv:e?nt(V("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,e){var i=V(t);e.append=V([]),e.trigger=V([]),i.hasClass(this.markerClassName)||(this._attachments(i,e),i.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(e),V.data(t,"datepicker",e),e.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,e){var i,s=this._get(e,"appendText"),n=this._get(e,"isRTL");e.append&&e.append.remove(),s&&(e.append=V("<span>").addClass(this._appendClass).text(s),t[n?"before":"after"](e.append)),t.off("focus",this._showDatepicker),e.trigger&&e.trigger.remove(),"focus"!==(i=this._get(e,"showOn"))&&"both"!==i||t.on("focus",this._showDatepicker),"button"!==i&&"both"!==i||(s=this._get(e,"buttonText"),i=this._get(e,"buttonImage"),this._get(e,"buttonImageOnly")?e.trigger=V("<img>").addClass(this._triggerClass).attr({src:i,alt:s,title:s}):(e.trigger=V("<button type='button'>").addClass(this._triggerClass),i?e.trigger.html(V("<img>").attr({src:i,alt:s,title:s})):e.trigger.text(s)),t[n?"before":"after"](e.trigger),e.trigger.on("click",function(){return V.datepicker._datepickerShowing&&V.datepicker._lastInput===t[0]?V.datepicker._hideDatepicker():(V.datepicker._datepickerShowing&&V.datepicker._lastInput!==t[0]&&V.datepicker._hideDatepicker(),V.datepicker._showDatepicker(t[0])),!1}))},_autoSize:function(t){var e,i,s,n,o,a;this._get(t,"autoSize")&&!t.inline&&(o=new Date(2009,11,20),(a=this._get(t,"dateFormat")).match(/[DM]/)&&(e=function(t){for(n=s=i=0;n<t.length;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length))},_inlineDatepicker:function(t,e){var i=V(t);i.hasClass(this.markerClassName)||(i.addClass(this.markerClassName).append(e.dpDiv),V.data(t,"datepicker",e),this._setDate(e,this._getDefaultDate(e),!0),this._updateDatepicker(e),this._updateAlternate(e),e.settings.disabled&&this._disableDatepicker(t),e.dpDiv.css("display","block"))},_dialogDatepicker:function(t,e,i,s,n){var o,a=this._dialogInst;return a||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=V("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),V("body").append(this._dialogInput),(a=this._dialogInst=this._newInst(this._dialogInput,!1)).settings={},V.data(this._dialogInput[0],"datepicker",a)),at(a.settings,s||{}),e=e&&e.constructor===Date?this._formatDate(a,e):e,this._dialogInput.val(e),this._pos=n?n.length?n:[n.pageX,n.pageY]:null,this._pos||(o=document.documentElement.clientWidth,s=document.documentElement.clientHeight,e=document.documentElement.scrollLeft||document.body.scrollLeft,n=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[o/2-100+e,s/2-150+n]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),a.settings.onSelect=i,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),V.blockUI&&V.blockUI(this.dpDiv),V.data(this._dialogInput[0],"datepicker",a),this},_destroyDatepicker:function(t){var e,i=V(t),s=V.data(t,"datepicker");i.hasClass(this.markerClassName)&&(e=t.nodeName.toLowerCase(),V.removeData(t,"datepicker"),"input"===e?(s.append.remove(),s.trigger.remove(),i.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):"div"!==e&&"span"!==e||i.removeClass(this.markerClassName).empty(),it===s&&(it=null,this._curInst=null))},_enableDatepicker:function(e){var t,i=V(e),s=V.data(e,"datepicker");i.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!1,s.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):"div"!==t&&"span"!==t||((i=i.children("."+this._inlineClass)).children().removeClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=V.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var t,i=V(e),s=V.data(e,"datepicker");i.hasClass(this.markerClassName)&&("input"===(t=e.nodeName.toLowerCase())?(e.disabled=!0,s.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):"div"!==t&&"span"!==t||((i=i.children("."+this._inlineClass)).children().addClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=V.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;e<this._disabledInputs.length;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(t){try{return V.data(t,"datepicker")}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,e,i){var s,n,o=this._getInst(t);if(2===arguments.length&&"string"==typeof e)return"defaults"===e?V.extend({},V.datepicker._defaults):o?"all"===e?V.extend({},o.settings):this._get(o,e):null;s=e||{},"string"==typeof e&&((s={})[e]=i),o&&(this._curInst===o&&this._hideDatepicker(),n=this._getDateDatepicker(t,!0),e=this._getMinMaxDate(o,"min"),i=this._getMinMaxDate(o,"max"),at(o.settings,s),null!==e&&void 0!==s.dateFormat&&void 0===s.minDate&&(o.settings.minDate=this._formatDate(o,e)),null!==i&&void 0!==s.dateFormat&&void 0===s.maxDate&&(o.settings.maxDate=this._formatDate(o,i)),"disabled"in s&&(s.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(V(t),o),this._autoSize(o),this._setDate(o,n),this._updateAlternate(o),this._updateDatepicker(o))},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){t=this._getInst(t);t&&this._updateDatepicker(t)},_setDateDatepicker:function(t,e){t=this._getInst(t);t&&(this._setDate(t,e),this._updateDatepicker(t),this._updateAlternate(t))},_getDateDatepicker:function(t,e){t=this._getInst(t);return t&&!t.inline&&this._setDateFromField(t,e),t?this._getDate(t):null},_doKeyDown:function(t){var e,i,s=V.datepicker._getInst(t.target),n=!0,o=s.dpDiv.is(".ui-datepicker-rtl");if(s._keyEvent=!0,V.datepicker._datepickerShowing)switch(t.keyCode){case 9:V.datepicker._hideDatepicker(),n=!1;break;case 13:return(i=V("td."+V.datepicker._dayOverClass+":not(."+V.datepicker._currentClass+")",s.dpDiv))[0]&&V.datepicker._selectDay(t.target,s.selectedMonth,s.selectedYear,i[0]),(e=V.datepicker._get(s,"onSelect"))?(i=V.datepicker._formatDate(s),e.apply(s.input?s.input[0]:null,[i,s])):V.datepicker._hideDatepicker(),!1;case 27:V.datepicker._hideDatepicker();break;case 33:V.datepicker._adjustDate(t.target,t.ctrlKey?-V.datepicker._get(s,"stepBigMonths"):-V.datepicker._get(s,"stepMonths"),"M");break;case 34:V.datepicker._adjustDate(t.target,t.ctrlKey?+V.datepicker._get(s,"stepBigMonths"):+V.datepicker._get(s,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&V.datepicker._clearDate(t.target),n=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&V.datepicker._gotoToday(t.target),n=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&V.datepicker._adjustDate(t.target,o?1:-1,"D"),n=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&V.datepicker._adjustDate(t.target,t.ctrlKey?-V.datepicker._get(s,"stepBigMonths"):-V.datepicker._get(s,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&V.datepicker._adjustDate(t.target,-7,"D"),n=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&V.datepicker._adjustDate(t.target,o?-1:1,"D"),n=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&V.datepicker._adjustDate(t.target,t.ctrlKey?+V.datepicker._get(s,"stepBigMonths"):+V.datepicker._get(s,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&V.datepicker._adjustDate(t.target,7,"D"),n=t.ctrlKey||t.metaKey;break;default:n=!1}else 36===t.keyCode&&t.ctrlKey?V.datepicker._showDatepicker(this):n=!1;n&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var e,i=V.datepicker._getInst(t.target);if(V.datepicker._get(i,"constrainInput"))return e=V.datepicker._possibleChars(V.datepicker._get(i,"dateFormat")),i=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||i<" "||!e||-1<e.indexOf(i)},_doKeyUp:function(t){t=V.datepicker._getInst(t.target);if(t.input.val()!==t.lastVal)try{V.datepicker.parseDate(V.datepicker._get(t,"dateFormat"),t.input?t.input.val():null,V.datepicker._getFormatConfig(t))&&(V.datepicker._setDateFromField(t),V.datepicker._updateAlternate(t),V.datepicker._updateDatepicker(t))}catch(t){}return!0},_showDatepicker:function(t){var e,i,s,n;"input"!==(t=t.target||t).nodeName.toLowerCase()&&(t=V("input",t.parentNode)[0]),V.datepicker._isDisabledDatepicker(t)||V.datepicker._lastInput===t||(n=V.datepicker._getInst(t),V.datepicker._curInst&&V.datepicker._curInst!==n&&(V.datepicker._curInst.dpDiv.stop(!0,!0),n&&V.datepicker._datepickerShowing&&V.datepicker._hideDatepicker(V.datepicker._curInst.input[0])),!1!==(i=(s=V.datepicker._get(n,"beforeShow"))?s.apply(t,[t,n]):{})&&(at(n.settings,i),n.lastVal=null,V.datepicker._lastInput=t,V.datepicker._setDateFromField(n),V.datepicker._inDialog&&(t.value=""),V.datepicker._pos||(V.datepicker._pos=V.datepicker._findPos(t),V.datepicker._pos[1]+=t.offsetHeight),e=!1,V(t).parents().each(function(){return!(e|="fixed"===V(this).css("position"))}),s={left:V.datepicker._pos[0],top:V.datepicker._pos[1]},V.datepicker._pos=null,n.dpDiv.empty(),n.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),V.datepicker._updateDatepicker(n),s=V.datepicker._checkOffset(n,s,e),n.dpDiv.css({position:V.datepicker._inDialog&&V.blockUI?"static":e?"fixed":"absolute",display:"none",left:s.left+"px",top:s.top+"px"}),n.inline||(i=V.datepicker._get(n,"showAnim"),s=V.datepicker._get(n,"duration"),n.dpDiv.css("z-index",function(t){for(var e,i;t.length&&t[0]!==document;){if(("absolute"===(e=t.css("position"))||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}(V(t))+1),V.datepicker._datepickerShowing=!0,V.effects&&V.effects.effect[i]?n.dpDiv.show(i,V.datepicker._get(n,"showOptions"),s):n.dpDiv[i||"show"](i?s:null),V.datepicker._shouldFocusInput(n)&&n.input.trigger("focus"),V.datepicker._curInst=n)))},_updateDatepicker:function(t){this.maxRows=4,(it=t).dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var e,i=this._getNumberOfMonths(t),s=i[1],n=t.dpDiv.find("."+this._dayOverClass+" a"),o=V.datepicker._get(t,"onUpdateDatepicker");0<n.length&&ot.apply(n.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),1<s&&t.dpDiv.addClass("ui-datepicker-multi-"+s).css("width",17*s+"em"),t.dpDiv[(1!==i[0]||1!==i[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===V.datepicker._curInst&&V.datepicker._datepickerShowing&&V.datepicker._shouldFocusInput(t)&&t.input.trigger("focus"),t.yearshtml&&(e=t.yearshtml,setTimeout(function(){e===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year").first().replaceWith(t.yearshtml),e=t.yearshtml=null},0)),o&&o.apply(t.input?t.input[0]:null,[t])},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(t,e,i){var s=t.dpDiv.outerWidth(),n=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,a=t.input?t.input.outerHeight():0,r=document.documentElement.clientWidth+(i?0:V(document).scrollLeft()),l=document.documentElement.clientHeight+(i?0:V(document).scrollTop());return e.left-=this._get(t,"isRTL")?s-o:0,e.left-=i&&e.left===t.input.offset().left?V(document).scrollLeft():0,e.top-=i&&e.top===t.input.offset().top+a?V(document).scrollTop():0,e.left-=Math.min(e.left,e.left+s>r&&s<r?Math.abs(e.left+s-r):0),e.top-=Math.min(e.top,e.top+n>l&&n<l?Math.abs(n+a):0),e},_findPos:function(t){for(var e=this._getInst(t),i=this._get(e,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||V.expr.pseudos.hidden(t));)t=t[i?"previousSibling":"nextSibling"];return[(e=V(t).offset()).left,e.top]},_hideDatepicker:function(t){var e,i,s=this._curInst;!s||t&&s!==V.data(t,"datepicker")||this._datepickerShowing&&(e=this._get(s,"showAnim"),i=this._get(s,"duration"),t=function(){V.datepicker._tidyDialog(s)},V.effects&&(V.effects.effect[e]||V.effects[e])?s.dpDiv.hide(e,V.datepicker._get(s,"showOptions"),i,t):s.dpDiv["slideDown"===e?"slideUp":"fadeIn"===e?"fadeOut":"hide"](e?i:null,t),e||t(),this._datepickerShowing=!1,(t=this._get(s,"onClose"))&&t.apply(s.input?s.input[0]:null,[s.input?s.input.val():"",s]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),V.blockUI&&(V.unblockUI(),V("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(t){var e;V.datepicker._curInst&&(e=V(t.target),t=V.datepicker._getInst(e[0]),(e[0].id===V.datepicker._mainDivId||0!==e.parents("#"+V.datepicker._mainDivId).length||e.hasClass(V.datepicker.markerClassName)||e.closest("."+V.datepicker._triggerClass).length||!V.datepicker._datepickerShowing||V.datepicker._inDialog&&V.blockUI)&&(!e.hasClass(V.datepicker.markerClassName)||V.datepicker._curInst===t)||V.datepicker._hideDatepicker())},_adjustDate:function(t,e,i){var s=V(t),t=this._getInst(s[0]);this._isDisabledDatepicker(s[0])||(this._adjustInstDate(t,e,i),this._updateDatepicker(t))},_gotoToday:function(t){var e=V(t),i=this._getInst(e[0]);this._get(i,"gotoCurrent")&&i.currentDay?(i.selectedDay=i.currentDay,i.drawMonth=i.selectedMonth=i.currentMonth,i.drawYear=i.selectedYear=i.currentYear):(t=new Date,i.selectedDay=t.getDate(),i.drawMonth=i.selectedMonth=t.getMonth(),i.drawYear=i.selectedYear=t.getFullYear()),this._notifyChange(i),this._adjustDate(e)},_selectMonthYear:function(t,e,i){var s=V(t),t=this._getInst(s[0]);t["selected"+("M"===i?"Month":"Year")]=t["draw"+("M"===i?"Month":"Year")]=parseInt(e.options[e.selectedIndex].value,10),this._notifyChange(t),this._adjustDate(s)},_selectDay:function(t,e,i,s){var n=V(t);V(s).hasClass(this._unselectableClass)||this._isDisabledDatepicker(n[0])||((n=this._getInst(n[0])).selectedDay=n.currentDay=parseInt(V("a",s).attr("data-date")),n.selectedMonth=n.currentMonth=e,n.selectedYear=n.currentYear=i,this._selectDate(t,this._formatDate(n,n.currentDay,n.currentMonth,n.currentYear)))},_clearDate:function(t){t=V(t);this._selectDate(t,"")},_selectDate:function(t,e){var i=V(t),t=this._getInst(i[0]);e=null!=e?e:this._formatDate(t),t.input&&t.input.val(e),this._updateAlternate(t),(i=this._get(t,"onSelect"))?i.apply(t.input?t.input[0]:null,[e,t]):t.input&&t.input.trigger("change"),t.inline?this._updateDatepicker(t):(this._hideDatepicker(),this._lastInput=t.input[0],"object"!=typeof t.input[0]&&t.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(t){var e,i,s=this._get(t,"altField");s&&(e=this._get(t,"altFormat")||this._get(t,"dateFormat"),i=this._getDate(t),t=this.formatDate(e,i,this._getFormatConfig(t)),V(document).find(s).val(t))},noWeekends:function(t){t=t.getDay();return[0<t&&t<6,""]},iso8601Week:function(t){var e=new Date(t.getTime());return e.setDate(e.getDate()+4-(e.getDay()||7)),t=e.getTime(),e.setMonth(0),e.setDate(1),Math.floor(Math.round((t-e)/864e5)/7)+1},parseDate:function(e,n,t){if(null==e||null==n)throw"Invalid arguments";if(""===(n="object"==typeof n?n.toString():n+""))return null;for(var i,s,o,a=0,r=(t?t.shortYearCutoff:null)||this._defaults.shortYearCutoff,r="string"!=typeof r?r:(new Date).getFullYear()%100+parseInt(r,10),l=(t?t.dayNamesShort:null)||this._defaults.dayNamesShort,h=(t?t.dayNames:null)||this._defaults.dayNames,c=(t?t.monthNamesShort:null)||this._defaults.monthNamesShort,u=(t?t.monthNames:null)||this._defaults.monthNames,d=-1,p=-1,f=-1,g=-1,m=!1,_=function(t){t=w+1<e.length&&e.charAt(w+1)===t;return t&&w++,t},v=function(t){var e=_(t),e="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,e=new RegExp("^\\d{"+("y"===t?e:1)+","+e+"}"),e=n.substring(a).match(e);if(!e)throw"Missing number at position "+a;return a+=e[0].length,parseInt(e[0],10)},b=function(t,e,i){var s=-1,e=V.map(_(t)?i:e,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(V.each(e,function(t,e){var i=e[1];if(n.substr(a,i.length).toLowerCase()===i.toLowerCase())return s=e[0],a+=i.length,!1}),-1!==s)return s+1;throw"Unknown name at position "+a},y=function(){if(n.charAt(a)!==e.charAt(w))throw"Unexpected literal at position "+a;a++},w=0;w<e.length;w++)if(m)"'"!==e.charAt(w)||_("'")?y():m=!1;else switch(e.charAt(w)){case"d":f=v("d");break;case"D":b("D",l,h);break;case"o":g=v("o");break;case"m":p=v("m");break;case"M":p=b("M",c,u);break;case"y":d=v("y");break;case"@":d=(o=new Date(v("@"))).getFullYear(),p=o.getMonth()+1,f=o.getDate();break;case"!":d=(o=new Date((v("!")-this._ticksTo1970)/1e4)).getFullYear(),p=o.getMonth()+1,f=o.getDate();break;case"'":_("'")?y():m=!0;break;default:y()}if(a<n.length&&(s=n.substr(a),!/^\s+/.test(s)))throw"Extra/unparsed characters found in date: "+s;if(-1===d?d=(new Date).getFullYear():d<100&&(d+=(new Date).getFullYear()-(new Date).getFullYear()%100+(d<=r?0:-100)),-1<g)for(p=1,f=g;;){if(f<=(i=this._getDaysInMonth(d,p-1)))break;p++,f-=i}if((o=this._daylightSavingAdjust(new Date(d,p-1,f))).getFullYear()!==d||o.getMonth()+1!==p||o.getDate()!==f)throw"Invalid date";return o},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*60*60*1e7,formatDate:function(e,t,i){if(!t)return"";function s(t,e,i){var s=""+e;if(c(t))for(;s.length<i;)s="0"+s;return s}function n(t,e,i,s){return(c(t)?s:i)[e]}var o,a=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,r=(i?i.dayNames:null)||this._defaults.dayNames,l=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,h=(i?i.monthNames:null)||this._defaults.monthNames,c=function(t){t=o+1<e.length&&e.charAt(o+1)===t;return t&&o++,t},u="",d=!1;if(t)for(o=0;o<e.length;o++)if(d)"'"!==e.charAt(o)||c("'")?u+=e.charAt(o):d=!1;else switch(e.charAt(o)){case"d":u+=s("d",t.getDate(),2);break;case"D":u+=n("D",t.getDay(),a,r);break;case"o":u+=s("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=s("m",t.getMonth()+1,2);break;case"M":u+=n("M",t.getMonth(),l,h);break;case"y":u+=c("y")?t.getFullYear():(t.getFullYear()%100<10?"0":"")+t.getFullYear()%100;break;case"@":u+=t.getTime();break;case"!":u+=1e4*t.getTime()+this._ticksTo1970;break;case"'":c("'")?u+="'":d=!0;break;default:u+=e.charAt(o)}return u},_possibleChars:function(e){for(var t="",i=!1,s=function(t){t=n+1<e.length&&e.charAt(n+1)===t;return t&&n++,t},n=0;n<e.length;n++)if(i)"'"!==e.charAt(n)||s("'")?t+=e.charAt(n):i=!1;else switch(e.charAt(n)){case"d":case"m":case"y":case"@":t+="0123456789";break;case"D":case"M":return null;case"'":s("'")?t+="'":i=!0;break;default:t+=e.charAt(n)}return t},_get:function(t,e){return(void 0!==t.settings[e]?t.settings:this._defaults)[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(t){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(r,t,e){var i,s,t=null==t||""===t?e:"string"==typeof t?function(t){try{return V.datepicker.parseDate(V.datepicker._get(r,"dateFormat"),t,V.datepicker._getFormatConfig(r))}catch(t){}for(var e=(t.toLowerCase().match(/^c/)?V.datepicker._getDate(r):null)||new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate(),o=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,a=o.exec(t);a;){switch(a[2]||"d"){case"d":case"D":n+=parseInt(a[1],10);break;case"w":case"W":n+=7*parseInt(a[1],10);break;case"m":case"M":s+=parseInt(a[1],10),n=Math.min(n,V.datepicker._getDaysInMonth(i,s));break;case"y":case"Y":i+=parseInt(a[1],10),n=Math.min(n,V.datepicker._getDaysInMonth(i,s))}a=o.exec(t)}return new Date(i,s,n)}(t):"number"==typeof t?isNaN(t)?e:(i=t,(s=new Date).setDate(s.getDate()+i),s):new Date(t.getTime());return(t=t&&"Invalid Date"===t.toString()?e:t)&&(t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0)),this._daylightSavingAdjust(t)},_daylightSavingAdjust:function(t){return t?(t.setHours(12<t.getHours()?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,e=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=e.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=e.getMonth(),t.drawYear=t.selectedYear=t.currentYear=e.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){return!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay))},_attachHandlers:function(t){var e=this._get(t,"stepMonths"),i="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){V.datepicker._adjustDate(i,-e,"M")},next:function(){V.datepicker._adjustDate(i,+e,"M")},hide:function(){V.datepicker._hideDatepicker()},today:function(){V.datepicker._gotoToday(i)},selectDay:function(){return V.datepicker._selectDay(i,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return V.datepicker._selectMonthYear(i,this,"M"),!1},selectYear:function(){return V.datepicker._selectMonthYear(i,this,"Y"),!1}};V(this).on(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,l,h,c,u,d,p,f,g,m,_,v,b,y,w,x,k,C,D,I,T,P,M,S,H,z,A=new Date,O=this._daylightSavingAdjust(new Date(A.getFullYear(),A.getMonth(),A.getDate())),N=this._get(t,"isRTL"),E=this._get(t,"showButtonPanel"),W=this._get(t,"hideIfNoPrevNext"),F=this._get(t,"navigationAsDateFormat"),L=this._getNumberOfMonths(t),R=this._get(t,"showCurrentAtPos"),A=this._get(t,"stepMonths"),Y=1!==L[0]||1!==L[1],B=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),j=this._getMinMaxDate(t,"min"),q=this._getMinMaxDate(t,"max"),K=t.drawMonth-R,U=t.drawYear;if(K<0&&(K+=12,U--),q)for(e=this._daylightSavingAdjust(new Date(q.getFullYear(),q.getMonth()-L[0]*L[1]+1,q.getDate())),e=j&&e<j?j:e;this._daylightSavingAdjust(new Date(U,K,1))>e;)--K<0&&(K=11,U--);for(t.drawMonth=K,t.drawYear=U,R=this._get(t,"prevText"),R=F?this.formatDate(R,this._daylightSavingAdjust(new Date(U,K-A,1)),this._getFormatConfig(t)):R,i=this._canAdjustMonth(t,-1,U,K)?V("<a>").attr({class:"ui-datepicker-prev ui-corner-all","data-handler":"prev","data-event":"click",title:R}).append(V("<span>").addClass("ui-icon ui-icon-circle-triangle-"+(N?"e":"w")).text(R))[0].outerHTML:W?"":V("<a>").attr({class:"ui-datepicker-prev ui-corner-all ui-state-disabled",title:R}).append(V("<span>").addClass("ui-icon ui-icon-circle-triangle-"+(N?"e":"w")).text(R))[0].outerHTML,R=this._get(t,"nextText"),R=F?this.formatDate(R,this._daylightSavingAdjust(new Date(U,K+A,1)),this._getFormatConfig(t)):R,s=this._canAdjustMonth(t,1,U,K)?V("<a>").attr({class:"ui-datepicker-next ui-corner-all","data-handler":"next","data-event":"click",title:R}).append(V("<span>").addClass("ui-icon ui-icon-circle-triangle-"+(N?"w":"e")).text(R))[0].outerHTML:W?"":V("<a>").attr({class:"ui-datepicker-next ui-corner-all ui-state-disabled",title:R}).append(V("<span>").attr("class","ui-icon ui-icon-circle-triangle-"+(N?"w":"e")).text(R))[0].outerHTML,A=this._get(t,"currentText"),W=this._get(t,"gotoCurrent")&&t.currentDay?B:O,A=F?this.formatDate(A,W,this._getFormatConfig(t)):A,R="",t.inline||(R=V("<button>").attr({type:"button",class:"ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all","data-handler":"hide","data-event":"click"}).text(this._get(t,"closeText"))[0].outerHTML),F="",E&&(F=V("<div class='ui-datepicker-buttonpane ui-widget-content'>").append(N?R:"").append(this._isInRange(t,W)?V("<button>").attr({type:"button",class:"ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all","data-handler":"today","data-event":"click"}).text(A):"").append(N?"":R)[0].outerHTML),n=parseInt(this._get(t,"firstDay"),10),n=isNaN(n)?0:n,o=this._get(t,"showWeek"),a=this._get(t,"dayNames"),r=this._get(t,"dayNamesMin"),l=this._get(t,"monthNames"),h=this._get(t,"monthNamesShort"),c=this._get(t,"beforeShowDay"),u=this._get(t,"showOtherMonths"),d=this._get(t,"selectOtherMonths"),p=this._getDefaultDate(t),f="",m=0;m<L[0];m++){for(_="",this.maxRows=4,v=0;v<L[1];v++){if(b=this._daylightSavingAdjust(new Date(U,K,t.selectedDay)),y=" ui-corner-all",w="",Y){if(w+="<div class='ui-datepicker-group",1<L[1])switch(v){case 0:w+=" ui-datepicker-group-first",y=" ui-corner-"+(N?"right":"left");break;case L[1]-1:w+=" ui-datepicker-group-last",y=" ui-corner-"+(N?"left":"right");break;default:w+=" ui-datepicker-group-middle",y=""}w+="'>"}for(w+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+y+"'>"+(/all|left/.test(y)&&0===m?N?s:i:"")+(/all|right/.test(y)&&0===m?N?i:s:"")+this._generateMonthYearHeader(t,K,U,j,q,0<m||0<v,l,h)+"</div><table class='ui-datepicker-calendar'><thead><tr>",x=o?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",g=0;g<7;g++)x+="<th scope='col'"+(5<=(g+n+6)%7?" class='ui-datepicker-week-end'":"")+"><span title='"+a[k=(g+n)%7]+"'>"+r[k]+"</span></th>";for(w+=x+"</tr></thead><tbody>",D=this._getDaysInMonth(U,K),U===t.selectedYear&&K===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,D)),C=(this._getFirstDayOfMonth(U,K)-n+7)%7,D=Math.ceil((C+D)/7),I=Y&&this.maxRows>D?this.maxRows:D,this.maxRows=I,T=this._daylightSavingAdjust(new Date(U,K,1-C)),P=0;P<I;P++){for(w+="<tr>",M=o?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(T)+"</td>":"",g=0;g<7;g++)S=c?c.apply(t.input?t.input[0]:null,[T]):[!0,""],z=(H=T.getMonth()!==K)&&!d||!S[0]||j&&T<j||q&&q<T,M+="<td class='"+(5<=(g+n+6)%7?" ui-datepicker-week-end":"")+(H?" ui-datepicker-other-month":"")+(T.getTime()===b.getTime()&&K===t.selectedMonth&&t._keyEvent||p.getTime()===T.getTime()&&p.getTime()===b.getTime()?" "+this._dayOverClass:"")+(z?" "+this._unselectableClass+" ui-state-disabled":"")+(H&&!u?"":" "+S[1]+(T.getTime()===B.getTime()?" "+this._currentClass:"")+(T.getTime()===O.getTime()?" ui-datepicker-today":""))+"'"+(H&&!u||!S[2]?"":" title='"+S[2].replace(/'/g,"&#39;")+"'")+(z?"":" data-handler='selectDay' data-event='click' data-month='"+T.getMonth()+"' data-year='"+T.getFullYear()+"'")+">"+(H&&!u?"&#xa0;":z?"<span class='ui-state-default'>"+T.getDate()+"</span>":"<a class='ui-state-default"+(T.getTime()===O.getTime()?" ui-state-highlight":"")+(T.getTime()===B.getTime()?" ui-state-active":"")+(H?" ui-priority-secondary":"")+"' href='#' aria-current='"+(T.getTime()===B.getTime()?"true":"false")+"' data-date='"+T.getDate()+"'>"+T.getDate()+"</a>")+"</td>",T.setDate(T.getDate()+1),T=this._daylightSavingAdjust(T);w+=M+"</tr>"}11<++K&&(K=0,U++),_+=w+="</tbody></table>"+(Y?"</div>"+(0<L[0]&&v===L[1]-1?"<div class='ui-datepicker-row-break'></div>":""):"")}f+=_}return f+=F,t._keyEvent=!1,f},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var l,h,c,u,d,p,f=this._get(t,"changeMonth"),g=this._get(t,"changeYear"),m=this._get(t,"showMonthAfterYear"),_=this._get(t,"selectMonthLabel"),v=this._get(t,"selectYearLabel"),b="<div class='ui-datepicker-title'>",y="";if(o||!f)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(l=s&&s.getFullYear()===i,h=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' aria-label='"+_+"' data-handler='selectMonth' data-event='change'>",c=0;c<12;c++)(!l||c>=s.getMonth())&&(!h||c<=n.getMonth())&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(m||(b+=y+(!o&&f&&g?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!g)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(a=this._get(t,"yearRange").split(":"),u=(new Date).getFullYear(),d=(_=function(t){t=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?u+parseInt(t,10):parseInt(t,10);return isNaN(t)?u:t})(a[0]),p=Math.max(d,_(a[1]||"")),d=s?Math.max(d,s.getFullYear()):d,p=n?Math.min(p,n.getFullYear()):p,t.yearshtml+="<select class='ui-datepicker-year' aria-label='"+v+"' data-handler='selectYear' data-event='change'>";d<=p;d++)t.yearshtml+="<option value='"+d+"'"+(d===i?" selected='selected'":"")+">"+d+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),m&&(b+=(!o&&f&&g?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),e=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),e=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,e)));t.selectedDay=e.getDate(),t.drawMonth=t.selectedMonth=e.getMonth(),t.drawYear=t.selectedYear=e.getFullYear(),"M"!==i&&"Y"!==i||this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),t=this._getMinMaxDate(t,"max"),e=i&&e<i?i:e;return t&&t<e?t:e},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){t=this._get(t,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),n=this._daylightSavingAdjust(new Date(i,s+(e<0?e:n[0]*n[1]),1));return e<0&&n.setDate(this._getDaysInMonth(n.getFullYear(),n.getMonth())),this._isInRange(t,n)},_isInRange:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=null,o=null,a=this._get(t,"yearRange");return a&&(t=a.split(":"),a=(new Date).getFullYear(),n=parseInt(t[0],10),o=parseInt(t[1],10),t[0].match(/[+\-].*/)&&(n+=a),t[1].match(/[+\-].*/)&&(o+=a)),(!i||e.getTime()>=i.getTime())&&(!s||e.getTime()<=s.getTime())&&(!n||e.getFullYear()>=n)&&(!o||e.getFullYear()<=o)},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return{shortYearCutoff:e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);e=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),e,this._getFormatConfig(t))}}),V.fn.datepicker=function(t){if(!this.length)return this;V.datepicker.initialized||(V(document).on("mousedown",V.datepicker._checkExternalClick),V.datepicker.initialized=!0),0===V("#"+V.datepicker._mainDivId).length&&V("body").append(V.datepicker.dpDiv);var e=Array.prototype.slice.call(arguments,1);return"string"==typeof t&&("isDisabled"===t||"getDate"===t||"widget"===t)||"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?V.datepicker["_"+t+"Datepicker"].apply(V.datepicker,[this[0]].concat(e)):this.each(function(){"string"==typeof t?V.datepicker["_"+t+"Datepicker"].apply(V.datepicker,[this].concat(e)):V.datepicker._attachDatepicker(this,t)})},V.datepicker=new st,V.datepicker.initialized=!1,V.datepicker.uuid=(new Date).getTime(),V.datepicker.version="1.13.1";V.datepicker,V.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var rt=!1;V(document).on("mouseup",function(){rt=!1});V.widget("ui.mouse",{version:"1.13.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===V.data(t.target,e.widgetName+".preventClickEvent"))return V.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!rt){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&V(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===V.data(t.target,this.widgetName+".preventClickEvent")&&V.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),rt=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(V.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&V.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,rt=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),V.ui.plugin={add:function(t,e,i){var s,n=V.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n<o.length;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},V.ui.safeBlur=function(t){t&&"body"!==t.nodeName.toLowerCase()&&V(t).trigger("blur")};V.widget("ui.draggable",V.ui.mouse,{version:"1.13.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){(this.helper||this.element).is(".ui-draggable-dragging")?this.destroyOnClear=!0:(this._removeHandleClassName(),this._mouseDestroy())},_mouseCapture:function(t){var e=this.options;return!(this.helper||e.disabled||0<V(t.target).closest(".ui-resizable-handle").length)&&(this.handle=this._getHandle(t),!!this.handle&&(this._blurActiveElement(t),this._blockFrames(!0===e.iframeFix?"iframe":e.iframeFix),!0))},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=V(this);return V("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var e=V.ui.safeActiveElement(this.document[0]);V(t.target).closest(e).length||V.ui.safeBlur(e)},_mouseStart:function(t){var e=this.options;return this.helper=this._createHelper(t),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),V.ui.ddmanager&&(V.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=0<this.helper.parents().filter(function(){return"fixed"===V(this).css("position")}).length,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this._setContainment(),!1===this._trigger("start",t)?(this._clear(),!1):(this._cacheHelperProportions(),V.ui.ddmanager&&!e.dropBehaviour&&V.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),V.ui.ddmanager&&V.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(t,e){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!e){e=this._uiHash();if(!1===this._trigger("drag",t,e))return this._mouseUp(new V.Event("mouseup",t)),!1;this.position=e.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",V.ui.ddmanager&&V.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var e=this,i=!1;return V.ui.ddmanager&&!this.options.dropBehaviour&&(i=V.ui.ddmanager.drop(this,t)),this.dropped&&(i=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!i||"valid"===this.options.revert&&i||!0===this.options.revert||"function"==typeof this.options.revert&&this.options.revert.call(this.element,i)?V(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){!1!==e._trigger("stop",t)&&e._clear()}):!1!==this._trigger("stop",t)&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),V.ui.ddmanager&&V.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.trigger("focus"),V.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new V.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(t){return!this.options.handle||!!V(t.target).closest(this.element.find(this.options.handle)).length},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(t){var e=this.options,i="function"==typeof e.helper,t=i?V(e.helper.apply(this.element[0],[t])):"clone"===e.helper?this.element.clone().removeAttr("id"):this.element;return t.parents("body").length||t.appendTo("parent"===e.appendTo?this.element[0].parentNode:e.appendTo),i&&t[0]===this.element[0]&&this._setPositionRelative(),t[0]===this.element[0]||/(fixed|absolute)/.test(t.css("position"))||t.css("position","absolute"),t},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),"left"in(t=Array.isArray(t)?{left:+t[0],top:+t[1]||0}:t)&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),e=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==e&&V.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),{top:(t=this._isRootNode(this.offsetParent[0])?{top:0,left:0}:t).top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,e,i,s=this.options,n=this.document[0];this.relativeContainer=null,s.containment?"window"!==s.containment?"document"!==s.containment?s.containment.constructor!==Array?("parent"===s.containment&&(s.containment=this.helper[0].parentNode),(i=(e=V(s.containment))[0])&&(t=/(scroll|auto)/.test(e.css("overflow")),this.containment=[(parseInt(e.css("borderLeftWidth"),10)||0)+(parseInt(e.css("paddingLeft"),10)||0),(parseInt(e.css("borderTopWidth"),10)||0)+(parseInt(e.css("paddingTop"),10)||0),(t?Math.max(i.scrollWidth,i.offsetWidth):i.offsetWidth)-(parseInt(e.css("borderRightWidth"),10)||0)-(parseInt(e.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(i.scrollHeight,i.offsetHeight):i.offsetHeight)-(parseInt(e.css("borderBottomWidth"),10)||0)-(parseInt(e.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=e)):this.containment=s.containment:this.containment=[0,0,V(n).width()-this.helperProportions.width-this.margins.left,(V(n).height()||n.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]:this.containment=[V(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,V(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,V(window).scrollLeft()+V(window).width()-this.helperProportions.width-this.margins.left,V(window).scrollTop()+(V(window).height()||n.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]:this.containment=null},_convertPositionTo:function(t,e){e=e||this.position;var i="absolute"===t?1:-1,t=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:t?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:t?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s=this.options,n=this._isRootNode(this.scrollParent[0]),o=t.pageX,a=t.pageY;return n&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(i=this.relativeContainer?(i=this.relativeContainer.offset(),[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]):this.containment,t.pageX-this.offset.click.left<i[0]&&(o=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(a=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(o=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(a=i[3]+this.offset.click.top)),s.grid&&(t=s.grid[1]?this.originalPageY+Math.round((a-this.originalPageY)/s.grid[1])*s.grid[1]:this.originalPageY,a=!i||t-this.offset.click.top>=i[1]||t-this.offset.click.top>i[3]?t:t-this.offset.click.top>=i[1]?t-s.grid[1]:t+s.grid[1],t=s.grid[0]?this.originalPageX+Math.round((o-this.originalPageX)/s.grid[0])*s.grid[0]:this.originalPageX,o=!i||t-this.offset.click.left>=i[0]||t-this.offset.click.left>i[2]?t:t-this.offset.click.left>=i[0]?t-s.grid[0]:t+s.grid[0]),"y"===s.axis&&(o=this.originalPageX),"x"===s.axis&&(a=this.originalPageY)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:n?0:this.offset.scroll.top),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:n?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,e,i){return i=i||this._uiHash(),V.ui.plugin.call(this,t,[e,i,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),i.offset=this.positionAbs),V.Widget.prototype._trigger.call(this,t,e,i)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),V.ui.plugin.add("draggable","connectToSortable",{start:function(e,t,i){var s=V.extend({},t,{item:i.element});i.sortables=[],V(i.options.connectToSortable).each(function(){var t=V(this).sortable("instance");t&&!t.options.disabled&&(i.sortables.push(t),t.refreshPositions(),t._trigger("activate",e,s))})},stop:function(e,t,i){var s=V.extend({},t,{item:i.element});i.cancelHelperRemoval=!1,V.each(i.sortables,function(){var t=this;t.isOver?(t.isOver=0,i.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,s))})},drag:function(i,s,n){V.each(n.sortables,function(){var t=!1,e=this;e.positionAbs=n.positionAbs,e.helperProportions=n.helperProportions,e.offset.click=n.offset.click,e._intersectsWith(e.containerCache)&&(t=!0,V.each(n.sortables,function(){return this.positionAbs=n.positionAbs,this.helperProportions=n.helperProportions,this.offset.click=n.offset.click,t=this!==e&&this._intersectsWith(this.containerCache)&&V.contains(e.element[0],this.element[0])?!1:t})),t?(e.isOver||(e.isOver=1,n._parent=s.helper.parent(),e.currentItem=s.helper.appendTo(e.element).data("ui-sortable-item",!0),e.options._helper=e.options.helper,e.options.helper=function(){return s.helper[0]},i.target=e.currentItem[0],e._mouseCapture(i,!0),e._mouseStart(i,!0,!0),e.offset.click.top=n.offset.click.top,e.offset.click.left=n.offset.click.left,e.offset.parent.left-=n.offset.parent.left-e.offset.parent.left,e.offset.parent.top-=n.offset.parent.top-e.offset.parent.top,n._trigger("toSortable",i),n.dropped=e.element,V.each(n.sortables,function(){this.refreshPositions()}),n.currentItem=n.element,e.fromOutside=n),e.currentItem&&(e._mouseDrag(i),s.position=e.position)):e.isOver&&(e.isOver=0,e.cancelHelperRemoval=!0,e.options._revert=e.options.revert,e.options.revert=!1,e._trigger("out",i,e._uiHash(e)),e._mouseStop(i,!0),e.options.revert=e.options._revert,e.options.helper=e.options._helper,e.placeholder&&e.placeholder.remove(),s.helper.appendTo(n._parent),n._refreshOffsets(i),s.position=n._generatePosition(i,!0),n._trigger("fromSortable",i),n.dropped=!1,V.each(n.sortables,function(){this.refreshPositions()}))})}}),V.ui.plugin.add("draggable","cursor",{start:function(t,e,i){var s=V("body"),i=i.options;s.css("cursor")&&(i._cursor=s.css("cursor")),s.css("cursor",i.cursor)},stop:function(t,e,i){i=i.options;i._cursor&&V("body").css("cursor",i._cursor)}}),V.ui.plugin.add("draggable","opacity",{start:function(t,e,i){e=V(e.helper),i=i.options;e.css("opacity")&&(i._opacity=e.css("opacity")),e.css("opacity",i.opacity)},stop:function(t,e,i){i=i.options;i._opacity&&V(e.helper).css("opacity",i._opacity)}}),V.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,e,i){var s=i.options,n=!1,o=i.scrollParentNotHidden[0],a=i.document[0];o!==a&&"HTML"!==o.tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+o.offsetHeight-t.pageY<s.scrollSensitivity?o.scrollTop=n=o.scrollTop+s.scrollSpeed:t.pageY-i.overflowOffset.top<s.scrollSensitivity&&(o.scrollTop=n=o.scrollTop-s.scrollSpeed)),s.axis&&"y"===s.axis||(i.overflowOffset.left+o.offsetWidth-t.pageX<s.scrollSensitivity?o.scrollLeft=n=o.scrollLeft+s.scrollSpeed:t.pageX-i.overflowOffset.left<s.scrollSensitivity&&(o.scrollLeft=n=o.scrollLeft-s.scrollSpeed))):(s.axis&&"x"===s.axis||(t.pageY-V(a).scrollTop()<s.scrollSensitivity?n=V(a).scrollTop(V(a).scrollTop()-s.scrollSpeed):V(window).height()-(t.pageY-V(a).scrollTop())<s.scrollSensitivity&&(n=V(a).scrollTop(V(a).scrollTop()+s.scrollSpeed))),s.axis&&"y"===s.axis||(t.pageX-V(a).scrollLeft()<s.scrollSensitivity?n=V(a).scrollLeft(V(a).scrollLeft()-s.scrollSpeed):V(window).width()-(t.pageX-V(a).scrollLeft())<s.scrollSensitivity&&(n=V(a).scrollLeft(V(a).scrollLeft()+s.scrollSpeed)))),!1!==n&&V.ui.ddmanager&&!s.dropBehaviour&&V.ui.ddmanager.prepareOffsets(i,t)}}),V.ui.plugin.add("draggable","snap",{start:function(t,e,i){var s=i.options;i.snapElements=[],V(s.snap.constructor!==String?s.snap.items||":data(ui-draggable)":s.snap).each(function(){var t=V(this),e=t.offset();this!==i.element[0]&&i.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:e.top,left:e.left})})},drag:function(t,e,i){for(var s,n,o,a,r,l,h,c,u,d=i.options,p=d.snapTolerance,f=e.offset.left,g=f+i.helperProportions.width,m=e.offset.top,_=m+i.helperProportions.height,v=i.snapElements.length-1;0<=v;v--)l=(r=i.snapElements[v].left-i.margins.left)+i.snapElements[v].width,c=(h=i.snapElements[v].top-i.margins.top)+i.snapElements[v].height,g<r-p||l+p<f||_<h-p||c+p<m||!V.contains(i.snapElements[v].item.ownerDocument,i.snapElements[v].item)?(i.snapElements[v].snapping&&i.options.snap.release&&i.options.snap.release.call(i.element,t,V.extend(i._uiHash(),{snapItem:i.snapElements[v].item})),i.snapElements[v].snapping=!1):("inner"!==d.snapMode&&(s=Math.abs(h-_)<=p,n=Math.abs(c-m)<=p,o=Math.abs(r-g)<=p,a=Math.abs(l-f)<=p,s&&(e.position.top=i._convertPositionTo("relative",{top:h-i.helperProportions.height,left:0}).top),n&&(e.position.top=i._convertPositionTo("relative",{top:c,left:0}).top),o&&(e.position.left=i._convertPositionTo("relative",{top:0,left:r-i.helperProportions.width}).left),a&&(e.position.left=i._convertPositionTo("relative",{top:0,left:l}).left)),u=s||n||o||a,"outer"!==d.snapMode&&(s=Math.abs(h-m)<=p,n=Math.abs(c-_)<=p,o=Math.abs(r-f)<=p,a=Math.abs(l-g)<=p,s&&(e.position.top=i._convertPositionTo("relative",{top:h,left:0}).top),n&&(e.position.top=i._convertPositionTo("relative",{top:c-i.helperProportions.height,left:0}).top),o&&(e.position.left=i._convertPositionTo("relative",{top:0,left:r}).left),a&&(e.position.left=i._convertPositionTo("relative",{top:0,left:l-i.helperProportions.width}).left)),!i.snapElements[v].snapping&&(s||n||o||a||u)&&i.options.snap.snap&&i.options.snap.snap.call(i.element,t,V.extend(i._uiHash(),{snapItem:i.snapElements[v].item})),i.snapElements[v].snapping=s||n||o||a||u)}}),V.ui.plugin.add("draggable","stack",{start:function(t,e,i){var s,i=i.options,i=V.makeArray(V(i.stack)).sort(function(t,e){return(parseInt(V(t).css("zIndex"),10)||0)-(parseInt(V(e).css("zIndex"),10)||0)});i.length&&(s=parseInt(V(i[0]).css("zIndex"),10)||0,V(i).each(function(t){V(this).css("zIndex",s+t)}),this.css("zIndex",s+i.length))}}),V.ui.plugin.add("draggable","zIndex",{start:function(t,e,i){e=V(e.helper),i=i.options;e.css("zIndex")&&(i._zIndex=e.css("zIndex")),e.css("zIndex",i.zIndex)},stop:function(t,e,i){i=i.options;i._zIndex&&V(e.helper).css("zIndex",i._zIndex)}});V.ui.draggable;V.widget("ui.resizable",V.ui.mouse,{version:"1.13.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(t,e){if("hidden"===V(t).css("overflow"))return!1;var i=e&&"left"===e?"scrollLeft":"scrollTop",e=!1;if(0<t[i])return!0;try{t[i]=1,e=0<t[i],t[i]=0}catch(t){}return e},_create:function(){var t,e=this.options,i=this;this._addClass("ui-resizable"),V.extend(this,{_aspectRatio:!!e.aspectRatio,aspectRatio:e.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:e.helper||e.ghost||e.animate?e.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(V("<div class='ui-wrapper'></div>").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&V(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){V(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,a=this;if(this.handles=o.handles||(V(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=V(),this._addedHandles=V(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e<i.length;e++)s="ui-resizable-"+(t=String.prototype.trim.call(i[e])),n=V("<div>"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=V(this.handles[e]),this._on(this.handles[e],{mousedown:a._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=V(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=V(this.handles[e])[0])!==t.target&&!V.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=V(s.containment).scrollLeft()||0,i+=V(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=V(".ui-resizable-"+this.axis).css("cursor"),V("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),V.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(V.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),V("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),s<n.maxWidth&&(n.maxWidth=s),t<n.maxHeight&&(n.maxHeight=t)),this._vBoundaries=n},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,h=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&i&&(t.top=l-e.minHeight),n&&i&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e<this._proportionallyResizeElements.length;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,e=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||V("<div></div>").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return V.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return V.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return V.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return V.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){V.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),V.ui.plugin.add("resizable","animate",{stop:function(e){var i=V(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,a=n?0:i.sizeDiff.width,n={width:i.size.width-a,height:i.size.height-o},a=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(V.extend(n,o&&a?{top:o,left:a}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&V(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),V.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=V(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,a=o instanceof V?o.get(0):/parent/.test(o)?e.parent().get(0):o;a&&(n.containerElement=V(a),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:V(document),left:0,top:0,width:V(document).width(),height:V(document).height()||document.body.parentNode.scrollHeight}):(i=V(a),s=[],V(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(a,"left")?a.scrollWidth:o,e=n._hasScroll(a)?a.scrollHeight:e,n.parentData={element:a,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=V(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,a={top:0,left:0},r=e.containerElement,t=!0;r[0]!==document&&/static/.test(r.css("position"))&&(a=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-a.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-a.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-a.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=V(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=V(t.helper),a=o.offset(),r=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&V(this).css({left:a.left-s.left-i.left,width:r,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&V(this).css({left:a.left-s.left-i.left,width:r,height:o})}}),V.ui.plugin.add("resizable","alsoResize",{start:function(){var t=V(this).resizable("instance").options;V(t.alsoResize).each(function(){var t=V(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=V(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,a={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};V(s.alsoResize).each(function(){var t=V(this),s=V(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];V.each(e,function(t,e){var i=(s[e]||0)+(a[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){V(this).removeData("ui-resizable-alsoresize")}}),V.ui.plugin.add("resizable","ghost",{start:function(){var t=V(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==V.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=V(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=V(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),V.ui.plugin.add("resizable","grid",{resize:function(){var t,e=V(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,l=r[0]||1,h=r[1]||1,c=Math.round((s.width-n.width)/l)*l,u=Math.round((s.height-n.height)/h)*h,d=n.width+c,p=n.height+u,f=i.maxWidth&&i.maxWidth<d,g=i.maxHeight&&i.maxHeight<p,m=i.minWidth&&i.minWidth>d,s=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=l),s&&(p+=h),f&&(d-=l),g&&(p-=h),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):((p-h<=0||d-l<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0<p-h?(e.size.height=p,e.position.top=o.top-u):(p=h-t.height,e.size.height=p,e.position.top=o.top+n.height-p),0<d-l?(e.size.width=d,e.position.left=o.left-c):(d=l-t.width,e.size.width=d,e.position.left=o.left+n.width-d))}});V.ui.resizable;V.widget("ui.dialog",{version:"1.13.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var e=V(this).css(t).offset().top;e<0&&V(this).css("top",t.top-e)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&V.fn.draggable&&this._makeDraggable(),this.options.resizable&&V.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?V(t):this.document.find(t||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),(t=e.parent.children().eq(e.index)).length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:V.noop,enable:V.noop,close:function(t){var e=this;this._isOpen&&!1!==this._trigger("beforeClose",t)&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||V.ui.safeBlur(V.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){e._trigger("close",t)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,e){var i=!1,s=this.uiDialog.siblings(".ui-front:visible").map(function(){return+V(this).css("z-index")}).get(),s=Math.max.apply(null,s);return s>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",s+1),i=!0),i&&!e&&this._trigger("focus",t),i},open:function(){var t=this;this._isOpen?this._moveToTop()&&this._focusTabbable():(this._isOpen=!0,this.opener=V(V.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"))},_focusTabbable:function(){var t=this._focusedElement;(t=!(t=!(t=!(t=!(t=t||this.element.find("[autofocus]")).length?this.element.find(":tabbable"):t).length?this.uiDialogButtonPane.find(":tabbable"):t).length?this.uiDialogTitlebarClose.filter(":tabbable"):t).length?this.uiDialog:t).eq(0).trigger("focus")},_restoreTabbableFocus:function(){var t=V.ui.safeActiveElement(this.document[0]);this.uiDialog[0]===t||V.contains(this.uiDialog[0],t)||this._focusTabbable()},_keepFocus:function(t){t.preventDefault(),this._restoreTabbableFocus(),this._delay(this._restoreTabbableFocus)},_createWrapper:function(){this.uiDialog=V("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===V.ui.keyCode.ESCAPE)return t.preventDefault(),void this.close(t);var e,i,s;t.keyCode!==V.ui.keyCode.TAB||t.isDefaultPrevented()||(e=this.uiDialog.find(":tabbable"),i=e.first(),s=e.last(),t.target!==s[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==i[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){s.trigger("focus")}),t.preventDefault()):(this._delay(function(){i.trigger("focus")}),t.preventDefault()))},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=V("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(t){V(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=V("<button type='button'></button>").button({label:V("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),t=V("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(t,"ui-dialog-title"),this._title(t),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=V("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=V("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var s=this,t=this.options.buttons;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),V.isEmptyObject(t)||Array.isArray(t)&&!t.length?this._removeClass(this.uiDialog,"ui-dialog-buttons"):(V.each(t,function(t,e){var i;e=V.extend({type:"button"},e="function"==typeof e?{click:e,text:t}:e),i=e.click,t={icon:e.icon,iconPosition:e.iconPosition,showLabel:e.showLabel,icons:e.icons,text:e.text},delete e.click,delete e.icon,delete e.iconPosition,delete e.showLabel,delete e.icons,"boolean"==typeof e.text&&delete e.text,V("<button></button>",e).button(t).appendTo(s.uiButtonSet).on("click",function(){i.apply(s.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog))},_makeDraggable:function(){var n=this,o=this.options;function a(t){return{position:t.position,offset:t.offset}}this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(t,e){n._addClass(V(this),"ui-dialog-dragging"),n._blockFrames(),n._trigger("dragStart",t,a(e))},drag:function(t,e){n._trigger("drag",t,a(e))},stop:function(t,e){var i=e.offset.left-n.document.scrollLeft(),s=e.offset.top-n.document.scrollTop();o.position={my:"left top",at:"left"+(0<=i?"+":"")+i+" top"+(0<=s?"+":"")+s,of:n.window},n._removeClass(V(this),"ui-dialog-dragging"),n._unblockFrames(),n._trigger("dragStop",t,a(e))}})},_makeResizable:function(){var n=this,o=this.options,t=o.resizable,e=this.uiDialog.css("position"),t="string"==typeof t?t:"n,e,s,w,se,sw,ne,nw";function a(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:o.maxWidth,maxHeight:o.maxHeight,minWidth:o.minWidth,minHeight:this._minHeight(),handles:t,start:function(t,e){n._addClass(V(this),"ui-dialog-resizing"),n._blockFrames(),n._trigger("resizeStart",t,a(e))},resize:function(t,e){n._trigger("resize",t,a(e))},stop:function(t,e){var i=n.uiDialog.offset(),s=i.left-n.document.scrollLeft(),i=i.top-n.document.scrollTop();o.height=n.uiDialog.height(),o.width=n.uiDialog.width(),o.position={my:"left top",at:"left"+(0<=s?"+":"")+s+" top"+(0<=i?"+":"")+i,of:n.window},n._removeClass(V(this),"ui-dialog-resizing"),n._unblockFrames(),n._trigger("resizeStop",t,a(e))}}).css("position",e)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=V(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),e=V.inArray(this,t);-1!==e&&t.splice(e,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||this.document.data("ui-dialog-instances",t=[]),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};V.each(t,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(t,e){var i,s=this.uiDialog;"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:V("<a>").text(""+this.options.closeText).html()}),"draggable"===t&&((i=s.is(":data(ui-draggable)"))&&!e&&s.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&((i=s.is(":data(ui-resizable)"))&&!e&&s.resizable("destroy"),i&&"string"==typeof e&&s.resizable("option","handles",e),i||!1===e||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=V(this);return V("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return!!V(t.target).closest(".ui-dialog").length||!!V(t.target).closest(".ui-datepicker").length},_createOverlay:function(){var i,s;this.options.modal&&(i=V.fn.jquery.substring(0,4),s=!0,this._delay(function(){s=!1}),this.document.data("ui-dialog-overlays")||this.document.on("focusin.ui-dialog",function(t){var e;s||((e=this._trackingInstances()[0])._allowInteraction(t)||(t.preventDefault(),e._focusTabbable(),"3.4."!==i&&"3.5."!==i||e._delay(e._restoreTabbableFocus)))}.bind(this)),this.overlay=V("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1))},_destroyOverlay:function(){var t;this.options.modal&&this.overlay&&((t=this.document.data("ui-dialog-overlays")-1)?this.document.data("ui-dialog-overlays",t):(this.document.off("focusin.ui-dialog"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null)}}),!1!==V.uiBackCompat&&V.widget("ui.dialog",V.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}});V.ui.dialog;function lt(t,e,i){return e<=t&&t<e+i}V.widget("ui.droppable",{version:"1.13.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,e=this.options,i=e.accept;this.isover=!1,this.isout=!0,this.accept="function"==typeof i?i:function(t){return t.is(i)},this.proportions=function(){if(!arguments.length)return t=t||{width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};t=arguments[0]},this._addToManager(e.scope),e.addClasses&&this._addClass("ui-droppable")},_addToManager:function(t){V.ui.ddmanager.droppables[t]=V.ui.ddmanager.droppables[t]||[],V.ui.ddmanager.droppables[t].push(this)},_splice:function(t){for(var e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var t=V.ui.ddmanager.droppables[this.options.scope];this._splice(t)},_setOption:function(t,e){var i;"accept"===t?this.accept="function"==typeof e?e:function(t){return t.is(e)}:"scope"===t&&(i=V.ui.ddmanager.droppables[this.options.scope],this._splice(i),this._addToManager(e)),this._super(t,e)},_activate:function(t){var e=V.ui.ddmanager.current;this._addActiveClass(),e&&this._trigger("activate",t,this.ui(e))},_deactivate:function(t){var e=V.ui.ddmanager.current;this._removeActiveClass(),e&&this._trigger("deactivate",t,this.ui(e))},_over:function(t){var e=V.ui.ddmanager.current;e&&(e.currentItem||e.element)[0]!==this.element[0]&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this._addHoverClass(),this._trigger("over",t,this.ui(e)))},_out:function(t){var e=V.ui.ddmanager.current;e&&(e.currentItem||e.element)[0]!==this.element[0]&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this._removeHoverClass(),this._trigger("out",t,this.ui(e)))},_drop:function(e,t){var i=t||V.ui.ddmanager.current,s=!1;return!(!i||(i.currentItem||i.element)[0]===this.element[0])&&(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var t=V(this).droppable("instance");if(t.options.greedy&&!t.options.disabled&&t.options.scope===i.options.scope&&t.accept.call(t.element[0],i.currentItem||i.element)&&V.ui.intersect(i,V.extend(t,{offset:t.element.offset()}),t.options.tolerance,e))return!(s=!0)}),!s&&(!!this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(i)),this.element)))},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}}),V.ui.intersect=function(t,e,i,s){if(!e.offset)return!1;var n=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,a=n+t.helperProportions.width,r=o+t.helperProportions.height,l=e.offset.left,h=e.offset.top,c=l+e.proportions().width,u=h+e.proportions().height;switch(i){case"fit":return l<=n&&a<=c&&h<=o&&r<=u;case"intersect":return l<n+t.helperProportions.width/2&&a-t.helperProportions.width/2<c&&h<o+t.helperProportions.height/2&&r-t.helperProportions.height/2<u;case"pointer":return lt(s.pageY,h,e.proportions().height)&&lt(s.pageX,l,e.proportions().width);case"touch":return(h<=o&&o<=u||h<=r&&r<=u||o<h&&u<r)&&(l<=n&&n<=c||l<=a&&a<=c||n<l&&c<a);default:return!1}},!(V.ui.ddmanager={current:null,droppables:{default:[]},prepareOffsets:function(t,e){var i,s,n=V.ui.ddmanager.droppables[t.options.scope]||[],o=e?e.type:null,a=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();t:for(i=0;i<n.length;i++)if(!(n[i].options.disabled||t&&!n[i].accept.call(n[i].element[0],t.currentItem||t.element))){for(s=0;s<a.length;s++)if(a[s]===n[i].element[0]){n[i].proportions().height=0;continue t}n[i].visible="none"!==n[i].element.css("display"),n[i].visible&&("mousedown"===o&&n[i]._activate.call(n[i],e),n[i].offset=n[i].element.offset(),n[i].proportions({width:n[i].element[0].offsetWidth,height:n[i].element[0].offsetHeight}))}},drop:function(t,e){var i=!1;return V.each((V.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&V.ui.intersect(t,this,this.options.tolerance,e)&&(i=this._drop.call(this,e)||i),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,e)))}),i},dragStart:function(t,e){t.element.parentsUntil("body").on("scroll.droppable",function(){t.options.refreshPositions||V.ui.ddmanager.prepareOffsets(t,e)})},drag:function(n,o){n.options.refreshPositions&&V.ui.ddmanager.prepareOffsets(n,o),V.each(V.ui.ddmanager.droppables[n.options.scope]||[],function(){var t,e,i,s;this.options.disabled||this.greedyChild||!this.visible||(s=!(i=V.ui.intersect(n,this,this.options.tolerance,o))&&this.isover?"isout":i&&!this.isover?"isover":null)&&(this.options.greedy&&(e=this.options.scope,(i=this.element.parents(":data(ui-droppable)").filter(function(){return V(this).droppable("instance").options.scope===e})).length&&((t=V(i[0]).droppable("instance")).greedyChild="isover"===s)),t&&"isover"===s&&(t.isover=!1,t.isout=!0,t._out.call(t,o)),this[s]=!0,this["isout"===s?"isover":"isout"]=!1,this["isover"===s?"_over":"_out"].call(this,o),t&&"isout"===s&&(t.isout=!1,t.isover=!0,t._over.call(t,o)))})},dragStop:function(t,e){t.element.parentsUntil("body").off("scroll.droppable"),t.options.refreshPositions||V.ui.ddmanager.prepareOffsets(t,e)}})!==V.uiBackCompat&&V.widget("ui.droppable",V.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}});V.ui.droppable,V.widget("ui.progressbar",{version:"1.13.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=V("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){if(void 0===t)return this.options.value;this.options.value=this._constrainedValue(t),this._refreshValue()},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=!1===t,"number"!=typeof t&&(t=0),!this.indeterminate&&Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,e=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).width(e.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,t===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=V("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),V.widget("ui.selectable",V.ui.mouse,{version:"1.13.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var i=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){i.elementPos=V(i.element[0]).offset(),i.selectees=V(i.options.filter,i.element[0]),i._addClass(i.selectees,"ui-selectee"),i.selectees.each(function(){var t=V(this),e=t.offset(),e={left:e.left-i.elementPos.left,top:e.top-i.elementPos.top};V.data(this,"selectable-item",{element:this,$element:t,left:e.left,top:e.top,right:e.left+t.outerWidth(),bottom:e.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=V("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(i){var s=this,t=this.options;this.opos=[i.pageX,i.pageY],this.elementPos=V(this.element[0]).offset(),this.options.disabled||(this.selectees=V(t.filter,this.element[0]),this._trigger("start",i),V(t.appendTo).append(this.helper),this.helper.css({left:i.pageX,top:i.pageY,width:0,height:0}),t.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var t=V.data(this,"selectable-item");t.startselected=!0,i.metaKey||i.ctrlKey||(s._removeClass(t.$element,"ui-selected"),t.selected=!1,s._addClass(t.$element,"ui-unselecting"),t.unselecting=!0,s._trigger("unselecting",i,{unselecting:t.element}))}),V(i.target).parents().addBack().each(function(){var t,e=V.data(this,"selectable-item");if(e)return t=!i.metaKey&&!i.ctrlKey||!e.$element.hasClass("ui-selected"),s._removeClass(e.$element,t?"ui-unselecting":"ui-selected")._addClass(e.$element,t?"ui-selecting":"ui-unselecting"),e.unselecting=!t,e.selecting=t,(e.selected=t)?s._trigger("selecting",i,{selecting:e.element}):s._trigger("unselecting",i,{unselecting:e.element}),!1}))},_mouseDrag:function(s){if(this.dragged=!0,!this.options.disabled){var t,n=this,o=this.options,a=this.opos[0],r=this.opos[1],l=s.pageX,h=s.pageY;return l<a&&(t=l,l=a,a=t),h<r&&(t=h,h=r,r=t),this.helper.css({left:a,top:r,width:l-a,height:h-r}),this.selectees.each(function(){var t=V.data(this,"selectable-item"),e=!1,i={};t&&t.element!==n.element[0]&&(i.left=t.left+n.elementPos.left,i.right=t.right+n.elementPos.left,i.top=t.top+n.elementPos.top,i.bottom=t.bottom+n.elementPos.top,"touch"===o.tolerance?e=!(i.left>l||i.right<a||i.top>h||i.bottom<r):"fit"===o.tolerance&&(e=i.left>a&&i.right<l&&i.top>r&&i.bottom<h),e?(t.selected&&(n._removeClass(t.$element,"ui-selected"),t.selected=!1),t.unselecting&&(n._removeClass(t.$element,"ui-unselecting"),t.unselecting=!1),t.selecting||(n._addClass(t.$element,"ui-selecting"),t.selecting=!0,n._trigger("selecting",s,{selecting:t.element}))):(t.selecting&&((s.metaKey||s.ctrlKey)&&t.startselected?(n._removeClass(t.$element,"ui-selecting"),t.selecting=!1,n._addClass(t.$element,"ui-selected"),t.selected=!0):(n._removeClass(t.$element,"ui-selecting"),t.selecting=!1,t.startselected&&(n._addClass(t.$element,"ui-unselecting"),t.unselecting=!0),n._trigger("unselecting",s,{unselecting:t.element}))),t.selected&&(s.metaKey||s.ctrlKey||t.startselected||(n._removeClass(t.$element,"ui-selected"),t.selected=!1,n._addClass(t.$element,"ui-unselecting"),t.unselecting=!0,n._trigger("unselecting",s,{unselecting:t.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,V(".ui-unselecting",this.element[0]).each(function(){var t=V.data(this,"selectable-item");i._removeClass(t.$element,"ui-unselecting"),t.unselecting=!1,t.startselected=!1,i._trigger("unselected",e,{unselected:t.element})}),V(".ui-selecting",this.element[0]).each(function(){var t=V.data(this,"selectable-item");i._removeClass(t.$element,"ui-selecting")._addClass(t.$element,"ui-selected"),t.selecting=!1,t.selected=!0,t.startselected=!0,i._trigger("selected",e,{selected:t.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),V.widget("ui.selectmenu",[V.ui.formResetMixin,{version:"1.13.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var t=this.element.uniqueId().attr("id");this.ids={element:t,button:t+"-button",menu:t+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=V()},_drawButton:function(){var t,e=this,i=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.trigger("focus"),t.preventDefault()}}),this.element.hide(),this.button=V("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),t=V("<span>").appendTo(this.button),this._addClass(t,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(i).appendTo(this.button),!1!==this.options.width&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){e._rendered||e._refreshMenu()})},_drawMenu:function(){var i=this;this.menu=V("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=V("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,e){t.preventDefault(),i._setSelection(),i._select(e.item.data("ui-selectmenu-item"),t)},focus:function(t,e){e=e.item.data("ui-selectmenu-item");null!=i.focusIndex&&e.index!==i.focusIndex&&(i._trigger("focus",t,{item:e}),i.isOpen||i._select(e,t)),i.focusIndex=e.index,i.button.attr("aria-activedescendant",i.menuItems.eq(e.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t=this.element.find("option");this.menu.empty(),this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,t.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(V.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(t){var e=V("<span>");return this._setText(e,t.label),this._addClass(e,"ui-selectmenu-text"),e},_renderMenu:function(s,t){var n=this,o="";V.each(t,function(t,e){var i;e.optgroup!==o&&(i=V("<li>",{text:e.optgroup}),n._addClass(i,"ui-selectmenu-optgroup","ui-menu-divider"+(e.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),i.appendTo(s),o=e.optgroup),n._renderItemData(s,e)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(t,e){var i=V("<li>"),s=V("<div>",{title:e.element.attr("title")});return e.disabled&&this._addClass(i,null,"ui-state-disabled"),this._setText(s,e.label),i.append(s).appendTo(t)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,s=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),s+=":not(.ui-state-disabled)"),(s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](s).eq(-1):i[t+"All"](s).eq(0)).length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?((t=window.getSelection()).removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(V(t.target).closest(".ui-selectmenu-menu, #"+V.escapeSelector(this.ids.button)).length||this.close(t))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection()).rangeCount&&(this.range=t.getRangeAt(0)):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(t){var e=!0;switch(t.keyCode){case V.ui.keyCode.TAB:case V.ui.keyCode.ESCAPE:this.close(t),e=!1;break;case V.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case V.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case V.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case V.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case V.ui.keyCode.LEFT:this._move("prev",t);break;case V.ui.keyCode.RIGHT:this._move("next",t);break;case V.ui.keyCode.HOME:case V.ui.keyCode.PAGE_UP:this._move("first",t);break;case V.ui.keyCode.END:case V.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),e=!1}e&&t.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){t=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(t,e){var i;"icons"===t&&(i=this.button.find("span.ui-icon"),this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)),this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?V(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;!1!==t?(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t)):this.button.css("width","")},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(t){var i=this,s=[];t.each(function(t,e){e.hidden||s.push(i._parseOption(V(e),t))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),V.widget("ui.slider",V.ui.mouse,{version:"1.13.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,e=this.options,i=this.element.find(".ui-slider-handle"),s=[],n=e.values&&e.values.length||1;for(i.length>n&&(i.slice(n).remove(),i=i.slice(0,n)),t=i.length;t<n;t++)s.push("<span tabindex='0'></span>");this.handles=i.add(V(s.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(t){V(this).data("ui-slider-handle-index",t).attr("tabIndex",0)})},_createRange:function(){var t=this.options;t.range?(!0===t.range&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:Array.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=V("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),"min"!==t.range&&"max"!==t.range||this._addClass(this.range,"ui-slider-range-"+t.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,o,e,a,r=this,l=this.options;return!l.disabled&&(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),a={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(a),s=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var e=Math.abs(i-r.values(t));(e<s||s===e&&(t===r._lastChangedValue||r.values(t)===l.min))&&(s=e,n=V(this),o=t)}),!1!==this._start(t,o)&&(this._mouseSliding=!0,this._handleIndex=o,this._addClass(n,null,"ui-state-active"),n.trigger("focus"),e=n.offset(),a=!V(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=a?{left:0,top:0}:{left:t.pageX-e.left-n.width()/2,top:t.pageY-e.top-n.height()/2-(parseInt(n.css("borderTopWidth"),10)||0)-(parseInt(n.css("borderBottomWidth"),10)||0)+(parseInt(n.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,i),this._animateOff=!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},e=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,e),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,t="horizontal"===this.orientation?(e=this.elementSize.width,t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),t=t/e;return(t=1<t?1:t)<0&&(t=0),"vertical"===this.orientation&&(t=1-t),e=this._valueMax()-this._valueMin(),e=this._valueMin()+t*e,this._trimAlignValue(e)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n=this.value(),o=this.values();this._hasMultipleValues()&&(s=this.values(e?0:1),n=this.values(e),2===this.options.values.length&&!0===this.options.range&&(i=0===e?Math.min(s,i):Math.max(s,i)),o[e]=i),i!==n&&!1!==this._trigger("slide",t,this._uiHash(e,i,o))&&(this._hasMultipleValues()?this.values(e,i):this.value(i))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),void this._change(null,0)):this._value()},values:function(t,e){var i,s,n;if(1<arguments.length)return this.options.values[t]=this._trimAlignValue(e),this._refreshValue(),void this._change(null,t);if(!arguments.length)return this._values();if(!Array.isArray(t))return this._hasMultipleValues()?this._values(t):this.value();for(i=this.options.values,s=t,n=0;n<i.length;n+=1)i[n]=this._trimAlignValue(s[n]),this._change(null,n);this._refreshValue()},_setOption:function(t,e){var i,s=0;switch("range"===t&&!0===this.options.range&&("min"===e?(this.options.value=this._values(0),this.options.values=null):"max"===e&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),Array.isArray(this.options.values)&&(s=this.options.values.length),this._super(t,e),t){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(e),this.handles.css("horizontal"===e?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),i=s-1;0<=i;i--)this._change(null,i);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i;if(arguments.length)return t=this.options.values[t],t=this._trimAlignValue(t);if(this._hasMultipleValues()){for(e=this.options.values.slice(),i=0;i<e.length;i+=1)e[i]=this._trimAlignValue(e[i]);return e}return[]},_trimAlignValue:function(t){if(t<=this._valueMin())return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=0<this.options.step?this.options.step:1,i=(t-this._valueMin())%e,t=t-i;return 2*Math.abs(i)>=e&&(t+=0<i?e:-e),parseFloat(t.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step;(t=Math.round((t-e)/i)*i+e)>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return t=null!==this.options.min?Math.max(t,this._precisionOf(this.options.min)):t},_precisionOf:function(t){var e=t.toString(),t=e.indexOf(".");return-1===t?0:e.length-t-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,t,s,n,o=this.options.range,a=this.options,r=this,l=!this._animateOff&&a.animate,h={};this._hasMultipleValues()?this.handles.each(function(t){i=(r.values(t)-r._valueMin())/(r._valueMax()-r._valueMin())*100,h["horizontal"===r.orientation?"left":"bottom"]=i+"%",V(this).stop(1,1)[l?"animate":"css"](h,a.animate),!0===r.options.range&&("horizontal"===r.orientation?(0===t&&r.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},a.animate),1===t&&r.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:a.animate})):(0===t&&r.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},a.animate),1===t&&r.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:a.animate}))),e=i}):(t=this.value(),s=this._valueMin(),n=this._valueMax(),i=n!==s?(t-s)/(n-s)*100:0,h["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](h,a.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},a.animate),"max"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},a.animate),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},a.animate),"max"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:100-i+"%"},a.animate))},_handleEvents:{keydown:function(t){var e,i,s,n=V(t.target).data("ui-slider-handle-index");switch(t.keyCode){case V.ui.keyCode.HOME:case V.ui.keyCode.END:case V.ui.keyCode.PAGE_UP:case V.ui.keyCode.PAGE_DOWN:case V.ui.keyCode.UP:case V.ui.keyCode.RIGHT:case V.ui.keyCode.DOWN:case V.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(V(t.target),null,"ui-state-active"),!1===this._start(t,n)))return}switch(s=this.options.step,e=i=this._hasMultipleValues()?this.values(n):this.value(),t.keyCode){case V.ui.keyCode.HOME:i=this._valueMin();break;case V.ui.keyCode.END:i=this._valueMax();break;case V.ui.keyCode.PAGE_UP:i=this._trimAlignValue(e+(this._valueMax()-this._valueMin())/this.numPages);break;case V.ui.keyCode.PAGE_DOWN:i=this._trimAlignValue(e-(this._valueMax()-this._valueMin())/this.numPages);break;case V.ui.keyCode.UP:case V.ui.keyCode.RIGHT:if(e===this._valueMax())return;i=this._trimAlignValue(e+s);break;case V.ui.keyCode.DOWN:case V.ui.keyCode.LEFT:if(e===this._valueMin())return;i=this._trimAlignValue(e-s)}this._slide(t,n,i)},keyup:function(t){var e=V(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,e),this._change(t,e),this._removeClass(V(t.target),null,"ui-state-active"))}}}),V.widget("ui.sortable",V.ui.mouse,{version:"1.13.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return e<=t&&t<e+i},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var t=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),V.each(this.items,function(){t._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;0<=t;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,e){var i=null,s=!1,n=this;return!this.reverting&&(!this.options.disabled&&"static"!==this.options.type&&(this._refreshItems(t),V(t.target).parents().each(function(){if(V.data(this,n.widgetName+"-item")===n)return i=V(this),!1}),!!(i=V.data(t.target,n.widgetName+"-item")===n?V(t.target):i)&&(!(this.options.handle&&!e&&(V(this.options.handle,i).find("*").addBack().each(function(){this===t.target&&(s=!0)}),!s))&&(this.currentItem=i,this._removeCurrentsFromItems(),!0))))},_mouseStart:function(t,e,i){var s,n,o=this.options;if((this.currentContainer=this).refreshPositions(),this.appendTo=V("parent"!==o.appendTo?o.appendTo:this.currentItem.parent()),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},V.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),this.scrollParent=this.placeholder.scrollParent(),V.extend(this.offset,{parent:this._getParentOffset()}),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(n=this.document.find("body"),this.storedCursor=n.css("cursor"),n.css("cursor",o.cursor),this.storedStylesheet=V("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(n)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!i)for(s=this.containers.length-1;0<=s;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return V.ui.ddmanager&&(V.ui.ddmanager.current=this),V.ui.ddmanager&&!o.dropBehaviour&&V.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this.helper.parent().is(this.appendTo)||(this.helper.detach().appendTo(this.appendTo),this.offset.parent=this._getParentOffset()),this.position=this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,this.lastPositionAbs=this.positionAbs=this._convertPositionTo("absolute"),this._mouseDrag(t),!0},_scroll:function(t){var e=this.options,i=!1;return this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<e.scrollSensitivity?this.scrollParent[0].scrollTop=i=this.scrollParent[0].scrollTop+e.scrollSpeed:t.pageY-this.overflowOffset.top<e.scrollSensitivity&&(this.scrollParent[0].scrollTop=i=this.scrollParent[0].scrollTop-e.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<e.scrollSensitivity?this.scrollParent[0].scrollLeft=i=this.scrollParent[0].scrollLeft+e.scrollSpeed:t.pageX-this.overflowOffset.left<e.scrollSensitivity&&(this.scrollParent[0].scrollLeft=i=this.scrollParent[0].scrollLeft-e.scrollSpeed)):(t.pageY-this.document.scrollTop()<e.scrollSensitivity?i=this.document.scrollTop(this.document.scrollTop()-e.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<e.scrollSensitivity&&(i=this.document.scrollTop(this.document.scrollTop()+e.scrollSpeed)),t.pageX-this.document.scrollLeft()<e.scrollSensitivity?i=this.document.scrollLeft(this.document.scrollLeft()-e.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<e.scrollSensitivity&&(i=this.document.scrollLeft(this.document.scrollLeft()+e.scrollSpeed))),i},_mouseDrag:function(t){var e,i,s,n,o=this.options;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),o.scroll&&!1!==this._scroll(t)&&(this._refreshItemPositions(!0),V.ui.ddmanager&&!o.dropBehaviour&&V.ui.ddmanager.prepareOffsets(this,t)),this.dragDirection={vertical:this._getDragVerticalDirection(),horizontal:this._getDragHorizontalDirection()},e=this.items.length-1;0<=e;e--)if(s=(i=this.items[e]).item[0],(n=this._intersectsWithPointer(i))&&i.instance===this.currentContainer&&!(s===this.currentItem[0]||this.placeholder[1===n?"next":"prev"]()[0]===s||V.contains(this.placeholder[0],s)||"semi-dynamic"===this.options.type&&V.contains(this.element[0],s))){if(this.direction=1===n?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(i))break;this._rearrange(t,i),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),V.ui.ddmanager&&V.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,e){var i,s,n,o;if(t)return V.ui.ddmanager&&!this.options.dropBehaviour&&V.ui.ddmanager.drop(this,t),this.options.revert?(s=(i=this).placeholder.offset(),o={},(n=this.options.axis)&&"x"!==n||(o.left=s.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),n&&"y"!==n||(o.top=s.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,V(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){i._clear(t)})):this._clear(t,e),!1},cancel:function(){if(this.dragging){this._mouseUp(new V.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var t=this.containers.length-1;0<=t;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),V.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?V(this.domPosition.prev).after(this.currentItem):V(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var t=this._getItemsAsjQuery(e&&e.connected),i=[];return e=e||{},V(t).each(function(){var t=(V(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);t&&i.push((e.key||t[1]+"[]")+"="+(e.key&&e.expression?t[1]:t[2]))}),!i.length&&e.key&&i.push(e.key+"="),i.join("&")},toArray:function(t){var e=this._getItemsAsjQuery(t&&t.connected),i=[];return t=t||{},e.each(function(){i.push(V(t.item||this).attr(t.attribute||"id")||"")}),i},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,h="x"===this.options.axis||r<s+h&&s+h<l,c="y"===this.options.axis||o<e+c&&e+c<a;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?h&&c:o<e+this.helperProportions.width/2&&i-this.helperProportions.width/2<a&&r<s+this.helperProportions.height/2&&n-this.helperProportions.height/2<l},_intersectsWithPointer:function(t){var e="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),t="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width);return!(!e||!t)&&(e=this.dragDirection.vertical,t=this.dragDirection.horizontal,this.floating?"right"===t||"down"===e?2:1:e&&("down"===e?2:1))},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this.dragDirection.vertical,t=this.dragDirection.horizontal;return this.floating&&t?"right"===t&&i||"left"===t&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!=t&&(0<t?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!=t&&(0<t?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(t){var e,i,s,n,o=[],a=[],r=this._connectWith();if(r&&t)for(e=r.length-1;0<=e;e--)for(i=(s=V(r[e],this.document[0])).length-1;0<=i;i--)(n=V.data(s[i],this.widgetFullName))&&n!==this&&!n.options.disabled&&a.push(["function"==typeof n.options.items?n.options.items.call(n.element):V(n.options.items,n.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),n]);function l(){o.push(this)}for(a.push(["function"==typeof this.options.items?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):V(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),e=a.length-1;0<=e;e--)a[e][0].each(l);return V(o)},_removeCurrentsFromItems:function(){var i=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=V.grep(this.items,function(t){for(var e=0;e<i.length;e++)if(i[e]===t.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var e,i,s,n,o,a,r,l,h=this.items,c=[["function"==typeof this.options.items?this.options.items.call(this.element[0],t,{item:this.currentItem}):V(this.options.items,this.element),this]],u=this._connectWith();if(u&&this.ready)for(e=u.length-1;0<=e;e--)for(i=(s=V(u[e],this.document[0])).length-1;0<=i;i--)(n=V.data(s[i],this.widgetFullName))&&n!==this&&!n.options.disabled&&(c.push(["function"==typeof n.options.items?n.options.items.call(n.element[0],t,{item:this.currentItem}):V(n.options.items,n.element),n]),this.containers.push(n));for(e=c.length-1;0<=e;e--)for(o=c[e][1],l=(a=c[e][i=0]).length;i<l;i++)(r=V(a[i])).data(this.widgetName+"-item",o),h.push({item:r,instance:o,width:0,height:0,left:0,top:0})},_refreshItemPositions:function(t){for(var e,i,s=this.items.length-1;0<=s;s--)e=this.items[s],this.currentContainer&&e.instance!==this.currentContainer&&e.item[0]!==this.currentItem[0]||(i=this.options.toleranceElement?V(this.options.toleranceElement,e.item):e.item,t||(e.width=i.outerWidth(),e.height=i.outerHeight()),i=i.offset(),e.left=i.left,e.top=i.top)},refreshPositions:function(t){var e,i;if(this.floating=!!this.items.length&&("x"===this.options.axis||this._isFloating(this.items[0].item)),this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset()),this._refreshItemPositions(t),this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(e=this.containers.length-1;0<=e;e--)i=this.containers[e].element.offset(),this.containers[e].containerCache.left=i.left,this.containers[e].containerCache.top=i.top,this.containers[e].containerCache.width=this.containers[e].element.outerWidth(),this.containers[e].containerCache.height=this.containers[e].element.outerHeight();return this},_createPlaceholder:function(i){var s,n,o=(i=i||this).options;o.placeholder&&o.placeholder.constructor!==String||(s=o.placeholder,n=i.currentItem[0].nodeName.toLowerCase(),o.placeholder={element:function(){var t=V("<"+n+">",i.document[0]);return i._addClass(t,"ui-sortable-placeholder",s||i.currentItem[0].className)._removeClass(t,"ui-sortable-helper"),"tbody"===n?i._createTrPlaceholder(i.currentItem.find("tr").eq(0),V("<tr>",i.document[0]).appendTo(t)):"tr"===n?i._createTrPlaceholder(i.currentItem,t):"img"===n&&t.attr("src",i.currentItem.attr("src")),s||t.css("visibility","hidden"),t},update:function(t,e){s&&!o.forcePlaceholderSize||(e.height()&&(!o.forcePlaceholderSize||"tbody"!==n&&"tr"!==n)||e.height(i.currentItem.innerHeight()-parseInt(i.currentItem.css("paddingTop")||0,10)-parseInt(i.currentItem.css("paddingBottom")||0,10)),e.width()||e.width(i.currentItem.innerWidth()-parseInt(i.currentItem.css("paddingLeft")||0,10)-parseInt(i.currentItem.css("paddingRight")||0,10)))}}),i.placeholder=V(o.placeholder.element.call(i.element,i.currentItem)),i.currentItem.after(i.placeholder),o.placeholder.update(i,i.placeholder)},_createTrPlaceholder:function(t,e){var i=this;t.children().each(function(){V("<td>&#160;</td>",i.document[0]).attr("colspan",V(this).attr("colspan")||1).appendTo(e)})},_contactContainers:function(t){for(var e,i,s,n,o,a,r,l,h,c=null,u=null,d=this.containers.length-1;0<=d;d--)V.contains(this.currentItem[0],this.containers[d].element[0])||(this._intersectsWith(this.containers[d].containerCache)?c&&V.contains(this.containers[d].element[0],c.element[0])||(c=this.containers[d],u=d):this.containers[d].containerCache.over&&(this.containers[d]._trigger("out",t,this._uiHash(this)),this.containers[d].containerCache.over=0));if(c)if(1===this.containers.length)this.containers[u].containerCache.over||(this.containers[u]._trigger("over",t,this._uiHash(this)),this.containers[u].containerCache.over=1);else{for(i=1e4,s=null,n=(l=c.floating||this._isFloating(this.currentItem))?"left":"top",o=l?"width":"height",h=l?"pageX":"pageY",e=this.items.length-1;0<=e;e--)V.contains(this.containers[u].element[0],this.items[e].item[0])&&this.items[e].item[0]!==this.currentItem[0]&&(a=this.items[e].item.offset()[n],r=!1,t[h]-a>this.items[e][o]/2&&(r=!0),Math.abs(t[h]-a)<i&&(i=Math.abs(t[h]-a),s=this.items[e],this.direction=r?"up":"down"));(s||this.options.dropOnEmpty)&&(this.currentContainer!==this.containers[u]?(s?this._rearrange(t,s,null,!0):this._rearrange(t,null,this.containers[u].element,!0),this._trigger("change",t,this._uiHash()),this.containers[u]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[u],this.options.placeholder.update(this.currentContainer,this.placeholder),this.scrollParent=this.placeholder.scrollParent(),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this.containers[u]._trigger("over",t,this._uiHash(this)),this.containers[u].containerCache.over=1):this.currentContainer.containerCache.over||(this.containers[u]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1))}},_createHelper:function(t){var e=this.options,t="function"==typeof e.helper?V(e.helper.apply(this.element[0],[t,this.currentItem])):"clone"===e.helper?this.currentItem.clone():this.currentItem;return t.parents("body").length||this.appendTo[0].appendChild(t[0]),t[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),t[0].style.width&&!e.forceHelperSize||t.width(this.currentItem.width()),t[0].style.height&&!e.forceHelperSize||t.height(this.currentItem.height()),t},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),"left"in(t=Array.isArray(t)?{left:+t[0],top:+t[1]||0}:t)&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&V.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),{top:(t=this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&V.ui.ie?{top:0,left:0}:t).top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,e,i=this.options;"parent"===i.containment&&(i.containment=this.helper[0].parentNode),"document"!==i.containment&&"window"!==i.containment||(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===i.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===i.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(i.containment)||(t=V(i.containment)[0],e=V(i.containment).offset(),i="hidden"!==V(t).css("overflow"),this.containment=[e.left+(parseInt(V(t).css("borderLeftWidth"),10)||0)+(parseInt(V(t).css("paddingLeft"),10)||0)-this.margins.left,e.top+(parseInt(V(t).css("borderTopWidth"),10)||0)+(parseInt(V(t).css("paddingTop"),10)||0)-this.margins.top,e.left+(i?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(V(t).css("borderLeftWidth"),10)||0)-(parseInt(V(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,e.top+(i?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(V(t).css("borderTopWidth"),10)||0)-(parseInt(V(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,e){e=e||this.position;var i="absolute"===t?1:-1,s="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&V.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,t=/(html|body)/i.test(s[0].tagName);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():t?0:s.scrollTop())*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():t?0:s.scrollLeft())*i}},_generatePosition:function(t){var e=this.options,i=t.pageX,s=t.pageY,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&V.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(i=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(s=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(i=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(s=this.containment[3]+this.offset.click.top)),e.grid&&(t=this.originalPageY+Math.round((s-this.originalPageY)/e.grid[1])*e.grid[1],s=!this.containment||t-this.offset.click.top>=this.containment[1]&&t-this.offset.click.top<=this.containment[3]?t:t-this.offset.click.top>=this.containment[1]?t-e.grid[1]:t+e.grid[1],t=this.originalPageX+Math.round((i-this.originalPageX)/e.grid[0])*e.grid[0],i=!this.containment||t-this.offset.click.left>=this.containment[0]&&t-this.offset.click.left<=this.containment[2]?t:t-this.offset.click.left>=this.containment[0]?t-e.grid[0]:t+e.grid[0])),{top:s-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop()),left:i-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)"auto"!==this._storedCSS[i]&&"static"!==this._storedCSS[i]||(this._storedCSS[i]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();function n(e,i,s){return function(t){s._trigger(e,t,i._uiHash(i))}}for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;0<=i;i--)e||s.push(n("deactivate",this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(n("out",this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(i=0;i<s.length;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){!1===V.Widget.prototype._trigger.apply(this,arguments)&&this.cancel()},_uiHash:function(t){var e=t||this;return{helper:e.helper,placeholder:e.placeholder||V([]),position:e.position,originalPosition:e.originalPosition,offset:e.positionAbs,item:e.currentItem,sender:t?t.element:null}}});function ht(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}V.widget("ui.spinner",{version:"1.13.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var s=this._super(),n=this.element;return V.each(["min","max","step"],function(t,e){var i=n.attr(e);null!=i&&i.length&&(s[e]=i)}),s},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){this.cancelBlur?delete this.cancelBlur:(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t))},mousewheel:function(t,e){var i=V.ui.safeActiveElement(this.document[0]);if(this.element[0]===i&&e){if(!this.spinning&&!this._start(t))return!1;this._spin((0<e?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(t){var e;function i(){this.element[0]===V.ui.safeActiveElement(this.document[0])||(this.element.trigger("focus"),this.previous=e,this._delay(function(){this.previous=e}))}e=this.element[0]===V.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),!1!==this._start(t)&&this._repeat(null,V(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){if(V(t.currentTarget).hasClass("ui-state-active"))return!1!==this._start(t)&&void this._repeat(null,V(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&0<this.uiSpinner.height()&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(t){var e=this.options,i=V.ui.keyCode;switch(t.keyCode){case i.UP:return this._repeat(null,1,t),!0;case i.DOWN:return this._repeat(null,-1,t),!0;case i.PAGE_UP:return this._repeat(null,e.page,t),!0;case i.PAGE_DOWN:return this._repeat(null,-e.page,t),!0}return!1},_start:function(t){return!(!this.spinning&&!1===this._trigger("start",t))&&(this.counter||(this.counter=1),this.spinning=!0)},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&!1===this._trigger("spin",e,{value:i})||(this._value(i),this.counter++)},_increment:function(t){var e=this.options.incremental;return e?"function"==typeof e?e(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return t=null!==this.options.min?Math.max(t,this._precisionOf(this.options.min)):t},_precisionOf:function(t){var e=t.toString(),t=e.indexOf(".");return-1===t?0:e.length-t-1},_adjustValue:function(t){var e=this.options,i=null!==e.min?e.min:0,s=t-i;return t=i+Math.round(s/e.step)*e.step,t=parseFloat(t.toFixed(this._precision())),null!==e.max&&t>e.max?e.max:null!==e.min&&t<e.min?e.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i;if("culture"===t||"numberFormat"===t)return i=this._parse(this.element.val()),this.options[t]=e,void this.element.val(this._format(i));"max"!==t&&"min"!==t&&"step"!==t||"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(i=this.buttons.first().find(".ui-icon"),this._removeClass(i,null,this.options.icons.up),this._addClass(i,null,e.up),i=this.buttons.last().find(".ui-icon"),this._removeClass(i,null,this.options.icons.down),this._addClass(i,null,e.down)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:ht(function(t){this._super(t)}),_parse:function(t){return""===(t="string"==typeof t&&""!==t?window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t:t)||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null!==t&&t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&null!==(i=this._parse(t))&&(e||(i=this._adjustValue(i)),t=this._format(i)),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:ht(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:ht(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:ht(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:ht(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){if(!arguments.length)return this._parse(this.element.val());ht(this._value).call(this,t)},widget:function(){return this.uiSpinner}}),!1!==V.uiBackCompat&&V.widget("ui.spinner",V.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}});var ct;V.ui.spinner;V.widget("ui.tabs",{version:"1.13.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:(ct=/#.*$/,function(t){var e=t.href.replace(ct,""),i=location.href.replace(ct,"");try{e=decodeURIComponent(e)}catch(t){}try{i=decodeURIComponent(i)}catch(t){}return 1<t.hash.length&&e===i}),_create:function(){var e=this,t=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,t.collapsible),this._processTabs(),t.active=this._initialActive(),Array.isArray(t.disabled)&&(t.disabled=V.uniqueSort(t.disabled.concat(V.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),!1!==this.options.active&&this.anchors.length?this.active=this._findActive(t.active):this.active=V(),this._refresh(),this.active.length&&this.load(t.active)},_initialActive:function(){var i=this.options.active,t=this.options.collapsible,s=location.hash.substring(1);return null===i&&(s&&this.tabs.each(function(t,e){if(V(e).attr("aria-controls")===s)return i=t,!1}),null!==(i=null===i?this.tabs.index(this.tabs.filter(".ui-tabs-active")):i)&&-1!==i||(i=!!this.tabs.length&&0)),!1!==i&&-1===(i=this.tabs.index(this.tabs.eq(i)))&&(i=!t&&0),i=!t&&!1===i&&this.anchors.length?0:i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):V()}},_tabKeydown:function(t){var e=V(V.ui.safeActiveElement(this.document[0])).closest("li"),i=this.tabs.index(e),s=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case V.ui.keyCode.RIGHT:case V.ui.keyCode.DOWN:i++;break;case V.ui.keyCode.UP:case V.ui.keyCode.LEFT:s=!1,i--;break;case V.ui.keyCode.END:i=this.anchors.length-1;break;case V.ui.keyCode.HOME:i=0;break;case V.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),void this._activate(i);case V.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),void this._activate(i!==this.options.active&&i);default:return}t.preventDefault(),clearTimeout(this.activating),i=this._focusNextTab(i,s),t.ctrlKey||t.metaKey||(e.attr("aria-selected","false"),this.tabs.eq(i).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",i)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===V.ui.keyCode.UP&&(t.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(t){return t.altKey&&t.keyCode===V.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===V.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,e){var i=this.tabs.length-1;for(;-1!==V.inArray(t=(t=i<t?0:t)<0?i:t,this.options.disabled);)t=e?t+1:t-1;return t},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){"active"!==t?(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||!1!==this.options.active||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e)):this._activate(e)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,e=this.tablist.children(":has(a[href])");t.disabled=V.map(e.filter(".ui-state-disabled"),function(t){return e.index(t)}),this._processTabs(),!1!==t.active&&this.anchors.length?this.active.length&&!V.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=V()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=V()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var l=this,t=this.tabs,e=this.anchors,i=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(t){V(this).is(".ui-state-disabled")&&t.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){V(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return V("a",this)[0]}).attr({tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=V(),this.anchors.each(function(t,e){var i,s,n,o=V(e).uniqueId().attr("id"),a=V(e).closest("li"),r=a.attr("aria-controls");l._isLocal(e)?(n=(i=e.hash).substring(1),s=l.element.find(l._sanitizeSelector(i))):(n=a.attr("aria-controls")||V({}).uniqueId()[0].id,(s=l.element.find(i="#"+n)).length||(s=l._createPanel(n)).insertAfter(l.panels[t-1]||l.tablist),s.attr("aria-live","polite")),s.length&&(l.panels=l.panels.add(s)),r&&a.data("ui-tabs-aria-controls",r),a.attr({"aria-controls":n,"aria-labelledby":o}),s.attr("aria-labelledby",o)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),t&&(this._off(t.not(this.tabs)),this._off(e.not(this.anchors)),this._off(i.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(t){return V("<div>").attr("id",t).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(t){var e,i;for(Array.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1),i=0;e=this.tabs[i];i++)e=V(e),!0===t||-1!==V.inArray(i,t)?(e.attr("aria-disabled","true"),this._addClass(e,null,"ui-state-disabled")):(e.removeAttr("aria-disabled"),this._removeClass(e,null,"ui-state-disabled"));this.options.disabled=t,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!0===t)},_setupEvents:function(t){var i={};t&&V.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,e=this.element.parent();"fill"===t?(i=e.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=V(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=V(this).outerHeight(!0)}),this.panels.each(function(){V(this).height(Math.max(0,i-V(this).innerHeight()+V(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,V(this).height("").height())}).height(i))},_eventHandler:function(t){var e=this.options,i=this.active,s=V(t.currentTarget).closest("li"),n=s[0]===i[0],o=n&&e.collapsible,a=o?V():this._getPanelForTab(s),r=i.length?this._getPanelForTab(i):V(),i={oldTab:i,oldPanel:r,newTab:o?V():s,newPanel:a};t.preventDefault(),s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||n&&!e.collapsible||!1===this._trigger("beforeActivate",t,i)||(e.active=!o&&this.tabs.index(s),this.active=n?V():s,this.xhr&&this.xhr.abort(),r.length||a.length||V.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,i))},_toggle:function(t,e){var i=this,s=e.newPanel,n=e.oldPanel;function o(){i.running=!1,i._trigger("activate",t,e)}function a(){i._addClass(e.newTab.closest("li"),"ui-tabs-active","ui-state-active"),s.length&&i.options.show?i._show(s,i.options.show,o):(s.show(),o())}this.running=!0,n.length&&this.options.hide?this._hide(n,this.options.hide,function(){i._removeClass(e.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),a()}):(this._removeClass(e.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n.hide(),a()),n.attr("aria-hidden","true"),e.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),s.length&&n.length?e.oldTab.attr("tabIndex",-1):s.length&&this.tabs.filter(function(){return 0===V(this).attr("tabIndex")}).attr("tabIndex",-1),s.attr("aria-hidden","false"),e.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var t=this._findActive(t);t[0]!==this.active[0]&&(t=(t=!t.length?this.active:t).find(".ui-tabs-anchor")[0],this._eventHandler({target:t,currentTarget:t,preventDefault:V.noop}))},_findActive:function(t){return!1===t?V():this.tabs.eq(t)},_getIndex:function(t){return t="string"==typeof t?this.anchors.index(this.anchors.filter("[href$='"+V.escapeSelector(t)+"']")):t},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){V.data(this,"ui-tabs-destroy")?V(this).remove():V(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var t=V(this),e=t.data("ui-tabs-aria-controls");e?t.attr("aria-controls",e).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var t=this.options.disabled;!1!==t&&(t=void 0!==i&&(i=this._getIndex(i),Array.isArray(t)?V.map(t,function(t){return t!==i?t:null}):V.map(this.tabs,function(t,e){return e!==i?e:null})),this._setOptionDisabled(t))},disable:function(t){var e=this.options.disabled;if(!0!==e){if(void 0===t)e=!0;else{if(t=this._getIndex(t),-1!==V.inArray(t,e))return;e=Array.isArray(e)?V.merge([t],e).sort():[t]}this._setOptionDisabled(e)}},load:function(t,s){t=this._getIndex(t);function n(t,e){"abort"===e&&o.panels.stop(!1,!0),o._removeClass(i,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===o.xhr&&delete o.xhr}var o=this,i=this.tabs.eq(t),t=i.find(".ui-tabs-anchor"),a=this._getPanelForTab(i),r={tab:i,panel:a};this._isLocal(t[0])||(this.xhr=V.ajax(this._ajaxSettings(t,s,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(i,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,i){setTimeout(function(){a.html(t),o._trigger("load",s,r),n(i,e)},1)}).fail(function(t,e){setTimeout(function(){n(t,e)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href").replace(/#.*$/,""),beforeSend:function(t,e){return n._trigger("beforeLoad",i,V.extend({jqXHR:t,ajaxSettings:e},s))}}},_getPanelForTab:function(t){t=V(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+t))}}),!1!==V.uiBackCompat&&V.widget("ui.tabs",V.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}});V.ui.tabs;V.widget("ui.tooltip",{version:"1.13.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var t=V(this).attr("title");return V("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(t,e){var i=(t.attr("aria-describedby")||"").split(/\s+/);i.push(e),t.data("ui-tooltip-id",e).attr("aria-describedby",String.prototype.trim.call(i.join(" ")))},_removeDescribedBy:function(t){var e=t.data("ui-tooltip-id"),i=(t.attr("aria-describedby")||"").split(/\s+/),e=V.inArray(e,i);-1!==e&&i.splice(e,1),t.removeData("ui-tooltip-id"),(i=String.prototype.trim.call(i.join(" ")))?t.attr("aria-describedby",i):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=V("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=V([])},_setOption:function(t,e){var i=this;this._super(t,e),"content"===t&&V.each(this.tooltips,function(t,e){i._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var s=this;V.each(this.tooltips,function(t,e){var i=V.Event("blur");i.target=i.currentTarget=e.element[0],s.close(i,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var t=V(this);if(t.is("[title]"))return t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")}))},_enable:function(){this.disabledTitles.each(function(){var t=V(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))}),this.disabledTitles=V([])},open:function(t){var i=this,e=V(t?t.target:this.element).closest(this.options.items);e.length&&!e.data("ui-tooltip-id")&&(e.attr("title")&&e.data("ui-tooltip-title",e.attr("title")),e.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&e.parents().each(function(){var t,e=V(this);e.data("ui-tooltip-open")&&((t=V.Event("blur")).target=t.currentTarget=this,i.close(t,!0)),e.attr("title")&&(e.uniqueId(),i.parents[this.id]={element:this,title:e.attr("title")},e.attr("title",""))}),this._registerCloseHandlers(t,e),this._updateContent(e,t))},_updateContent:function(e,i){var t=this.options.content,s=this,n=i?i.type:null;if("string"==typeof t||t.nodeType||t.jquery)return this._open(i,e,t);(t=t.call(e[0],function(t){s._delay(function(){e.data("ui-tooltip-open")&&(i&&(i.type=n),this._open(i,e,t))})}))&&this._open(i,e,t)},_open:function(t,e,i){var s,n,o,a=V.extend({},this.options.position);function r(t){a.of=t,n.is(":hidden")||n.position(a)}i&&((s=this._find(e))?s.tooltip.find(".ui-tooltip-content").html(i):(e.is("[title]")&&(t&&"mouseover"===t.type?e.attr("title",""):e.removeAttr("title")),s=this._tooltip(e),n=s.tooltip,this._addDescribedBy(e,n.attr("id")),n.find(".ui-tooltip-content").html(i),this.liveRegion.children().hide(),(i=V("<div>").html(n.find(".ui-tooltip-content").html())).removeAttr("name").find("[name]").removeAttr("name"),i.removeAttr("id").find("[id]").removeAttr("id"),i.appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:r}),r(t)):n.position(V.extend({of:e},this.options.position)),n.hide(),this._show(n,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(o=this.delayedShow=setInterval(function(){n.is(":visible")&&(r(a.of),clearInterval(o))},13)),this._trigger("open",t,{tooltip:n})))},_registerCloseHandlers:function(t,e){var i={keyup:function(t){t.keyCode===V.ui.keyCode.ESCAPE&&((t=V.Event(t)).currentTarget=e[0],this.close(t,!0))}};e[0]!==this.element[0]&&(i.remove=function(){var t=this._find(e);t&&this._removeTooltip(t.tooltip)}),t&&"mouseover"!==t.type||(i.mouseleave="close"),t&&"focusin"!==t.type||(i.focusout="close"),this._on(!0,e,i)},close:function(t){var e,i=this,s=V(t?t.currentTarget:this.element),n=this._find(s);n?(e=n.tooltip,n.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),n.hiding=!0,e.stop(!0),this._hide(e,this.options.hide,function(){i._removeTooltip(V(this))}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&V.each(this.parents,function(t,e){V(e.element).attr("title",e.title),delete i.parents[t]}),n.closing=!0,this._trigger("close",t,{tooltip:e}),n.hiding||(n.closing=!1))):s.removeData("ui-tooltip-open")},_tooltip:function(t){var e=V("<div>").attr("role","tooltip"),i=V("<div>").appendTo(e),s=e.uniqueId().attr("id");return this._addClass(i,"ui-tooltip-content"),this._addClass(e,"ui-tooltip","ui-widget ui-widget-content"),e.appendTo(this._appendTo(t)),this.tooltips[s]={element:t,tooltip:e}},_find:function(t){t=t.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(t){clearInterval(this.delayedShow),t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){t=t.closest(".ui-front, dialog");return t=!t.length?this.document[0].body:t},_destroy:function(){var s=this;V.each(this.tooltips,function(t,e){var i=V.Event("blur"),e=e.element;i.target=i.currentTarget=e[0],s.close(i,!0),V("#"+t).remove(),e.data("ui-tooltip-title")&&(e.attr("title")||e.attr("title",e.data("ui-tooltip-title")),e.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),!1!==V.uiBackCompat&&V.widget("ui.tooltip",V.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}});V.ui.tooltip}); \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.css b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.css
deleted file mode 100644
index f433f8ca..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.css
+++ /dev/null
@@ -1,886 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.13.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/theming/
- */
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- -ms-filter: "alpha(opacity=0)"; /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
- pointer-events: none;
-}
-
-
-/* Icons
-----------------------------------*/
-.ui-icon {
- display: inline-block;
- vertical-align: middle;
- margin-top: -.25em;
- position: relative;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-.ui-widget-icon-block {
- left: 50%;
- margin-left: -8px;
- display: block;
-}
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: 0;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- margin: 0;
- cursor: pointer;
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-item-wrapper {
- position: relative;
- padding: 3px 1em 3px .4em;
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item-wrapper {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-button {
- padding: .4em 1em;
- display: inline-block;
- position: relative;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- /* Support: IE <= 11 */
- overflow: visible;
-}
-
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2em;
- box-sizing: border-box;
- text-indent: -9999px;
- white-space: nowrap;
-}
-
-/* no icon support for input elements */
-input.ui-button.ui-button-icon-only {
- text-indent: 0;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon {
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -8px;
- margin-left: -8px;
-}
-
-.ui-button.ui-icon-notext .ui-icon {
- padding: 0;
- width: 2.1em;
- height: 2.1em;
- text-indent: -9999px;
- white-space: nowrap;
-
-}
-
-input.ui-button.ui-icon-notext .ui-icon {
- width: auto;
- height: auto;
- text-indent: 0;
- white-space: normal;
- padding: .4em 1em;
-}
-
-/* workarounds */
-/* Support: Firefox 5 - 40 */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-controlgroup {
- vertical-align: middle;
- display: inline-block;
-}
-.ui-controlgroup > .ui-controlgroup-item {
- float: left;
- margin-left: 0;
- margin-right: 0;
-}
-.ui-controlgroup > .ui-controlgroup-item:focus,
-.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
- z-index: 9999;
-}
-.ui-controlgroup-vertical > .ui-controlgroup-item {
- display: block;
- float: none;
- width: 100%;
- margin-top: 0;
- margin-bottom: 0;
- text-align: left;
-}
-.ui-controlgroup-vertical .ui-controlgroup-item {
- box-sizing: border-box;
-}
-.ui-controlgroup .ui-controlgroup-label {
- padding: .4em 1em;
-}
-.ui-controlgroup .ui-controlgroup-label span {
- font-size: 80%;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
- border-left: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
- border-top: none;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
- border-right: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
- border-bottom: none;
-}
-
-/* Spinner specific style fixes */
-.ui-controlgroup-vertical .ui-spinner-input {
-
- /* Support: IE8 only, Android < 4.4 only */
- width: 75%;
- width: calc( 100% - 2.4em );
-}
-.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
- border-top-style: solid;
-}
-
-.ui-checkboxradio-label .ui-icon-background {
- box-shadow: inset 1px 1px 1px #ccc;
- border-radius: .12em;
- border: none;
-}
-.ui-checkboxradio-radio-label .ui-icon-background {
- width: 16px;
- height: 16px;
- border-radius: 1em;
- overflow: visible;
- border: none;
-}
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
- background-image: none;
- width: 8px;
- height: 8px;
- border-width: 4px;
- border-style: solid;
-}
-.ui-checkboxradio-disabled {
- pointer-events: none;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-
-/* Icons */
-.ui-datepicker .ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
- left: .5em;
- top: .3em;
-}
-.ui-dialog {
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-n {
- height: 2px;
- top: 0;
-}
-.ui-dialog .ui-resizable-e {
- width: 2px;
- right: 0;
-}
-.ui-dialog .ui-resizable-s {
- height: 2px;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-w {
- width: 2px;
- left: 0;
-}
-.ui-dialog .ui-resizable-se,
-.ui-dialog .ui-resizable-sw,
-.ui-dialog .ui-resizable-ne,
-.ui-dialog .ui-resizable-nw {
- width: 7px;
- height: 7px;
-}
-.ui-dialog .ui-resizable-se {
- right: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-sw {
- left: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-ne {
- right: 0;
- top: 0;
-}
-.ui-dialog .ui-resizable-nw {
- left: 0;
- top: 0;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- -ms-filter: "alpha(opacity=25)"; /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-text {
- display: block;
- margin-right: 20px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-selectmenu-button.ui-button {
- text-align: left;
- white-space: nowrap;
- width: 14em;
-}
-.ui-selectmenu-icon.ui-icon {
- float: right;
- margin-top: 0;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: pointer;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: .222em 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 2em;
-}
-.ui-spinner-button {
- width: 1.6em;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top-style: none;
- border-bottom-style: none;
- border-right-style: none;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
diff --git a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.min.css b/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.min.css
deleted file mode 100644
index 23502caa..00000000
--- a/plugins/javadoc/src/main/resources/static_res/jquery/jquery-ui.structure.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.13.1 - 2022-01-20
-* http://jqueryui.com
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;-ms-filter:"alpha(opacity=25)";opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:pointer;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/static_res/resources/glass.png b/plugins/javadoc/src/main/resources/static_res/resources/glass.png
deleted file mode 100644
index a7f591f4..00000000
--- a/plugins/javadoc/src/main/resources/static_res/resources/glass.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/resources/x.png b/plugins/javadoc/src/main/resources/static_res/resources/x.png
deleted file mode 100644
index 30548a75..00000000
--- a/plugins/javadoc/src/main/resources/static_res/resources/x.png
+++ /dev/null
Binary files differ
diff --git a/plugins/javadoc/src/main/resources/static_res/search.js b/plugins/javadoc/src/main/resources/static_res/search.js
deleted file mode 100644
index f839a92f..00000000
--- a/plugins/javadoc/src/main/resources/static_res/search.js
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-const constants = {
- noResult: {
- l: "No results found",
- renderable: "No results found"
- },
- labels: {
- modules: 'Modules',
- packages: 'Packages',
- types: 'Types',
- members: 'Members',
- tags: 'SearchTags'
- }
-}
-
-//It is super important to have vars here since they are lifter outside the block
-//ES6 syntax doesn't provide those feature and therefore will fail when one of those values wouldn't be initialized
-//eg. when a request for a given package fails
-if(typeof moduleSearchIndex === 'undefined'){
- var moduleSearchIndex;
-}
-if(typeof packageSearchIndex === 'undefined'){
- var packageSearchIndex;
-}
-if(typeof typeSearchIndex === 'undefined'){
- var typeSearchIndex;
-}
-if(typeof memberSearchIndex === 'undefined'){
- var memberSearchIndex;
-}
-if(typeof tagSearchIndex === 'undefined'){
- var tagSearchIndex;
-}
-
-const clearElementValue = (element) => {
- element.val('')
-}
-
-$(function init() {
- const search = $("#search")
- const reset = $("#reset")
-
- clearElementValue(search)
- reset.on('click', () => {
- clearElementValue(search)
- search.focus()
- })
-})
-
-const itemHasResults = (item) => {
- return item.l !== constants.noResult
-}
-
-$.widget("custom.catcomplete", $.ui.autocomplete, {
- _create: function() {
- this._super();
- },
- _renderMenu: function(ul, items) {
- const menu = this;
- let category
- $.each(items, (index, item) => {
- const shouldCategoryLabelBeRendered = itemHasResults(item) && item.category !== category
- if (shouldCategoryLabelBeRendered) {
- ul.append(`<li class="ui-autocomplete-category">${item.category}</li>`);
- category = item.category;
- }
-
- const li = menu._renderItemData(ul, item);
- if (item.category) {
- li.attr("aria-label", `${item.category} : ${item.l}`);
- } else {
- li.attr("aria-label", item.l);
- }
- li.attr("class", "resultItem");
- });
- },
- _renderItem: (ul, item) => {
- const li = $("<li/>").appendTo(ul);
- const div = $("<div/>").appendTo(li);
- div.html(item.renderable);
- return li;
- }
-});
-
-const highlight = (match) => `<span class="resultHighlight">` + match + `</span>`
-const escapeHtml = (str) => str.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
-
-const labelForPackage = (element) => (element.m) ? (element.m + "/" + element.l) : element.l
-const labelForNested = (element) => {
- var label = ""
- if(element.p) label += `${element.p}.`
- if(element.l !== element.c && element.c) label += `${element.c}.`
- return label + element.l
-}
-const nestedName = (e) => e.l.substring(e.l.lastIndexOf(".") + 1)
-
-const renderableFromLabel = (label, regex) => escapeHtml(label).replace(regex, highlight)
-
-$(() => {
- $("#search").catcomplete({
- minLength: 1,
- delay: 100,
- source: function(request, response) {
- const exactRegexp = $.ui.autocomplete.escapeRegex(request.term) + "$"
- const exactMatcher = new RegExp("^" + exactRegexp, "i");
- const camelCaseRegexp = ($.ui.autocomplete.escapeRegex(request.term)).split(/(?=[A-Z])/).join("([a-z0-9_$]*?)");
- const camelCaseMatcher = new RegExp("^" + camelCaseRegexp);
- const secondaryMatcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
-
- const processWithExactLabel = (dataset, category) => {
- const exactOrCamelMatches = []
- const secondaryMatches = []
-
- dataset.map(element => {
- element.category = category
- return element
- }).forEach((element) => {
- if(exactMatcher.test(element.l)){
- element.renderable = renderableFromLabel(element.l, exactMatcher)
- exactOrCamelMatches.push(element)
- } else if(camelCaseMatcher.test(element.l)){
- element.renderable = renderableFromLabel(element.l, camelCaseMatcher)
- exactOrCamelMatches.push(element)
- } else if(secondaryMatcher.test(element.l)){
- element.renderable = renderableFromLabel(element.l, secondaryMatcher)
- secondaryMatches.push(element)
- }
- })
-
- return [...exactOrCamelMatches, ...secondaryMatches]
- }
-
- const processPackages = (dataset) => {
- const exactOrCamelMatches = []
- const secondaryMatches = []
-
- dataset.map(element => {
- element.category = constants.labels.packages
- return element
- }).forEach((element) => {
- const label = labelForPackage(element);
- if(exactMatcher.test(element.l)){
- element.renderable = renderableFromLabel(element.l, exactMatcher)
- exactOrCamelMatches.push(element)
- } else if(camelCaseMatcher.test(label)){
- element.renderable = renderableFromLabel(label, camelCaseMatcher)
- exactOrCamelMatches.push(element)
- } else if(secondaryMatcher.test(label)){
- element.renderable = renderableFromLabel(label, secondaryMatcher)
- secondaryMatches.push(element)
- }
- })
-
- return [...exactOrCamelMatches, ...secondaryMatches]
- }
-
- const processNested = (dataset, label) => {
- const exactOrCamelMatches = []
- const secondaryMatches = []
-
- dataset.map(element => {
- element.category = label
- return element
- }).forEach((element) => {
- const label = nestedName(element);
- if(exactMatcher.test(label)) {
- element.renderable = renderableFromLabel(labelForNested(element), new RegExp(exactRegexp, "i"))
- exactOrCamelMatches.push(element)
- } else if(camelCaseMatcher.test(label)){
- element.renderable = renderableFromLabel(labelForNested(element), new RegExp(camelCaseRegexp))
- exactOrCamelMatches.push(element)
- } else if(secondaryMatcher.test(labelForNested(element))){
- element.renderable = renderableFromLabel(labelForNested(element), secondaryMatcher)
- secondaryMatches.push(element)
- }
- })
-
- return [...exactOrCamelMatches, ...secondaryMatches]
- }
-
- const modules = moduleSearchIndex ? processWithExactLabel(moduleSearchIndex, constants.labels.modules) : []
- const packages = packageSearchIndex ? processPackages(packageSearchIndex) : []
- const types = typeSearchIndex ? processNested(typeSearchIndex, constants.labels.types) : []
- const members = memberSearchIndex ? processNested(memberSearchIndex, constants.labels.members) : []
- const tags = tagSearchIndex ? processWithExactLabel(tagSearchIndex, constants.labels.tags) : []
-
- const result = [...modules, ...packages, ...types, ...members, ...tags]
- return response(result);
- },
- response: function(event, ui) {
- if (!ui.content.length) {
- ui.content.push(constants.noResult);
- } else {
- $("#search").empty();
- }
- },
- autoFocus: true,
- position: {
- collision: "flip"
- },
- select: function(event, ui) {
- if (ui.item.l !== constants.noResult.l) {
- window.location.href = pathtoroot + ui.item.url;
- $("#search").focus();
- }
- }
- });
-});
-
diff --git a/plugins/javadoc/src/main/resources/static_res/stylesheet.css b/plugins/javadoc/src/main/resources/static_res/stylesheet.css
deleted file mode 100644
index 1a4d95b7..00000000
--- a/plugins/javadoc/src/main/resources/static_res/stylesheet.css
+++ /dev/null
@@ -1,889 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-/*
- * Javadoc style sheet
- */
-
-@import url('resources/fonts/dejavu.css');
-
-/*
- * Styles for individual HTML elements.
- *
- * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular
- * HTML element throughout the page.
- */
-
-body {
- background-color:#ffffff;
- color:#353833;
- font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;
- font-size:14px;
- margin:0;
- padding:0;
- height:100%;
- width:100%;
-}
-iframe {
- margin:0;
- padding:0;
- height:100%;
- width:100%;
- overflow-y:scroll;
- border:none;
-}
-a:link, a:visited {
- text-decoration:none;
- color:#4A6782;
-}
-a[href]:hover, a[href]:focus {
- text-decoration:none;
- color:#bb7a2a;
-}
-a[name] {
- color:#353833;
-}
-a[name]:before, a[name]:target, a[id]:before, a[id]:target {
- content:"";
- display:inline-block;
- position:relative;
- padding-top:129px;
- margin-top:-129px;
-}
-pre {
- font-family:'DejaVu Sans Mono', monospace;
- font-size:14px;
-}
-h1 {
- font-size:20px;
-}
-h2 {
- font-size:18px;
-}
-h3 {
- font-size:16px;
- font-style:italic;
-}
-h4 {
- font-size:13px;
-}
-h5 {
- font-size:12px;
-}
-h6 {
- font-size:11px;
-}
-ul {
- list-style-type:disc;
-}
-code, tt {
- font-family:'DejaVu Sans Mono', monospace;
- font-size:14px;
- padding-top:4px;
- margin-top:8px;
- line-height:1.4em;
-}
-dt code {
- font-family:'DejaVu Sans Mono', monospace;
- font-size:14px;
- padding-top:4px;
-}
-table tr td dt code {
- font-family:'DejaVu Sans Mono', monospace;
- font-size:14px;
- vertical-align:top;
- padding-top:4px;
-}
-sup {
- font-size:8px;
-}
-button {
- font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
- font-size: 14px;
-}
-/*
- * Styles for HTML generated by javadoc.
- *
- * These are style classes that are used by the standard doclet to generate HTML documentation.
- */
-
-/*
- * Styles for document title and copyright.
- */
-.clear {
- clear:both;
- height:0px;
- overflow:hidden;
-}
-.aboutLanguage {
- float:right;
- padding:0px 21px;
- font-size:11px;
- z-index:200;
- margin-top:-9px;
-}
-.legalCopy {
- margin-left:.5em;
-}
-.bar a, .bar a:link, .bar a:visited, .bar a:active {
- color:#FFFFFF;
- text-decoration:none;
-}
-.bar a:hover, .bar a:focus {
- color:#bb7a2a;
-}
-.tab {
- background-color:#0066FF;
- color:#ffffff;
- padding:8px;
- width:5em;
- font-weight:bold;
-}
-/*
- * Styles for navigation bar.
- */
-.bar {
- background-color:#4D7A97;
- color:#FFFFFF;
- padding:.8em .5em .4em .8em;
- height:auto;/*height:1.8em;*/
- font-size:11px;
- margin:0;
-}
-.navPadding {
- padding-top: 107px;
-}
-.fixedNav {
- position:fixed;
- width:100%;
- z-index:999;
- background-color:#ffffff;
-}
-.topNav {
- background-color:#4D7A97;
- color:#FFFFFF;
- float:left;
- padding:0;
- width:100%;
- clear:right;
- height:2.8em;
- padding-top:10px;
- overflow:hidden;
- font-size:12px;
-}
-.bottomNav {
- margin-top:10px;
- background-color:#4D7A97;
- color:#FFFFFF;
- float:left;
- padding:0;
- width:100%;
- clear:right;
- height:2.8em;
- padding-top:10px;
- overflow:hidden;
- font-size:12px;
-}
-.subNav {
- background-color:#dee3e9;
- float:left;
- width:100%;
- overflow:hidden;
- font-size:12px;
-}
-.subNav div {
- clear:left;
- float:left;
- padding:0 0 5px 6px;
- text-transform:uppercase;
-}
-.subNav .navList {
- padding-top:5px;
-}
-ul.navList, ul.subNavList {
- float:left;
- margin:0 25px 0 0;
- padding:0;
-}
-ul.navList li{
- list-style:none;
- float:left;
- padding: 5px 6px;
- text-transform:uppercase;
-}
-ul.navListSearch {
- float:right;
- margin:0 0 0 0;
- padding:0;
-}
-ul.navListSearch li {
- list-style:none;
- float:right;
- padding: 5px 6px;
- text-transform:uppercase;
-}
-ul.navListSearch li label {
- position:relative;
- right:-16px;
-}
-ul.subNavList li {
- list-style:none;
- float:left;
- padding-top:10px;
-}
-.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited {
- color:#FFFFFF;
- text-decoration:none;
- text-transform:uppercase;
-}
-.topNav a:hover, .bottomNav a:hover {
- text-decoration:none;
- color:#bb7a2a;
- text-transform:uppercase;
-}
-.navBarCell1Rev {
- background-color:#F8981D;
- color:#253441;
- margin: auto 5px;
-}
-.skipNav {
- position:absolute;
- top:auto;
- left:-9999px;
- overflow:hidden;
-}
-/*
- * Styles for page header and footer.
- */
-.header, .footer {
- clear:both;
- margin:0 20px;
- padding:5px 0 0 0;
-}
-.indexNav {
- position:relative;
- font-size:12px;
- background-color:#dee3e9;
-}
-.indexNav ul {
- margin-top:0;
- padding:5px;
-}
-.indexNav ul li {
- display:inline;
- list-style-type:none;
- padding-right:10px;
- text-transform:uppercase;
-}
-.indexNav h1 {
- font-size:13px;
-}
-.title {
- color:#2c4557;
- margin:10px 0;
-}
-.subTitle {
- margin:5px 0 0 0;
-}
-.header ul {
- margin:0 0 15px 0;
- padding:0;
-}
-.footer ul {
- margin:20px 0 5px 0;
-}
-.header ul li, .footer ul li {
- list-style:none;
- font-size:13px;
-}
-/*
- * Styles for headings.
- */
-div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
- background-color:#dee3e9;
- border:1px solid #d0d9e0;
- margin:0 0 6px -8px;
- padding:7px 5px;
-}
-ul.blockList ul.blockList ul.blockList li.blockList h3 {
- background-color:#dee3e9;
- border:1px solid #d0d9e0;
- margin:0 0 6px -8px;
- padding:7px 5px;
-}
-ul.blockList ul.blockList li.blockList h3 {
- padding:0;
- margin:15px 0;
-}
-ul.blockList li.blockList h2 {
- padding:0px 0 20px 0;
-}
-/*
- * Styles for page layout containers.
- */
-.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer,
-.allClassesContainer, .allPackagesContainer {
- clear:both;
- padding:10px 20px;
- position:relative;
-}
-.indexContainer {
- margin:10px;
- position:relative;
- font-size:12px;
-}
-.indexContainer h2 {
- font-size:13px;
- padding:0 0 3px 0;
-}
-.indexContainer ul {
- margin:0;
- padding:0;
-}
-.indexContainer ul li {
- list-style:none;
- padding-top:2px;
-}
-.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
- font-size:12px;
- font-weight:bold;
- margin:10px 0 0 0;
- color:#4E4E4E;
-}
-.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
- margin:5px 0 10px 0px;
- font-size:14px;
- font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
-}
-
-.contentContainer .description dl dt p, .contentContainer .details dl dt p, .serializedFormContainer dl dt p,
-.contentContainer .description dl dd p, .contentContainer .details dl dd p, .serializedFormContainer dl dd p {
- margin:5px 0 10px 0px;
-}
-
-.serializedFormContainer dl.nameValue dt {
- margin-left:1px;
- font-size:1.1em;
- display:inline;
- font-weight:bold;
-}
-.serializedFormContainer dl.nameValue dd {
- margin:0 0 0 1px;
- font-size:1.1em;
- display:inline;
-}
-/*
- * Styles for lists.
- */
-li.circle {
- list-style:circle;
-}
-ul.horizontal li {
- display:inline;
- font-size:0.9em;
-}
-ul.inheritance {
- margin:0;
- padding:0;
-}
-ul.inheritance li {
- display:inline;
- list-style:none;
-}
-ul.inheritance li ul.inheritance {
- margin-left:15px;
- padding-left:15px;
- padding-top:1px;
-}
-ul.blockList, ul.blockListLast {
- margin:10px 0 10px 0;
- padding:0;
-}
-ul.blockList li.blockList, ul.blockListLast li.blockList {
- list-style:none;
- margin-bottom:15px;
- line-height:1.4;
-}
-ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList {
- padding:0px 20px 5px 10px;
- border:1px solid #ededed;
- background-color:#f8f8f8;
-}
-ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList {
- padding:0 0 5px 8px;
- background-color:#ffffff;
- border:none;
-}
-ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
- margin-left:0;
- padding-left:0;
- padding-bottom:15px;
- border:none;
-}
-ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
- list-style:none;
- border-bottom:none;
- padding-bottom:0;
-}
-table tr td dl, table tr td dl dt, table tr td dl dd {
- margin-top:0;
- margin-bottom:1px;
-}
-/*
- * Styles for tables.
- */
-.overviewSummary table, .memberSummary table, .typeSummary table, .useSummary table, .constantsSummary table, .deprecatedSummary table,
-.requiresSummary table, .packagesSummary table, .providesSummary table, .usesSummary table {
- width:100%;
- border-spacing:0;
- border-left:1px solid #EEE;
- border-right:1px solid #EEE;
- border-bottom:1px solid #EEE;
-}
-.overviewSummary table, .memberSummary table, .requiresSummary table, .packagesSummary table, .providesSummary table, .usesSummary table {
- padding:0px;
-}
-.overviewSummary caption, .memberSummary caption, .typeSummary caption,
-.useSummary caption, .constantsSummary caption, .deprecatedSummary caption,
-.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption {
- position:relative;
- text-align:left;
- background-repeat:no-repeat;
- color:#253441;
- font-weight:bold;
- clear:none;
- overflow:hidden;
- padding:0px;
- padding-top:10px;
- padding-left:1px;
- margin:0px;
- white-space:pre;
-}
-.constantsSummary caption a:link, .constantsSummary caption a:visited,
-.useSummary caption a:link, .useSummary caption a:visited {
- color:#1f389c;
-}
-.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link,
-.deprecatedSummary caption a:link,
-.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link,
-.usesSummary caption a:link,
-.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover,
-.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover,
-.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover,
-.usesSummary caption a:hover,
-.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active,
-.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active,
-.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active,
-.usesSummary caption a:active,
-.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited,
-.deprecatedSummary caption a:visited,
-.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited,
-.usesSummary caption a:visited {
- color:#FFFFFF;
-}
-.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,
-.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span,
-.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span,
-.usesSummary caption span {
- white-space:nowrap;
- padding-top:5px;
- padding-left:12px;
- padding-right:12px;
- padding-bottom:7px;
- display:inline-block;
- float:left;
- background-color:#F8981D;
- border: none;
- height:16px;
-}
-.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd,
-.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd,
-.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd {
- display:none;
- width:5px;
- position:relative;
- float:left;
- background-color:#F8981D;
-}
-.overviewSummary [role=tablist] button, .memberSummary [role=tablist] button,
-.typeSummary [role=tablist] button, .packagesSummary [role=tablist] button {
- border: none;
- cursor: pointer;
- padding: 5px 12px 7px 12px;
- font-weight: bold;
- margin-right: 3px;
-}
-.overviewSummary [role=tablist] .activeTableTab, .memberSummary [role=tablist] .activeTableTab,
-.typeSummary [role=tablist] .activeTableTab, .packagesSummary [role=tablist] .activeTableTab {
- background: #F8981D;
- color: #253441;
-}
-.overviewSummary [role=tablist] .tableTab, .memberSummary [role=tablist] .tableTab,
-.typeSummary [role=tablist] .tableTab, .packagesSummary [role=tablist] .tableTab {
- background: #4D7A97;
- color: #FFFFFF;
-}
-.rowColor th, .altColor th {
- font-weight:normal;
-}
-.overviewSummary td, .memberSummary td, .typeSummary td,
-.useSummary td, .constantsSummary td, .deprecatedSummary td,
-.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td {
- text-align:left;
- padding:0px 0px 12px 10px;
-}
-th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th,
-.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td,
-.constantsSummary td {
- vertical-align:top;
- padding-right:0px;
- padding-top:8px;
- padding-bottom:3px;
-}
-th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th,
-.packagesSummary th {
- background:#dee3e9;
- text-align:left;
- padding:8px 3px 3px 7px;
-}
-td.colFirst, th.colFirst {
- font-size:13px;
-}
-td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast {
- font-size:13px;
-}
-.constantsSummary th, .packagesSummary th {
- font-size:13px;
-}
-.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst,
-.providesSummary td.colLast {
- white-space:normal;
- font-size:13px;
-}
-.overviewSummary td.colFirst, .overviewSummary th.colFirst,
-.requiresSummary td.colFirst, .requiresSummary th.colFirst,
-.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th,
-.usesSummary td.colFirst, .usesSummary th.colFirst,
-.providesSummary td.colFirst, .providesSummary th.colFirst,
-.memberSummary td.colFirst, .memberSummary th.colFirst,
-.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName,
-.typeSummary td.colFirst, .typeSummary th.colFirst {
- vertical-align:top;
-}
-.packagesSummary th.colLast, .packagesSummary td.colLast {
- white-space:normal;
-}
-td.colFirst a:link, td.colFirst a:visited,
-td.colSecond a:link, td.colSecond a:visited,
-th.colFirst a:link, th.colFirst a:visited,
-th.colSecond a:link, th.colSecond a:visited,
-th.colConstructorName a:link, th.colConstructorName a:visited,
-th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited,
-.constantValuesContainer td a:link, .constantValuesContainer td a:visited,
-.allClassesContainer td a:link, .allClassesContainer td a:visited,
-.allPackagesContainer td a:link, .allPackagesContainer td a:visited {
- font-weight:bold;
-}
-.tableSubHeadingColor {
- background-color:#EEEEFF;
-}
-.altColor, .altColor th {
- background-color:#FFFFFF;
-}
-.rowColor, .rowColor th {
- background-color:#EEEEEF;
-}
-/*
- * Styles for contents.
- */
-.description pre {
- margin-top:0;
-}
-.deprecatedContent {
- margin:0;
- padding:10px 0;
-}
-.docSummary {
- padding:0;
-}
-ul.blockList ul.blockList ul.blockList li.blockList h3 {
- font-style:normal;
-}
-div.block {
- font-size:14px;
- font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
-}
-td.colLast div {
- padding-top:0px;
-}
-td.colLast a {
- padding-bottom:3px;
-}
-/*
- * Styles for formatting effect.
- */
-.sourceLineNo {
- color:green;
- padding:0 30px 0 0;
-}
-h1.hidden {
- visibility:hidden;
- overflow:hidden;
- font-size:10px;
-}
-.block {
- display:block;
- margin:3px 10px 2px 0px;
- color:#474747;
-}
-.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink,
-.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType,
-.packageHierarchyLabel, .authorLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel,
-.throwsLabel, .sinceLabel, .typeNameLabel, .typeNameLink, .searchTagLink {
- font-weight:bold;
-}
-.deprecationComment, .emphasizedPhrase, .interfaceName {
- font-style:italic;
-}
-.deprecationBlock {
- font-size:14px;
- font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
- border-style:solid;
- border-width:thin;
- border-radius:10px;
- padding:10px;
- margin-bottom:10px;
- margin-right:10px;
- display:inline-block;
-}
-div.block div.deprecationComment, div.block div.block span.emphasizedPhrase,
-div.block div.block span.interfaceName {
- font-style:normal;
-}
-div.contentContainer ul.blockList li.blockList h2 {
- padding-bottom:0px;
-}
-/*
- * Styles for IFRAME.
- */
-.mainContainer {
- margin:0 auto;
- padding:0;
- height:100%;
- width:100%;
- position:fixed;
- top:0;
- left:0;
-}
-.leftContainer {
- height:100%;
- position:fixed;
- width:320px;
-}
-.leftTop {
- position:relative;
- float:left;
- width:315px;
- top:0;
- left:0;
- height:30%;
- border-right:6px solid #ccc;
- border-bottom:6px solid #ccc;
-}
-.leftBottom {
- position:relative;
- float:left;
- width:315px;
- bottom:0;
- left:0;
- height:70%;
- border-right:6px solid #ccc;
- border-top:1px solid #000;
-}
-.rightContainer {
- position:absolute;
- left:320px;
- top:0;
- bottom:0;
- height:100%;
- right:0;
- border-left:1px solid #000;
-}
-.rightIframe {
- margin:0;
- padding:0;
- height:100%;
- right:30px;
- width:100%;
- overflow:visible;
- margin-bottom:30px;
-}
-/*
- * Styles specific to HTML5 elements.
- */
-main, nav, header, footer, section {
- display:block;
-}
-/*
- * Styles for javadoc search.
- */
-.ui-autocomplete-category {
- font-weight:bold;
- font-size:15px;
- padding:7px 0 7px 3px;
- background-color:#4D7A97;
- color:#FFFFFF;
-}
-.resultItem {
- font-size:13px;
-}
-.ui-autocomplete {
- max-height:85%;
- max-width:65%;
- overflow-y:scroll;
- overflow-x:scroll;
- white-space:nowrap;
- box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
-}
-ul.ui-autocomplete {
- position:fixed;
- z-index:999999;
-}
-ul.ui-autocomplete li {
- float:left;
- clear:both;
- width:100%;
-}
-.resultHighlight {
- font-weight:bold;
-}
-#search {
- background-image:url('resources/glass.png');
- background-size:13px;
- background-repeat:no-repeat;
- background-position:2px 3px;
- padding-left:20px;
- position:relative;
- right:-18px;
- width:400px;
-}
-#reset {
- background-color: rgb(255,255,255);
- background-image:url('resources/x.png');
- background-position:center;
- background-repeat:no-repeat;
- background-size:12px;
- border:0 none;
- width:16px;
- height:17px;
- position:relative;
- left:-4px;
- top:-4px;
- font-size:0px;
-}
-.watermark {
- color:#545454;
-}
-.searchTagDescResult {
- font-style:italic;
- font-size:11px;
-}
-.searchTagHolderResult {
- font-style:italic;
- font-size:12px;
-}
-.searchTagResult:before, .searchTagResult:target {
- color:red;
-}
-.moduleGraph span {
- display:none;
- position:absolute;
-}
-.moduleGraph:hover span {
- display:block;
- margin: -100px 0 0 100px;
- z-index: 1;
-}
-.methodSignature {
- white-space:normal;
-}
-
-/*
- * Styles for user-provided tables.
- *
- * borderless:
- * No borders, vertical margins, styled caption.
- * This style is provided for use with existing doc comments.
- * In general, borderless tables should not be used for layout purposes.
- *
- * plain:
- * Plain borders around table and cells, vertical margins, styled caption.
- * Best for small tables or for complex tables for tables with cells that span
- * rows and columns, when the "striped" style does not work well.
- *
- * striped:
- * Borders around the table and vertical borders between cells, striped rows,
- * vertical margins, styled caption.
- * Best for tables that have a header row, and a body containing a series of simple rows.
- */
-
-table.borderless,
-table.plain,
-table.striped {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-table.borderless > caption,
-table.plain > caption,
-table.striped > caption {
- font-weight: bold;
- font-size: smaller;
-}
-table.borderless th, table.borderless td,
-table.plain th, table.plain td,
-table.striped th, table.striped td {
- padding: 2px 5px;
-}
-table.borderless,
-table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th,
-table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td {
- border: none;
-}
-table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr {
- background-color: transparent;
-}
-table.plain {
- border-collapse: collapse;
- border: 1px solid black;
-}
-table.plain > thead > tr, table.plain > tbody tr, table.plain > tr {
- background-color: transparent;
-}
-table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th,
-table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td {
- border: 1px solid black;
-}
-table.striped {
- border-collapse: collapse;
- border: 1px solid black;
-}
-table.striped > thead {
- background-color: #E3E3E3;
-}
-table.striped > thead > tr > th, table.striped > thead > tr > td {
- border: 1px solid black;
-}
-table.striped > tbody > tr:nth-child(even) {
- background-color: #EEE
-}
-table.striped > tbody > tr:nth-child(odd) {
- background-color: #FFF
-}
-table.striped > tbody > tr > th, table.striped > tbody > tr > td {
- border-left: 1px solid black;
- border-right: 1px solid black;
-}
-table.striped > tbody > tr > th {
- font-weight: normal;
-}
diff --git a/plugins/javadoc/src/main/resources/views/class.korte b/plugins/javadoc/src/main/resources/views/class.korte
deleted file mode 100644
index 54106dda..00000000
--- a/plugins/javadoc/src/main/resources/views/class.korte
+++ /dev/null
@@ -1,329 +0,0 @@
-{% extends "components/base.korte" %}
-{% block content %}
-
-<main role="main">
- <div class="header">
- <div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">{{ packageName }}</a></div>
- <h2 title="{{ kind|capitalize }} {{ name }}" class="title">{{ kind|capitalize }} {{ name }}</h2>
- </div>
- <div class="contentContainer">
- <!-- <ul class="inheritance">
- <li>java.lang.Object</li>
- <li>
- <ul class="inheritance">
- <li>adaptation.Adaptation</li>
- </ul>
- </li>
- </ul> TODO inheritance tree -->
- <div class="description">
- <ul class="blockList">
- <li class="blockList">
- {% if implementedInterfaces.size != 0 %}
- <dl>
- <dt>All Implemented Interfaces:</dt>
- <dd>
- {% for name in implementedInterfaces %}
- <code>{{ name }}</code>
- {% if !loop.last %}
- ,
- {% endif %}
- {% endfor %}
- </dd>
- </dl>
- {% endif %}
- <hr>
- <pre class="wrap-overflow">
-{% if signature.annotations != null %}{{ signature.annotations|raw }} {% endif %}
-{{ signature.modifiers }} <span class="typeNameLabel">{{ signature.signatureWithoutModifiers|raw }}</span>
-{% if signature.supertypes != null %}{{signature.supertypes|raw}}{% endif %}
- </pre>
- <div class="block">{{ classlikeDocumentation|raw }}</div>
-
- <dl>
-
- {% if sinceTagContent.size() != 0 %}
- <dt><span class="sinceLabel">Since:</span></dt>
- {% for since in sinceTagContent %}
- <dd>{{ since|raw }}</dd>
- {% endfor %}
- {% endif %}
-
- {% if authorTagContent.size() != 0 %}
- <dt><span class="authorLabel">Author:</span></dt>
- {% for author in authorTagContent %}
- <dd>{{ author|raw }}</dd>
- {% endfor %}
- {% endif %}
-
- </dl>
- </li>
- </ul>
- </div>
- <div class="summary">
- <ul class="blockList">
- <li class="blockList">
- <!-- ======== NESTED CLASS SUMMARY ======== -->
- {% if classlikes.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="nested.class.summary">
- <!-- -->
- </a>
- <h3>Nested Class Summary</h3>
- <div class="memberSummary">
- <table>
- <caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
- <tr>
- <th class="colFirst" scope="col">Modifier and Type</th>
- <th class="colSecond" scope="col">Class</th>
- <th class="colLast" scope="col">Description</th>
- </tr>
- {% for classlike in classlikes %}
- <tr class="{{ rowColor(loop.index0) }}">
- <td class="colFirst"><code>{{ classlike.modifiers }}</code></td>
- <th class="colSecond" scope="row"><code><a href="{{ classlike.address }}">{{ classlike.signature }}</a></span></code>
- </th>
- <td class="colLast">{{ classlike.description|raw }}</td>
- </tr>
- {% endfor %}
- </table>
- </div>
- </li>
- </ul>
- </section>
- {% endif %}
- <!-- =========== FIELD SUMMARY =========== -->
- {% if properties.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="field.summary">
- <!-- -->
- </a>
- <h3>Field Summary</h3>
- <div class="memberSummary">
- <table>
- <caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
- <tr>
- <th class="colFirst" scope="col">Modifier and Type</th>
- <th class="colSecond" scope="col">Field</th>
- <th class="colLast" scope="col">Description</th>
- </tr>
- {% for property in properties %}
- <tr class="{{ rowColor(loop.index0) }}">
- <td class="colFirst"><code>{{ property.modifiers|raw }}</code></td>
- <th class="colSecond" scope="row"><code>{{ property.signature|raw }}</code></th>
- <td class="colLast">{{ description|raw }}</td>
- </tr>
- {% endfor %}
- </table>
- </div>
- </li>
- </ul>
- </section>
- {% endif %}
- <!-- ======== CONSTRUCTOR SUMMARY ======== -->
- {% if constructors.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="constructor.summary">
- <!-- -->
- </a>
- <h3>Constructor Summary</h3>
- <div class="memberSummary">
- <table>
- <caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
- <tbody>
- <tr>
- <th class="colFirst" scope="col">Constructor</th>
- <th class="colLast" scope="col">Description</th>
- </tr>
-
- {% for constructor in constructors %}
- <tr class="{{ rowColor(loop.index0) }}">
- <th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a
- href="#{{ constructor.anchorLink }}">{{ constructor.name }}</a></span>({{ constructor.inlineParameters|raw }})</code></th>
- <td class="colLast">{{ constructor.brief|raw }}</td>
- </tr>
- {% endfor %}
-
- </tbody>
- </table>
- </div>
- </li>
- </ul>
- </section>
- {% endif %}
- <!-- =========== ENUM CONSTANT SUMMARY =========== -->
- {% if entries.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="enum.constant.summary">
- <!-- -->
- </a>
- <h3>Enum Constant Summary</h3>
- <table class="memberSummary">
- <caption><span>Enum Constants</span><span class="tabEnd">&nbsp;</span></caption>
- <tr>
- <th class="colFirst" scope="col">Enum Constant</th>
- <th class="colLast" scope="col">Description</th>
- </tr>
- {% for entry in entries %}
- <tr class="{{ rowColor(loop.index0) }}">
- <th class="colFirst" scope="row"><code><span class="memberNameLink"><a
- href="TODO">{{ entry.signature.signatureWithoutModifiers|raw }}</a></span></code></th>
- <td class="colLast">{{ entry.brief|raw }}</td>
- </tr>
- {% endfor %}
- </table>
- </li>
- </ul>
- </section>
- {% endif %}
- <!-- ========== METHOD SUMMARY =========== -->
- {% if methods.own.size !=0 || methods.inherited.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="method.summary">
- <!-- -->
- </a>
- <h3>Method Summary</h3>
- <div class="memberSummary">
- <div role="tablist" aria-orientation="horizontal">
- <button role="tab" aria-selected="true" aria-controls="memberSummary_tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="activeTableTab">All Methods</button>
- <!-- TODO: Instance and Concrete Methods #1118 -->
- </div>
- <div id="memberSummary_tabpanel" role="tabpanel">
- <table aria-labelledby="t0">
- <tr>
- <th class="colFirst" scope="col">Modifier and Type</th>
- <th class="colSecond" scope="col">Method</th>
- <th class="colLast" scope="col">Description</th>
- </tr>
- {% for method in methods.own %}
- <tr id="i{{ loop.index0 }}" class="{{ rowColor(loop.index0) }}">
- <td class="colFirst"><code>{{ method.signature.modifiers|raw }}</code>
- </td>
- <th class="colSecond" scope="row"><code>{{ method.signature.signatureWithoutModifiers|raw }} </code>
- </th>
- <td class="colLast">{{ method.brief|raw }}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- <ul class="blockList">
- {% for method in methods.inherited %}
- <li class="blockList"><a id="methods.inherited.from.class.{{ method.inheritedFrom}}">
- <!-- -->
- </a>
- <h3>Methods inherited from class&nbsp;{{ method.inheritedFrom}}</h3>
- <code>{{ method.names }}</code></li>
- {% endfor %}
- <li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
- <!-- -->
- </a>
- <h3>Methods inherited from class&nbsp;java.lang.Object</h3>
- <code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString,
- wait, wait, wait</code></li>
- </ul>
- </li>
- </ul>
- </section>
- {% endif %}
- </li>
- </ul>
- </div>
- <div class="details">
- <ul class="blockList">
- <li class="blockList">
- <!-- ========= CONSTRUCTOR DETAIL ======== -->
- {% if constructors.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="constructor.detail">
- <!-- -->
- </a>
- <h3>Constructor Detail</h3>
- {% for constructor in constructors %}
- <a name="{{ constructor.anchorLink }}"></a>
- <ul class="blockList">
- <li class="blockList">
- <h4>{{ constructor.name }}</h4>
- <pre>{{ constructor.name }}({{ constructor.inlineParameters|raw }})</pre>
- <div class="block">{{ constructor.brief|raw}}</div>
- {% if constructor.parameters.size != 0 && hasAnyDescription(constructor.parameters) %}
- <dl>
- <dt><span class="paramLabel">Parameters:</span></dt>
- {% for parameter in constructor.parameters %}
- {% if parameter.description != "" %}
- <dd><code>{{ parameter.name }}</code> - {{ parameter.description|raw }}</dd>
- {% endif %}
- {% endfor %}
- </dl>
- {% endif %}
- </li>
- </ul>
- {% endfor %}
- </li>
- </ul>
- </section>
- {% endif %}
- <!-- ============ METHOD DETAIL ========== -->
- {% if methods.own.size != 0 %}
- <section role="region">
- <ul class="blockList">
- <li class="blockList"><a id="method.detail">
- <!-- -->
- </a>
- <h3>Method Detail</h3>
- {% for method in methods.own %}
- <a id="{{ method.anchorLink }}">
- <!-- -->
- </a>
- <ul class={% if loop.last %}
- "blockListLast"
- {% else %}
- "blockList"
- {% endif %}>
- <li class="blockList">
- <h4>{{ method.name }}</h4>
- <pre class="methodSignature">{{ method.signature.annotations|raw }} {{ method.signature.modifiers|raw }} {{ method.signature.signatureWithoutModifiers|raw}}</pre>
- <div class="block">{{ method.description|raw }}</div>
-
- <dl>
-
- {% if method.parameters.size != 0 && hasAnyDescription(method.parameters) %}
- <dt><span class="paramLabel">Parameters:</span></dt>
- {% for parameter in method.parameters %}
- {% if parameter.description != "" %}
- <dd><code>{{ parameter.name }}</code> - {{ parameter.description|raw }}</dd>
- {% endif %}
- {% endfor %}
- {% endif %}
-
- {% if method.returnTagContent != "" %}
- <dt><span class="returnLabel">Returns:</span></dt>
- <dd>{{ method.returnTagContent|raw }}</dd>
- {% endif %}
-
- {% if method.sinceTagContent.size() != 0 %}
- <dt><span class="sinceLabel">Since:</span></dt>
- {% for since in method.sinceTagContent %}
- <dd>{{ since|raw }}</dd>
- {% endfor %}
- {% endif %}
-
- </dl>
- </li>
- </ul>
- {% endfor %}
- </li>
- </ul>
- </section>
- {% endif %}
- </li>
- </ul>
- </div>
- </div>
-</main>
-{% end %} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/base.korte b/plugins/javadoc/src/main/resources/views/components/base.korte
deleted file mode 100644
index 6e2f6c4c..00000000
--- a/plugins/javadoc/src/main/resources/views/components/base.korte
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE HTML>
-<!-- NewPage -->
-<html lang="en">
-{%- include "components/head.korte" -%}
-<body>
-<script type="text/javascript">
-var pathtoroot = "{{ pathToRoot }}";
-</script>
-<noscript>
- <div>JavaScript is disabled on your browser.</div>
-</noscript>
-{%- include "components/topNavbar.korte" -%}
-{%- block content %} {% endblock -%}
-{%- include "components/bottomNavbar.korte" -%}
-<ul class="ui-autocomplete ui-front ui-menu ui-widget ui-widget-content" id="ui-id-1" tabindex="0"
- style="display: none;"></ul>
-<span role="status" aria-live="assertive" aria-relevant="additions" class="ui-helper-hidden-accessible"></span>
-</body>
-</html> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/bottomNavbar.korte b/plugins/javadoc/src/main/resources/views/components/bottomNavbar.korte
deleted file mode 100644
index a9d83e5c..00000000
--- a/plugins/javadoc/src/main/resources/views/components/bottomNavbar.korte
+++ /dev/null
@@ -1,20 +0,0 @@
-<footer role="contentinfo">
- <nav role="navigation">
- <!-- ======= START OF BOTTOM NAVBAR ====== -->
- <div class="bottomNav"><a id="navbar.bottom">
- <!-- -->
- </a>
- <div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a>
- </div>
- <a id="navbar.bottom.firstrow">
- <!-- -->
- </a>
- {% include "components/navList.korte" -%}
- </div>
- <a id="skip.navbar.bottom">
- <!-- -->
- </a>
- {% set type="bottom" %}{% include "components/subNav.korte" -%}
- <!-- ======== END OF BOTTOM NAVBAR ======= -->
- </nav>
-</footer> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/head.korte b/plugins/javadoc/src/main/resources/views/components/head.korte
deleted file mode 100644
index 8f4aa12d..00000000
--- a/plugins/javadoc/src/main/resources/views/components/head.korte
+++ /dev/null
@@ -1,18 +0,0 @@
-<head>
- <title>{{ title }} {% if version != null %}{{ version }} API {% endif %}</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta name="dc.created" content="2020-03-25">
- <link rel="stylesheet" type="text/css" href="{{ pathToRoot }}stylesheet.css" title="Style">
- <link rel="stylesheet" type="text/css" href="{{ pathToRoot }}dokka-javadoc-stylesheet.css" title="Style">
- <link rel="stylesheet" type="text/css" href="{{ pathToRoot }}jquery/jquery-ui.css" title="Style">
- <script type="text/javascript" src="{{ pathToRoot }}jquery/jquery-{{ jQueryVersion() }}.min.js"></script>
- <script type="text/javascript" src="{{ pathToRoot }}jquery/jquery-migrate-{{ jQueryMigrateVersion() }}.min.js"></script>
- <script type="text/javascript" src="{{ pathToRoot }}jquery/jquery-ui.js"></script>
-
- <script type="text/javascript" src="{{ pathToRoot }}search.js"></script>
- <script async type="text/javascript" src="{{ pathToRoot }}module-search-index.js"></script>
- <script async type="text/javascript" src="{{ pathToRoot }}package-search-index.js"></script>
- <script async type="text/javascript" src="{{ pathToRoot }}type-search-index.js"></script>
- <script async type="text/javascript" src="{{ pathToRoot }}member-search-index.js"></script>
- <script async type="text/javascript" src="{{ pathToRoot }}tag-search-index.js"></script>
-</head>
diff --git a/plugins/javadoc/src/main/resources/views/components/indexPage.korte b/plugins/javadoc/src/main/resources/views/components/indexPage.korte
deleted file mode 100644
index 84679fad..00000000
--- a/plugins/javadoc/src/main/resources/views/components/indexPage.korte
+++ /dev/null
@@ -1,30 +0,0 @@
-<main role="main">
- <div class="header">
- <h1 {{ h1Title(kind)|raw }}class="title">{{ title }} {% if version != null %}{{ version }} API {% endif %}</h1>
- </div>
- <div class="header">
- <div class="subtitle">
- <div class="block">{{ subtitle|raw }}</div>
- </div>
- <p>See: <a href="#overview_description">Description</a></p>
- </div>
- <div class="contentContainer">
- {% if lists %}
- <ul class="blockList">
- {% for item in lists%}
- <li class="blockList">
- {% set list = item.list %}
- {% set colTitle = item.colTitle %}
- {% set tabTitle = item.tabTitle %}
- {% set isTypeSummary = "true" %}
- {% include "components/indexTable.korte" %}
- </li>
- {% endfor %}
- </ul>
- {% else %}
- <div class="overviewSummary">
- {% include "components/indexTable.korte" %}
- </div>
- {% endif %}
- </div>
-</main> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/indexTable.korte b/plugins/javadoc/src/main/resources/views/components/indexTable.korte
deleted file mode 100644
index 21c94b7c..00000000
--- a/plugins/javadoc/src/main/resources/views/components/indexTable.korte
+++ /dev/null
@@ -1,18 +0,0 @@
-{% if isTypeSummary %}
- <div class="typeSummary">
-{% endif %}
-<table>
-<caption><span>{{ tabTitle }}</span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">{{ colTitle }}</th>
-<th class="colLast" scope="col">Description</th>
-</tr>
-<tbody>
-{% for item in list %}
- <tr class="{{ rowColor(loop.index0) }}">{{ createTabRow(item, contextRoot)|raw }}</tr>
-{% end -%}
-</tbody>
-</table>
-{% if isTypeSummary %}
- </div>
-{% endif %} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/navList.korte b/plugins/javadoc/src/main/resources/views/components/navList.korte
deleted file mode 100644
index dbfe7eb3..00000000
--- a/plugins/javadoc/src/main/resources/views/components/navList.korte
+++ /dev/null
@@ -1,27 +0,0 @@
-<ul class="navList" title="Navigation">
- {%- if kind == "main" %}
- <li class="navBarCell1Rev">Overview</li>
- {% else %}
- <li><a href="{{ pathToRoot }}index.html">Overview</a></li>
- {% endif -%}
- {%- if kind == "package" %}
- <li class="navBarCell1Rev">Package</li>
- {% elseif kind == "main" %}
- <li>Package</li>
- {% else %}
- <li><a href="package-summary.html">Package</a></li>
- {% endif -%}
- {%- if kind == "class" %}
- <li class="navBarCell1Rev">Class</li>
- {% else %}
- <li>Class</li>
- {% endif -%}
- {%- if kind == "main" %}
- <li><a href="overview-tree.html">Tree</a></li>
- {% else %}
- <li><a href="package-tree.html">Tree</a></li>
- {% end %}
- <li><a href="{{ pathToRoot }}deprecated.html">Deprecated</a></li>
- <li><a href="{{ pathToRoot }}index-files/index-1.html">Index</a></li>
- <li>Help</li>
-</ul> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/subNav.korte b/plugins/javadoc/src/main/resources/views/components/subNav.korte
deleted file mode 100644
index 7869d747..00000000
--- a/plugins/javadoc/src/main/resources/views/components/subNav.korte
+++ /dev/null
@@ -1,44 +0,0 @@
-<div class="subNav">
-{% if kind == "indexPage" %}
- <ul class="navList">
- {%- if prevLetter != "" %}
- <li><a href="{{ prevLetter }}.html">PREV&nbsp;LETTER</a></li>
- {% else %}
- <li>PREV&nbsp;LETTER</li>
- {% endif -%}
- {%- if nextLetter != "" %}
- <li><a href="{{ nextLetter }}.html">NEXT&nbsp;LETTER</a></li>
- {% else %}
- <li>NEXT&nbsp;LETTER</li>
- {% endif -%}
- </ul>
-{% end -%}
-<ul class="navList" id="allclasses_navbar_top" style="display: block;">
- <li><a href="{{ pathToRoot }}allclasses.html">All&nbsp;Classes</a></li>
-</ul>
-{% if type != "bottom" %}
-<ul class="navListSearch">
-<li><label for="search">SEARCH:</label>
-<input type="text" id="search" value="search" class="ui-autocomplete-input" autocomplete="off" placeholder="Search">
-<input type="reset" id="reset" value="reset">
-</li>
-</ul>
-{% end -%}
-<div>
-<script type="text/javascript"><!--
- allClassesLink = document.getElementById("allclasses_navbar_top");
- if(window==top) {
- allClassesLink.style.display = "block";
- }
- else {
- allClassesLink.style.display = "none";
- }
- //-->
-</script>
-<noscript>
-<div>JavaScript is disabled on your browser.</div>
-</noscript>
-</div>
-<a id="skip.navbar.top">
-<!-- -->
-</a></div> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/components/topNavbar.korte b/plugins/javadoc/src/main/resources/views/components/topNavbar.korte
deleted file mode 100644
index 59b84558..00000000
--- a/plugins/javadoc/src/main/resources/views/components/topNavbar.korte
+++ /dev/null
@@ -1,24 +0,0 @@
-<header role="banner">
- <nav role="navigation">
- <div class="fixedNav">
- <!-- ========= START OF TOP NAVBAR ======= -->
- <div class="topNav"><a id="navbar.top">
- <!-- -->
- </a>
- <div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a>
- </div>
- <a id="navbar.top.firstrow">
- <!-- -->
- </a>
- {% include "components/navList.korte" -%}
- </div>
- {% include "components/subNav.korte" -%}
- <!-- ========= END OF TOP NAVBAR ========= -->
- </div>
- <div class="navPadding">&nbsp;</div>
- <script type="text/javascript"><!--
- $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
- //-->
- </script>
- </nav>
-</header> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/deprecated.korte b/plugins/javadoc/src/main/resources/views/deprecated.korte
deleted file mode 100644
index a22e1069..00000000
--- a/plugins/javadoc/src/main/resources/views/deprecated.korte
+++ /dev/null
@@ -1,40 +0,0 @@
-{% extends "components/base.korte" %}
-{% block content %}
-
-<main role="main">
- <div class="header">
- <h1 title="Deprecated API" class="title">Deprecated API</h1>
- <h2 title="Contents">Contents</h2>
- <ul>
- {% for section in sections %}
- <li><a href="#{{ section.id }}">{{ section.caption }}</a></li>
- {% endfor %}
- </ul>
- </div>
- <div class="contentContainer">
- {% for section in sections %}
- <a id="{{ section.id }}"></a>
- <ul class="blockList">
- <li class="blockList">
- <div class="deprecatedSummary">
- <table>
- <caption><span>{{ section.caption }}</span><span class="tabEnd">&nbsp;</span></caption>
- <tr>
- <th class="colFirst" scope="col">{{ section.header }}</th>
- <th class="colLast" scope="col">Description</th>
- </tr>
- {% for element in section.elements %}
- <tr class="{{ rowColor(loop.index0) }}">
- <th class="colDeprecatedItemName" scope="row">
- <a href="{{ element.address }}">{{ element.name }}</a>
- </th>
- <td class="colLast">{{ element.description|raw }}</td>
- </tr>
- {% endfor %}
- </table>
- </div>
- </li>
- </ul>
- {% endfor %}
- </div>
-</main> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/indexPage.korte b/plugins/javadoc/src/main/resources/views/indexPage.korte
deleted file mode 100644
index 2881e86d..00000000
--- a/plugins/javadoc/src/main/resources/views/indexPage.korte
+++ /dev/null
@@ -1,32 +0,0 @@
-{% extends "components/base.korte" %}
-{% block content %}
-
-<main role="main">
- <div class="contentContainer">
- {% for key in dictionary %}
- <a href="index-{{ loop.index }}.html">{{ key }}</a>&nbsp;
- {% endfor %}
- <h2 class="title">{{ dictionary[id - 1] }}</h2>
- <dl>
- {% for key in elements %}
- <dt>
- {% if key.isMember %}
- <span class="memberNameLink">
- {% endif %}
- <a href="{{ key.address }}">{{ key.name }}</a>
- {% if key.isMember %}
- </span> - {{ key.type }} in {{ key.origin|raw }}
- {% else %}
- - {{ key.type }} {{ key.name }}
- {% endif %}
-
- </dt>
- <dd>{{ key.description|raw }}</dd>
-
- {% endfor %}
- </dl>
- {% for key in dictionary %}
- <a href="index-{{ loop.index }}.html">{{ key }}</a>&nbsp;
- {% endfor %}
- </div>
-</main> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/listPage.korte b/plugins/javadoc/src/main/resources/views/listPage.korte
deleted file mode 100644
index 985f1d4d..00000000
--- a/plugins/javadoc/src/main/resources/views/listPage.korte
+++ /dev/null
@@ -1,13 +0,0 @@
-<html lang="en">
-{% include "components/head.korte" -%}
-<body>
-<h1 class="bar">{{ title }}</h1>
-<main role="main" class="indexContainer">
- <ul>
- {% for item in list %}
- <li>{{ createListRow(item, contextRoot)|raw }}</li>
- {% end -%}
- </ul>
-</main>
-</body>
-</html> \ No newline at end of file
diff --git a/plugins/javadoc/src/main/resources/views/tabPage.korte b/plugins/javadoc/src/main/resources/views/tabPage.korte
deleted file mode 100644
index c69d2c97..00000000
--- a/plugins/javadoc/src/main/resources/views/tabPage.korte
+++ /dev/null
@@ -1,4 +0,0 @@
-{% extends "components/base.korte" %}
-{% block content %}
-{% include "components/indexPage.korte" %}
-{% end %}
diff --git a/plugins/javadoc/src/main/resources/views/treePage.korte b/plugins/javadoc/src/main/resources/views/treePage.korte
deleted file mode 100644
index 73a23896..00000000
--- a/plugins/javadoc/src/main/resources/views/treePage.korte
+++ /dev/null
@@ -1,48 +0,0 @@
-{% extends "components/base.korte" %}
-{% block content %}
-<main role="main">
- <div class="header">
- {% if kind == "main" %}
- <h1 class="title">Hierarchy For All Packages</h1>
- {% else %}
- <h1 class="title">Hierarchy For Package {{ title }}</h1>
- {% end -%}
- <span class="packageHierarchyLabel">Package Hierarchies:</span>
- <ul class="horizontal">
- {% if kind == "main" %}
- {{ createPackageHierarchy(list)|raw }}
- {% else %}
- <li><a href="{{ pathToRoot }}package-tree.html">All Packages</a></li>
- {% end -%}
- </ul>
- </div>
- <div class="contentContainer">
- <section role="region">
- <h2 title="Class Hierarchy">Class Hierarchy</h2>
- <ul>
- {{ renderInheritanceGraph(classGraph)|raw }}
- </ul>
- </section>
- <section role="region">
- <h2 title="Interface Hierarchy">Interface Hierarchy</h2>
- <ul>
- {{ renderInheritanceGraph(interfaceGraph)|raw }}
- </ul>
- </section>
- <section role="region">
- <h2 title="Enum Hierarchy">Enum Hierarchy</h2>
- <ul>
- <li class="circle">java.lang.Object
- <ul>
- <li class="circle">java.lang.Enum&lt;E&gt; (implements java.lang.Comparable&lt;T&gt;, java.io.Serializable)
- <ul>
- <li class="circle">model.<a href="model/VertexType.html" title="enum in model"><span class="typeNameLink">VertexType</span></a></li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- </section>
- </div>
-</main>
-{% end %}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/AbstractJavadocTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/AbstractJavadocTemplateMapTest.kt
deleted file mode 100644
index 60265e33..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/AbstractJavadocTemplateMapTest.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.javadoc.location.JavadocLocationProvider
-import org.jetbrains.dokka.javadoc.pages.JavadocPageNode
-import org.jetbrains.dokka.javadoc.renderer.JavadocContentToTemplateMapTranslator
-import org.jetbrains.dokka.jdk
-import org.jetbrains.dokka.kotlinStdlib
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.*
-
-internal abstract class AbstractJavadocTemplateMapTest : BaseAbstractTest() {
- protected var config: DokkaConfigurationImpl = dokkaConfiguration {
- format = "javadoc"
- suppressObviousFunctions = false
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- analysisPlatform = "jvm"
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- DokkaConfiguration.ExternalDocumentationLink.kotlinStdlib()
- )
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
-
- data class Result(
- val rootPageNode: RootPageNode,
- val context: DokkaContext
- ) {
-
- val translator: JavadocContentToTemplateMapTranslator by lazy {
- val locationProvider = context.plugin<JavadocPlugin>()
- .querySingle { locationProviderFactory }
- .getLocationProvider(rootPageNode) as JavadocLocationProvider
-
- JavadocContentToTemplateMapTranslator(locationProvider, context)
- }
-
- val JavadocPageNode.templateMap: Map<String, Any?> get() = translator.templateMapForPageNode(this)
-
- inline fun <reified T : JavadocPageNode> allPagesOfType(): List<T> {
- return rootPageNode.withDescendants().filterIsInstance<T>().toList()
- }
-
- inline fun <reified T : JavadocPageNode> firstPageOfType(): T {
- return rootPageNode.withDescendants().filterIsInstance<T>().first()
- }
-
- inline fun <reified T : JavadocPageNode> firstPageOfTypeOrNull(): T? {
- return rootPageNode.withDescendants().filterIsInstance<T>().firstOrNull()
- }
-
- inline fun <reified T : JavadocPageNode> singlePageOfType(): T {
- return rootPageNode.withDescendants().filterIsInstance<T>().single()
- }
- }
-
- fun testTemplateMapInline(
- query: String,
- configuration: DokkaConfigurationImpl = config,
- pluginsOverride: List<DokkaPlugin> = emptyList(),
- assertions: Result.() -> Unit
- ) {
- testInline(query, configuration, pluginOverrides = pluginsOverride) {
- renderingStage = { rootPageNode, dokkaContext ->
- val preprocessors = dokkaContext.plugin<JavadocPlugin>().query { javadocPreprocessors }
- val transformedRootPageNode = preprocessors.fold(rootPageNode) { acc, pageTransformer ->
- pageTransformer(acc)
- }
-
- Result(transformedRootPageNode, dokkaContext).assertions()
- }
- }
- }
-
- fun dualTestTemplateMapInline(
- kotlin: String? = null,
- java: String? = null,
- configuration: DokkaConfigurationImpl = config,
- pluginsOverride: List<DokkaPlugin> = emptyList(),
- assertions: Result.() -> Unit
- ) {
- val kotlinException = kotlin?.let {
- runCatching {
- testTemplateMapInline(
- query = kotlin,
- configuration = configuration,
- pluginsOverride = pluginsOverride,
- assertions = assertions
- )
- }.exceptionOrNull()
- }
-
- val javaException = java?.let {
- runCatching {
- testTemplateMapInline(
- query = java,
- configuration = configuration,
- pluginsOverride = pluginsOverride,
- assertions = assertions
- )
- }.exceptionOrNull()
- }
-
- if (kotlinException != null && javaException != null) {
- throw AssertionError(
- "Kotlin and Java Code failed assertions\n" +
- "Kotlin: ${kotlinException.message}\n" +
- "Java : ${javaException.message}",
- kotlinException
- )
- }
-
- if (kotlinException != null) {
- throw AssertionError("Kotlin Code failed assertions", kotlinException)
- }
-
- if (javaException != null) {
- throw AssertionError("Java Code failed assertions", javaException)
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/Asserts.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/Asserts.kt
deleted file mode 100644
index 2854ac7c..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/Asserts.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import kotlin.contracts.ExperimentalContracts
-import kotlin.contracts.contract
-
-// TODO replace with assertIs<T> from kotlin-test as part of #2924
-@OptIn(ExperimentalContracts::class)
-inline fun <reified T> assertIsInstance(obj: Any?): T {
- contract {
- returns() implies (obj is T)
- }
-
- if (obj is T) {
- return obj
- }
-
- throw AssertionError("Expected instance of type ${T::class.qualifiedName} but found $obj")
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAccessorNamingTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAccessorNamingTest.kt
deleted file mode 100644
index 95ce4d27..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAccessorNamingTest.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jsoup.Jsoup
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-internal class JavadocAccessorNamingTest : AbstractJavadocTemplateMapTest() {
-
- val configuration = dokkaConfiguration {
- suppressObviousFunctions = true
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin")
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
-
- /**
- * This is a quick sanity check for the AccessorMethodNamingTest
- */
- @Test
- fun verifySpecialIsRuleIsApplied() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- /src/main/kotlin/sample/TestCase.kt
- package sample
-
- /**
- * Test links:
- * - [TestCase.issuesFetched]
- * - [TestCase.isFoo]
- */
- data class TestCase(
- var issuesFetched: Int,
- var isFoo: String,
- )
- """.trimIndent(),
- configuration,
- cleanupOutput = false,
- pluginOverrides = listOf(writerPlugin, JavadocPlugin())
- ) {
- renderingStage = { _, _ ->
- val html = writerPlugin.writer.contents.getValue("sample/TestCase.html").let { Jsoup.parse(it) }
- val props = html
- .select("#memberSummary_tabpanel")
- .select("th[scope=row].colSecond")
- .select("code")
- .map { it.text() }
- .toSet()
- // In K2 name of accessors parameter is `value`
- assertTrue(
- setOf(
- "getIssuesFetched()",
- "setIssuesFetched(Integer issuesFetched)",
- "isFoo()",
- "setFoo(String isFoo)",
- ) == props || setOf(
- "getIssuesFetched()",
- "setIssuesFetched(Integer value)",
- "isFoo()",
- "setFoo(String value)",
- ) == props
- )
-
- val descriptionLinks = html
- .select("div.description")
- .select("p")
- .select("a")
- .eachAttr("href")
- .map { a -> a.takeLastWhile { it != '#' } }
-
- assertEquals(setOf(
- "issuesFetched",
- "isFoo()",
- ), descriptionLinks.toSet())
-
- // Make sure that the ids from above actually exist
- assertEquals(1, html.select("[id = isFoo()]").size)
- // Bug! Nothing in the doc has the right id
- assertEquals(0, html.select("[id = issuesFetched]").size)
- }
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAllClassesTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAllClassesTemplateMapTest.kt
deleted file mode 100644
index 8d7ff1ea..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocAllClassesTemplateMapTest.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.AllClassesPage
-import org.jetbrains.dokka.javadoc.pages.LinkJavadocListEntry
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.pages.ContentKind
-import org.junit.jupiter.api.Tag
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocAllClassesTemplateMapTest : AbstractJavadocTemplateMapTest() {
- @Test
- @Tag("onlyDescriptors") // https://github.com/Kotlin/dokka/issues/3250
- fun `two classes from different packages`() {
- dualTestTemplateMapInline(
- """
- /src/source0.kt
- package package0
- /**
- * Documentation for ClassA
- */
- class ClassA
-
- /src/source1.kt
- package package1
- /**
- * Documentation for ClassB
- */
- class ClassB
- """
- ) {
- val map = singlePageOfType<AllClassesPage>().templateMap
- assertEquals("main", map["kind"])
- assertEquals("All Classes", map["title"])
-
- val list = assertIsInstance<List<*>>(map["list"])
- assertEquals(2, list.size, "Expected two classes")
-
- val classA = assertIsInstance<LinkJavadocListEntry>(list[0])
- assertEquals("ClassA", classA.name)
- assertEquals(DRI("package0", "ClassA"), classA.dri.single())
- assertEquals(ContentKind.Classlikes, classA.kind)
-
- val classB = assertIsInstance<LinkJavadocListEntry>(list[1])
- assertEquals("ClassB", classB.name)
- assertEquals(DRI("package1", "ClassB"), classB.dri.single())
- assertEquals(ContentKind.Classlikes, classB.kind)
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt
deleted file mode 100644
index fd382d42..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.JavadocClasslikePageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocClasslikeTemplateMapTest : AbstractJavadocTemplateMapTest() {
-
- @Test
- fun `empty class`() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- /**
- * Documentation for TestClass
- */
- class TestClass
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0;
- /**
- * Documentation for TestClass
- */
- public final class TestClass {}
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- assertEquals("TestClass", map["name"])
- assertEquals("TestClass", map["title"])
- assertEquals("com.test.package0", map["packageName"])
- assertEquals("<p>Documentation for TestClass</p>", map["classlikeDocumentation"])
- assertEquals("Documentation for TestClass", map["subtitle"])
- assertEquals("public final class <a href=TestClass.html>TestClass</a>", map.signatureWithModifiers())
- }
- }
-
- @Test
- fun `single function`() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- /**
- * Documentation for TestClass
- */
- class TestClass {
- /**
- * Documentation for testFunction
- */
- fun testFunction(): String = ""
- }
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0
- /**
- * Documentation for TestClass
- */
- public final class TestClass {
- /**
- * Documentation for testFunction
- */
- public final String testFunction() {
- return "";
- }
- }
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
-
- assertEquals("TestClass", map["name"])
- assertEquals("TestClass", map["title"])
- assertEquals("com.test.package0", map["packageName"])
- assertEquals("<p>Documentation for TestClass</p>", map["classlikeDocumentation"])
- assertEquals("Documentation for TestClass", map["subtitle"])
- assertEquals("public final class", map.modifiers())
- assertEquals("<a href=TestClass.html>TestClass</a>", map.signatureWithoutModifiers())
-
- val methods = assertIsInstance<Map<Any, Any?>>(map["methods"])
- val ownMethods = assertIsInstance<List<*>>(methods["own"])
- assertEquals(1, ownMethods.size, "Expected only one method")
- val method = assertIsInstance<Map<String, Any?>>(ownMethods.single())
- assertEquals("Documentation for testFunction", method["brief"])
- assertEquals("testFunction", method["name"])
- assertEquals(
- 0, assertIsInstance<List<*>>(method["parameters"]).size,
- "Expected no parameters"
- )
- assertEquals("final <a href=https://docs.oracle.com/javase/8/docs/api/java/lang/String.html>String</a>", method.modifiers())
- assertEquals("<a href=TestClass.html#testFunction()>testFunction</a>()", method.signatureWithoutModifiers())
- }
- }
-
- @Test
- fun `class with annotation`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- @MustBeDocumented
- annotation class Author(val name: String)
-
- @Author(
- name = "Benjamin Franklin"
- )
- class TestClass {`
-
- @Author(
- name = "Franklin D. Roosevelt"
- )
- fun testFunction(): String = ""
- }
- """,
- java =
- """
- /src/com/test/package0/Author.java
- package com.test.package0
- import java.lang.annotation.Documented;
-
- @Documented
- public @interface Author {
- String name();
- }
- /src/com/test/package0/TestClass.java
- package com.test.package0
-
- @Author(
- name = "Benjamin Franklin"
- )
- public final class TestClass {
-
- @Author(
- name = "Franklin D. Roosevelt"
- )
- public final String testFunction() {
- return "";
- }
- }
- """
- ){
- val map = allPagesOfType<JavadocClasslikePageNode>().first { it.name == "TestClass" }.templateMap
- assertEquals("TestClass", map["name"])
- val signature = assertIsInstance<Map<String, Any?>>(map["signature"])
- assertEquals("@<a href=Author.html>Author</a>(name = &quot;Benjamin Franklin&quot;)", signature["annotations"])
-
- val methods = assertIsInstance<Map<Any, Any?>>(map["methods"])
- val ownMethods = assertIsInstance<List<*>>(methods["own"])
- val method = assertIsInstance<Map<String, Any?>>(ownMethods.single())
- val methodSignature = assertIsInstance<Map<String, Any?>>(method["signature"])
- assertEquals("@<a href=Author.html>Author</a>(name = &quot;Franklin D. Roosevelt&quot;)", methodSignature["annotations"])
- }
- }
-
- @Test
- fun `simple enum`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- enum class ClockDays {
- /**
- * Sample docs for first
- */
- FIRST,
- /**
- * Sample docs for second
- */
- SECOND
- }
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0;
- public enum ClockDays {
- /**
- * Sample docs for first
- */
- FIRST,
- /**
- * Sample docs for second
- */
- SECOND
- }
- """
- ){
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- assertEquals("ClockDays", map["name"])
- assertEquals("enum", map["kind"])
- val entries = assertIsInstance<List<Map<String, Any?>>>(map["entries"])
- assertEquals(2, entries.size)
-
- val (first, second) = entries.sortedBy { it["brief"] as String }
- assertEquals("<p>Sample docs for first</p>", first["brief"])
- assertEquals("<p>Sample docs for second</p>", second["brief"])
-
- assertEquals("<a href=ClockDays.html#FIRST>FIRST</a>", first.signatureWithoutModifiers())
- assertEquals("<a href=ClockDays.html#SECOND>SECOND</a>", second.signatureWithoutModifiers())
- }
- }
-
- @Test
- fun `documented function parameters`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- class TestClass {
- /**
- * Simple parameters list to check out
- * @param simple simple String parameter
- * @param parameters simple Integer parameter
- * @param list simple Boolean parameter
- * @return just a String
- */
- fun testFunction(simple: String?, parameters: Int?, list: Boolean?): String {
- return ""
- }
- }
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0;
- public final class TestClass {
- /**
- * Simple parameters list to check out
- * @param simple simple String parameter
- * @param parameters simple Integer parameter
- * @param list simple Boolean parameter
- * @return just a String
- */
- public final String testFunction(String simple, Integer parameters, Boolean list) {
- return "";
- }
- }
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- assertEquals("TestClass", map["name"])
-
- val methods = assertIsInstance<Map<String, Any?>>(map["methods"])
- val testFunction = assertIsInstance<List<Map<String, Any?>>>(methods["own"]).single()
- assertEquals("Simple parameters list to check out", testFunction["brief"])
-
- val (first, second, third) = assertIsInstance<List<Map<String, Any?>>>(testFunction["parameters"])
- assertParameterNode(
- node = first,
- expectedName = "simple",
- expectedType = "<a href=https://docs.oracle.com/javase/8/docs/api/java/lang/String.html>String</a>",
- expectedDescription = "simple String parameter"
- )
- assertParameterNode(
- node = second,
- expectedName = "parameters",
- expectedType = "<a href=https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html>Integer</a>",
- expectedDescription = "simple Integer parameter"
- )
- assertParameterNode(
- node = third,
- expectedName = "list",
- expectedType = "<a href=https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html>Boolean</a>",
- expectedDescription = "simple Boolean parameter"
- )
- }
- }
-
- @Test
- fun `with generic parameters`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- import java.io.Serializable
-
- class Generic<T : Serializable?> {
- fun <D : T> sampleFunction(): D = TODO()
- }
- """,
- java =
- """
- /src/com/test/package0/Generic.java
- package com.test.package0;
- import java.io.Serializable;
-
- public final class Generic<T extends Serializable> {
- public final <D extends T> D sampleFunction(){
- return null;
- }
- }
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- assertEquals("Generic", map["name"])
-
- assertEquals(
- "public final class <a href=Generic.html>Generic</a>&lt;T extends <a href=https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html>Serializable</a>&gt;",
- map.signatureWithModifiers()
- )
- val methods = assertIsInstance<Map<Any, Any?>>(map["methods"])
- val ownMethods = assertIsInstance<List<*>>(methods["own"]).first()
- val sampleFunction = assertIsInstance<Map<String, Any?>>(ownMethods)
-
- assertEquals("final &lt;D extends <a href=Generic.html>T</a>&gt; <a href=Generic.html#sampleFunction()>D</a> <a href=Generic.html#sampleFunction()>sampleFunction</a>()", sampleFunction.signatureWithModifiers())
- }
- }
-
- @Test
- fun `class with top-level const`() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/Test.kt
- package com.test.package0
-
- const val TEST_VAL = "test"
- """,
- java =
- """
- /src/com/test/package0/TestKt.java
- package com.test.package0;
-
- public final class TestKt {
- public static final String TEST_VAL = "test";
- }
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- val properties = assertIsInstance<List<*>>(map["properties"])
- val property = assertIsInstance<Map<String, Any?>>(properties.first())
- assertEquals("public final static <a href=https://docs.oracle.com/javase/8/docs/api/java/lang/String.html>String</a> <a href=TestKt.html#TEST_VAL>TEST_VAL</a>", "${property["modifiers"]} ${property["signature"]}")
- }
- }
-
- @Test
- fun `@author @since @return method tags`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- class TestClass {
- /**
- * Testing @author @since @return method tags
- * @since 1.2
- * @since 08 april 2023
- * @return parameter's value in lower case
- */
- fun testFunction(testParam: String?): String {
- return testParam?.lowercase() ?: ""
- }
- }
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0;
- public final class TestClass {
- /**
- * Testing @author @since @return method tags
- * @since 1.2
- * @since 08 april 2023
- * @return parameter's value in lower case
- */
- public final String testFunction(String testParam) {
- return testParam.toLowerCase();
- }
- }
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- assertEquals("TestClass", map["name"])
-
- val methods = assertIsInstance<Map<String, Any?>>(map["methods"])
- val testFunction = assertIsInstance<List<Map<String, Any?>>>(methods["own"]).single()
- assertEquals("Testing @author @since @return method tags", testFunction["brief"])
-
- assertEquals("testFunction", testFunction["name"])
- assertEquals(listOf("<p>1.2</p>", "<p>08 april 2023</p>"), testFunction["sinceTagContent"])
- assertEquals("<p>parameter's value in lower case</p>", testFunction["returnTagContent"])
- }
- }
-
- @Test
- fun `@author @since class tags`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- /**
- * Testing @author @since class tags
- * @author Test Author
- * @author Test Author2
- * @author Test Author3
- * @since 1.2
- * @since 08 april 2023
- */
- class TestClass {
- fun testFunction(testParam: String?): String {
- return testParam?.lowercase() ?: ""
- }
- }
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0;
- /**
- * Testing @author @since class tags
- * @author Test Author
- * @author Test Author2
- * @author Test Author3
- * @since 1.2
- * @since 08 april 2023
- */
- public final class TestClass {
- public final String testFunction(String testParam) {
- return testParam.toLowerCase();
- }
- }
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
-
- assertEquals("TestClass", map["name"])
- assertEquals("<p>Testing @author @since class tags</p>", map["classlikeDocumentation"])
- assertEquals(listOf("<p>Test Author</p>", "<p>Test Author2</p>", "<p>Test Author3</p>"), map["authorTagContent"])
- assertEquals(listOf("<p>1.2</p>", "<p>08 april 2023</p>"), map["sinceTagContent"])
- }
- }
-
- private fun assertParameterNode(node: Map<String, Any?>, expectedName: String, expectedType: String, expectedDescription: String){
- assertEquals(expectedName, node["name"])
- assertEquals(expectedType, node["type"])
- assertEquals(expectedDescription, node["description"])
- }
-
- private fun Map<String, Any?>.signatureWithModifiers(): String = "${modifiers()} ${signatureWithoutModifiers()}"
-
- @Suppress("UNCHECKED_CAST")
- private fun Map<String, Any?>.signatureWithoutModifiers(): String = (get("signature") as Map<String, Any?>)["signatureWithoutModifiers"] as String
-
- @Suppress("UNCHECKED_CAST")
- private fun Map<String, Any?>.modifiers(): String = (get("signature") as Map<String, Any?>)["modifiers"] as String
-
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocDeprecatedTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocDeprecatedTest.kt
deleted file mode 100644
index 404e1aed..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocDeprecatedTest.kt
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.DeprecatedPage
-import org.jetbrains.dokka.javadoc.renderer.TemplateMap
-import org.junit.jupiter.api.Tag
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocDeprecatedTest : AbstractJavadocTemplateMapTest() {
-
- @Test
- fun `generates correct number of sections`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- @Suppress("UNCHECKED_CAST")
- assertEquals(6, (templateMap["sections"] as List<TemplateMap>).size)
- }
- }
-
- @Test
- fun `finds correct number of element for removal`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- val map = templateMap.section("For Removal")
- assertEquals(1, map.elements().size)
- }
- }
-
- @Test
- fun `finds correct number of deprecated constructors`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- val map = templateMap.section("Constructors")
- assertEquals(1, map.elements().size)
- }
- }
-
- @Test
- fun `finds correct number of deprecated classes`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- val map = templateMap.section("Classes")
- assertEquals(1, map.elements().size)
- }
- }
-
- @Test
- fun `finds correct number of deprecated enums`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- val map = templateMap.section("Enums")
- assertEquals(1, map.elements().size)
- }
- }
-
- @Test
- fun `finds correct number of deprecated exceptions`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- val map = templateMap.section("Exceptions")
- assertEquals(2, map.elements().size)
- }
- }
-
- @Tag("onlyDescriptors") // https://github.com/Kotlin/dokka/issues/3266 - `describeConstable` is in deprecated page on Java 17
- @Test
- fun `finds correct number of deprecated methods`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- //We are checking whether we will have an additional function for enum classes
- fun hasAdditionalFunction() =
- AnnotationTarget.ANNOTATION_CLASS::class.java.methods.any { it.name == "describeConstable" }
-
- val map = templateMap.section("Methods")
- assertEquals(if (hasAdditionalFunction()) 5 else 4, map.elements().size)
- }
- }
-
- @Test
- fun `should be sorted by position`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- @Suppress("UNCHECKED_CAST")
- val contents = (templateMap["sections"] as List<TemplateMap>).map { it["caption"] }
-
- // maybe some other ordering is required by the javadoc spec
- // but it has to be deterministic
- val expected = "Classes, Exceptions, Methods, Constructors, Enums, For Removal"
- val actual = contents.joinToString(separator = ", ")
-
- assertEquals(expected, actual)
- }
- }
-
- @Test
- fun `provides correct information for deprecated element`() {
- testDeprecatedPageTemplateMaps { templateMap ->
- val map = templateMap.section("Enums")
- map.elements().first().let { element ->
- assertEquals("package1.ClassCEnum", element["name"])
- assertEquals("package1/ClassCEnum.html", element["address"])
- assertEquals("Documentation for ClassCEnum", element["description"])
- }
- }
- }
-
- private val query = """
- /src/source0.kt
- package package0
- /**
- * Documentation for ClassA
- */
- @Deprecated("Bo tak")
- class ClassA {
- fun a() {}
- @Deprecated("Bo tak")
- fun b() {}
- fun c() {}
- }
-
- /src/source1.kt
- package package1
- /**
- * Documentation for ClassB
- */
- class ClassB {
- fun d() {}
- @Deprecated("Bo tak")
- fun e() {}
- @Deprecated("Bo tak")
- fun f() {}
- }
-
- /src/source2.kt
- package package1
- /**
- * Documentation for ClassB
- */
- class ClassC {
- fun g() {}
- fun h() {}
- fun j() {}
-
- class InnerClass {
- fun k() {}
- }
- }
-
- /src/source3.kt
- package package1
- /**
- * Documentation for ClassCEnum
- */
- @Deprecated("Bo tak")
- enum class ClassCEnum {
- A, D, E
- }
-
- /src/source4.java
- package package1;
- /**
- * Documentation for ClassJava
- */
- public class ClassJava {
- @Deprecated
- public ClassJava() {}
- @Deprecated(forRemoval = true)
- public void deprecatedMethod() {}
- }
-
- /src/source5.java
- package package1;
- /**
- * Documentation for ClassJavaException
- */
- @Deprecated
- public class ClassJavaException extends Exception { }
-
- /src/source6.kt
- package package1
- /**
- * Documentation for ClassKotlinException
- */
- @Deprecated
- class ClassKotlinException: Exception() {}
- """.trimIndent()
-
- private fun testDeprecatedPageTemplateMaps(operation: (TemplateMap) -> Unit) =
- testTemplateMapInline(query) {
- operation(firstPageOfType<DeprecatedPage>().templateMap)
- }
-
- @Suppress("UNCHECKED_CAST")
- private fun TemplateMap.section(name: String) =
- (this["sections"] as List<TemplateMap>).first { it["caption"] == name }
-
- @Suppress("UNCHECKED_CAST")
- private fun TemplateMap.elements() =
- this["elements"] as List<TemplateMap>
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocIndexTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocIndexTest.kt
deleted file mode 100644
index e574aeac..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocIndexTest.kt
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.IndexPage
-import org.jetbrains.dokka.javadoc.renderer.TemplateMap
-import org.jetbrains.dokka.links.DRI
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-
-internal class JavadocIndexTest : AbstractJavadocTemplateMapTest() {
-
- private val commonTestQuery = """
- /src/source0.kt
- package package0
- /**
- * Documentation for ClassA
- */
- class ClassA {
- fun a() {}
- fun b() {}
- fun c() {}
- }
-
- /src/source1.kt
- package package1
- /**
- * Documentation for ClassB
- */
- class ClassB {
- fun d() {}
- fun e() {}
- fun f() {}
- }
-
- /src/source2.kt
- package package1
- /**
- * Documentation for ClassB
- */
- class ClassC {
- fun g() {}
- fun h() {}
- fun j() {}
-
- class InnerClass {
- fun k() {}
- }
- }
-
- /src/source3.kt
- package package1
- /**
- * Documentation for ClassCEnum
- */
- enum class ClassCEnum {
- A, D, E
- }
- """.trimIndent()
-
- @Test
- fun `generates correct number of index pages`() {
- testIndexPages(commonTestQuery) { indexPages ->
- // index pages with letters of the alphabet, so A, B, C, D, E, etc
- assertEquals(13, indexPages.size)
- }
- }
-
- @Test
- fun `handles correct number of elements`() {
- //We are checking whether we will have an additional function for enum classes
- // e.g. since Java 12 it has `describeConstable`
- fun hasAdditionalFunction() =
- AnnotationTarget.ANNOTATION_CLASS::class.java.methods.any { it.name == "describeConstable" }
-
- testIndexPages(commonTestQuery) { indexPages ->
- assertEquals("A-index: a, A\n" +
- "B-index: b\n" +
- "C-index: c, ClassA, ClassB, ClassC, ClassC.InnerClass, ClassCEnum, compareTo\n" +
- (if (hasAdditionalFunction()) "D-index: d, D, describeConstable\n" else "D-index: d, D\n") +
- "E-index: e, E, equals, equals\n" +
- "F-index: f\n" +
- "G-index: g, getDeclaringClass, getEntries, getName, getOrdinal\n" +
- "H-index: h, hashCode, hashCode\n" +
- "J-index: j\n" +
- "K-index: k\n" +
- "P-index: package0, package1\n" +
- "T-index: toString, toString\n" +
- "V-index: valueOf, values",
- indexPages.joinToString("\n") { it.title + ": " + it.elements.joinToString { it.getId() } })
- assertEquals(if (hasAdditionalFunction()) 34 else 33, indexPages.sumBy { it.elements.size })
- }
- }
-
- @Test
- fun `templateMap for class index`() {
- testIndexPagesTemplateMaps(commonTestQuery) { templateMaps ->
- @Suppress("UNCHECKED_CAST")
- val element = (templateMaps[2]["elements"] as List<TemplateMap>)[1]
- assertEquals("../package0/ClassA.html", element["address"])
- assertEquals("ClassA", element["name"])
- assertEquals("class", element["type"])
- assertEquals("Documentation for ClassA", element["description"])
- assertEquals("package0", element["origin"])
-
- }
- }
-
- @Test
- fun `templateMap for enum entry index`() {
- testIndexPagesTemplateMaps(commonTestQuery) { templateMaps ->
- @Suppress("UNCHECKED_CAST")
- val element = (templateMaps[0]["elements"] as List<TemplateMap>).last()
- assertEquals("../package1/ClassCEnum.html#A", element["address"])
- assertEquals("A", element["name"])
- assertEquals("enum entry", element["type"])
- assertEquals("&nbsp;", element["description"])
- assertEquals("package1.<a href=../package1/ClassCEnum.html>ClassCEnum</a>", element["origin"])
-
- }
- }
-
- @Test
- fun `templateMap for function index`() {
- testIndexPagesTemplateMaps(commonTestQuery) { templateMaps ->
- @Suppress("UNCHECKED_CAST")
- val element = (templateMaps[0]["elements"] as List<TemplateMap>).first()
- assertEquals("../package0/ClassA.html#a()", element["address"])
- assertEquals("a()", element["name"])
- assertEquals("function", element["type"])
- assertEquals("&nbsp;", element["description"])
- assertEquals("package0.<a href=../package0/ClassA.html>ClassA</a>", element["origin"])
-
- }
- }
-
- @Test
- fun `should sort overloaded functions deterministically`() {
- val query = """
- /src/overloaded.kt
- package overloaded
-
- class Clazz {
- fun funName(param: List<String>) {}
- fun funName(param: String) {}
- fun funName(param: Map<String, String>>) {}
- fun funName(param: Int) {}
- }
- """.trimIndent()
-
- testIndexPages(query) { allPages ->
- val indexPage = allPages.find { it.elements.any { el -> el.getId() == "funName" } }
- assertNotNull(indexPage) { "Index page with functions not found" }
-
- val indexElementDRIs = indexPage.elements.map { it.getDRI() }
- assertEquals(4, indexElementDRIs.size)
- indexElementDRIs.forEach {
- assertEquals("overloaded", it.packageName)
- assertEquals("Clazz", it.classNames)
- assertEquals("funName", it.callable!!.name)
- assertEquals(1, it.callable!!.params.size)
- }
-
- assertEquals("kotlin.Int", indexElementDRIs[0].getParam(0))
- assertEquals("kotlin.String", indexElementDRIs[1].getParam(0))
- assertEquals("kotlin.collections.List[kotlin.String]", indexElementDRIs[2].getParam(0))
- assertEquals("kotlin.collections.Map[kotlin.String,kotlin.String]", indexElementDRIs[3].getParam(0))
- }
- }
-
- private fun DRI.getParam(index: Int) = this.callable!!.params[index].toString()
-
- private fun testIndexPages(query: String, operation: (List<IndexPage>) -> Unit) {
- testTemplateMapInline(query) {
- operation(allPagesOfType())
- }
- }
-
- private fun testIndexPagesTemplateMaps(query: String, operation: (List<TemplateMap>) -> Unit) =
- testTemplateMapInline(query) {
- operation(allPagesOfType<IndexPage>().map { it.templateMap })
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocLocationTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocLocationTemplateMapTest.kt
deleted file mode 100644
index 1e11dd39..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocLocationTemplateMapTest.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.JavadocClasslikePageNode
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocLocationTemplateMapTest : AbstractJavadocTemplateMapTest() {
- @Test
- fun `should have correct location to root from class`(){
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- /**
- * Documentation for TestClass
- */
- class TestClass
- """,
- java =
- """
- /src/com/test/package0/TestClass.java
- package com.test.package0;
- /**
- * Documentation for TestClass
- */
- public final class TestClass {}
- """
- ) {
- val map = singlePageOfType<JavadocClasslikePageNode>().templateMap
- assertEquals("TestClass", map["name"])
- assertEquals("TestClass", map["title"])
- //This is taken from the expected location of files based on the package, so:
- //com -> test -> package0
- assertEquals("../../../", map["pathToRoot"])
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocModuleTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocModuleTemplateMapTest.kt
deleted file mode 100644
index 674c9af3..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocModuleTemplateMapTest.kt
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.JavadocModulePageNode
-import org.jetbrains.dokka.javadoc.pages.RowJavadocListEntry
-import org.jetbrains.dokka.links.DRI
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocModuleTemplateMapTest : AbstractJavadocTemplateMapTest() {
-
- @Test
- fun singleEmptyClass() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source.kt
- package com.test.package
- class Test
- """,
- java =
- """
- /src/com/test/package/Source.java
- package com.test.package;
- public class Test { }
- """
- ) {
- val moduleTemplateMap = singlePageOfType<JavadocModulePageNode>().templateMap
- assertEquals("main", moduleTemplateMap["kind"])
- assertEquals("root", moduleTemplateMap["title"])
- assertEquals("", moduleTemplateMap["subtitle"])
- assertEquals("Packages", moduleTemplateMap["tabTitle"])
- assertEquals("Package", moduleTemplateMap["colTitle"])
- assertEquals("", moduleTemplateMap["pathToRoot"])
-
- val list = moduleTemplateMap["list"] as List<*>
- assertEquals(1, list.size, "Expected only one entry in 'list'")
- val rowListEntry = assertIsInstance<RowJavadocListEntry>(list.first())
-
- assertEquals("com.test", rowListEntry.link.name)
- assertEquals(DRI("com.test"), rowListEntry.link.dri.single())
- }
- }
-
- @Test
- fun multiplePackages() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- class Test0
-
- /src/source1.kt
- package com.test.package1
- class Test1
- """,
- java =
- """
- /src/com/test/package0/Test0.java
- package com.test.package0;
- public class Test0 {}
-
- /src/com/test/package1/Test1.java
- package com.test.package1;
- public class Test1 {}
- """,
- configuration = config.copy(moduleVersion = "1.2.3-SNAPSHOT")
- ) {
- val moduleTemplateMap = singlePageOfType<JavadocModulePageNode>().templateMap
- assertEquals("1.2.3-SNAPSHOT", moduleTemplateMap["version"])
- val list = assertIsInstance<List<*>>(moduleTemplateMap["list"])
- assertEquals(2, list.size, "Expected two entries in 'list'")
- assertEquals("com.test.package0", assertIsInstance<RowJavadocListEntry>(list[0]).link.name)
- assertEquals("com.test.package1", assertIsInstance<RowJavadocListEntry>(list[1]).link.name)
- assertEquals(DRI("com.test.package0"), assertIsInstance<RowJavadocListEntry>(list[0]).link.dri.single())
- assertEquals(DRI("com.test.package1"), assertIsInstance<RowJavadocListEntry>(list[1]).link.dri.single())
- }
- }
-
- @Test
- fun `single class with module documentation (kotlin)`() {
- testTemplateMapInline(
- query =
- """
- /src/module.md
- # Module module1
- ABC
-
- /src/source0.kt
- package com.test.package0
- class Test
- """,
- configuration = config.copy(
- sourceSets = config.sourceSets.map { sourceSet ->
- sourceSet.copy(
- includes = setOf(File("src/module.md"))
- )
- },
- moduleName = "module1"
- )
- ) {
- val modulePage = singlePageOfType<JavadocModulePageNode>()
-
- val map = modulePage.templateMap
- assertEquals("<p>ABC</p>", map["subtitle"].toString().trim())
- }
- }
-
- @Test
- fun `single class with long module documentation (kotlin)`() {
- testTemplateMapInline(
- query =
- """
- /src/module.md
- # Module module1
- Aliquam rerum est vel. Molestiae eos expedita animi repudiandae sed commodi.
- Omnis qui ducimus ut et perspiciatis sint.
-
- Veritatis nam eaque sequi laborum voluptas voluptate aut.
-
- /src/source0.kt
- package com.test.package0
- class Test
- """,
- configuration = config.copy(
- sourceSets = config.sourceSets.map { sourceSet ->
- sourceSet.copy(
- includes = setOf(File("src/module.md"))
- )
- },
- moduleName = "module1"
- )
- ) {
- val modulePage = singlePageOfType<JavadocModulePageNode>()
-
- val map = modulePage.templateMap
- val expectedText = """
- <p>Aliquam rerum est vel. Molestiae eos expedita animi repudiandae sed commodi.
- Omnis qui ducimus ut et perspiciatis sint.</p>
- <p>Veritatis nam eaque sequi laborum voluptas voluptate aut.</p>
- """.trimIndent().replace("\n", "")
- assertEquals(expectedText, map["subtitle"].toString().trim())
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocPackageTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocPackageTemplateMapTest.kt
deleted file mode 100644
index 12e2485e..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocPackageTemplateMapTest.kt
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc
-
-import org.jetbrains.dokka.javadoc.pages.JavadocContentKind
-import org.jetbrains.dokka.javadoc.pages.JavadocPackagePageNode
-import org.jetbrains.dokka.javadoc.pages.RowJavadocListEntry
-import org.jetbrains.dokka.links.DRI
-import java.io.File
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocPackageTemplateMapTest : AbstractJavadocTemplateMapTest() {
-
- @Test
- @Suppress("UNCHECKED_CAST")
- fun `single class`() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source.kt
- package com.test.package0
- class Test
- """,
- java =
- """
- /src/com/test/package0/Test.java
- package com.test.package0;
- public class Test {}
- """
- ) {
- val map = singlePageOfType<JavadocPackagePageNode>().templateMap
- assertEquals("Class Summary", ((map["lists"] as List<*>).first() as Map<String, *>)["tabTitle"])
- assertEquals("Class", ((map["lists"] as List<*>).first() as Map<String, *>)["colTitle"])
- assertEquals("Package com.test.package0", map["title"])
- assertEquals("", map["subtitle"])
- assertEquals("package", map["kind"])
-
- val list = assertIsInstance<List<*>>(((map["lists"] as List<*>).first() as Map<String, *>)["list"])
- val entry = assertIsInstance<RowJavadocListEntry>(list.single())
- assertEquals("Test", entry.link.name)
- assertEquals(JavadocContentKind.Class, entry.link.kind)
- assertEquals(DRI("com.test.package0", "Test"), entry.link.dri.single())
- }
- }
-
- @Test
- @Suppress("UNCHECKED_CAST")
- fun `multiple packages`() {
- dualTestTemplateMapInline(
- kotlin =
- """
- /src/source0.kt
- package com.test.package0
- class Test0
-
- /src/source1.kt
- package com.test.package1
- class Test1
- """,
- java =
- """
- /src/com/test/package0/Test0.java
- package com.test.package0;
- public class Test0 {}
-
- /src/com/test/package1/Test1.java
- package com.test.package1;
- public class Test1 {}
- """
- ) {
- val packagePages = allPagesOfType<JavadocPackagePageNode>()
- packagePages.forEach { page ->
- val map = page.templateMap
- assertEquals("Class Summary", ((map["lists"] as List<*>).first() as Map<String, *>)["tabTitle"])
- assertEquals("Class", ((map["lists"] as List<*>).first() as Map<String, *>)["colTitle"])
- assertEquals("", map["subtitle"])
- assertEquals("package", map["kind"])
- }
-
- assertEquals(2, packagePages.size, "Expected two package pages")
- }
- }
-
- @Test
- fun `single class with package documentation (java)`() {
- testTemplateMapInline(
- query =
- """
- /src/com/test/package0/package-info.java
- /**
- * ABC
- */
- package com.test.package0;
-
- /src/com/test/package0/Test.java
- package com.test.package0;
- public class Test{}
- """
- ) {
- val packagePage = singlePageOfType<JavadocPackagePageNode>()
-
- val map = packagePage.templateMap
- assertEquals("<p>ABC</p>", map["subtitle"].toString().trim())
- }
- }
-
- @Test
- fun `single class with package documentation (kotlin)`() {
- testTemplateMapInline(
- query =
- """
- /src/packages.md
- # Package com.test.package0
- ABC
-
- /src/source0.kt
- package com.test.package0
- class Test
- """,
- configuration = config.copy(
- sourceSets = config.sourceSets.map { sourceSet ->
- sourceSet.copy(
- includes = setOf(File("src/packages.md"))
- )
- }
- )
- ) {
- val packagePage = singlePageOfType<JavadocPackagePageNode>()
-
- val map = packagePage.templateMap
- assertEquals("<p>ABC</p>", map["subtitle"].toString().trim())
- }
- }
-
- @Test
- fun `single class with long package documentation (java)`() {
- testTemplateMapInline(
- query =
- """
- /src/com/test/package0/package-info.java
- /**
- * Aliquam rerum est vel. Molestiae eos expedita animi repudiandae sed commodi.
- * Omnis qui ducimus ut et perspiciatis sint.
- *
- * Veritatis nam eaque sequi laborum voluptas voluptate aut.
- */
- package com.test.package0;
-
- /src/com/test/package0/Test.java
- package com.test.package0;
- public class Test{}
- """
- ) {
- val packagePage = singlePageOfType<JavadocPackagePageNode>()
-
- val map = packagePage.templateMap
- val expectedText = """
- <p>Aliquam rerum est vel. Molestiae eos expedita animi repudiandae sed commodi.
- Omnis qui ducimus ut et perspiciatis sint.
- Veritatis nam eaque sequi laborum voluptas voluptate aut.</p>
- """.trimIndent().replace("\n", "")
- assertEquals(expectedText, map["subtitle"].toString().trim())
- }
- }
-
- @Test
- fun `single class with long package documentation (kotlin)`() {
- testTemplateMapInline(
- query =
- """
- /src/packages.md
- # Package com.test.package0
- Aliquam rerum est vel. Molestiae eos expedita animi repudiandae sed commodi.
- Omnis qui ducimus ut et perspiciatis sint.
-
- Veritatis nam eaque sequi laborum voluptas voluptate aut.
-
- /src/source0.kt
- package com.test.package0
- class Test
- """,
- configuration = config.copy(
- sourceSets = config.sourceSets.map { sourceSet ->
- sourceSet.copy(
- includes = setOf(File("src/packages.md"))
- )
- }
- )
- ) {
- val packagePage = singlePageOfType<JavadocPackagePageNode>()
-
- val map = packagePage.templateMap
- val expectedText = """
- <p>Aliquam rerum est vel. Molestiae eos expedita animi repudiandae sed commodi.
- Omnis qui ducimus ut et perspiciatis sint.</p>
- <p>Veritatis nam eaque sequi laborum voluptas voluptate aut.</p>
- """.trimIndent().replace("\n", "")
- assertEquals(expectedText, map["subtitle"].toString().trim())
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocTest.kt
deleted file mode 100644
index 4dd61777..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocTest.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLinkingTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLinkingTest.kt
deleted file mode 100644
index fac8edea..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLinkingTest.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.location
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.jdk
-import org.jetbrains.dokka.kotlinStdlib
-import org.jetbrains.dokka.model.doc.DocumentationLink
-import org.jetbrains.dokka.model.doc.Text
-import org.jetbrains.dokka.utilities.cast
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavadocLinkingTest : BaseAbstractTest() {
-
- @Test
- fun lineBrokenLink() {
- val config = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("jvmSrc/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- DokkaConfiguration.ExternalDocumentationLink.kotlinStdlib(),
- )
- analysisPlatform = "jvm"
- }
- }
- }
- testInline(
- """
- |/jvmSrc/javadoc/test/SomeClass.kt
- |
- |package example
- |
- |class SomeClass {
- | fun someFun(x: Int): Int = 1
- |}
- |
- |/jvmSrc/javadoc/test/SomeJavaDocExample.java
- |
- |package example;
- |
- |/**
- | * Here comes some comment
- | *
- | * {@link example.SomeClass#someFun(int) someName(ads,
- | * dsa)}
- | *
- | * longer comment
- | */
- |public class SomeJavaDocExample {
- | public void someFunc(int integer, Object object) {
- | }
- |}
- """.trimMargin(),
- config,
- pluginOverrides = listOf(TestOutputWriterPlugin())
- ) {
- documentablesMergingStage = {
- it.packages.single()
- .classlikes.single { classlike -> classlike.name == "SomeJavaDocExample" }
- .documentation.values.single()
- .children.single()
- .children.single()
- .children.single {
- it is DocumentationLink
- }.children.filterIsInstance<Text>().single { it.body.contains("someName") }.cast<Text>().body.run {
- assertEquals("someName(ads, dsa)", this)
- }
- }
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt
deleted file mode 100644
index bef81372..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.location
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.javadoc.JavadocPlugin
-import org.jetbrains.dokka.javadoc.pages.JavadocClasslikePageNode
-import org.jetbrains.dokka.javadoc.pages.JavadocFunctionNode
-import org.jetbrains.dokka.javadoc.pages.JavadocPackagePageNode
-import org.jetbrains.dokka.javadoc.renderer.JavadocContentToHtmlTranslator
-import org.jetbrains.dokka.jdk
-import org.jetbrains.dokka.kotlinStdlib
-import org.jetbrains.dokka.model.firstChildOfType
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavadocLocationTest : BaseAbstractTest() {
-
- @Test
- fun `resolved signature with external links`() {
- val query = """
- |/jvmSrc/javadoc/test/Test.kt
- |package javadoc.test
- |import java.io.Serializable
- |class Test : Serializable, Cloneable {}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val testClass = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
- .firstChildOfType<JavadocClasslikePageNode>()
- assertEquals(
- " implements <a href=https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html>Serializable</a>, <a href=https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html>Cloneable</a>",
- transformer.htmlForContentNode(testClass.signature.supertypes!!, null)
- )
- }
- }
-
- @Test
- fun `resolved signature to no argument function`() {
- val query = """
- |/jvmSrc/javadoc/test/Test.kt
- |package javadoc.test
- |class Test {
- | fun test() {}
- |}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
- .firstChildOfType<JavadocClasslikePageNode> { it.name == "Test" }
- val testFunctionNode = testClassNode.methods.first { it.name == "test" }
- assertEquals(
- """<a href=Test.html#test()>test</a>()""",
- transformer.htmlForContentNode(
- testFunctionNode.signature.signatureWithoutModifiers,
- testClassNode
- )
- )
- }
- }
-
- @Test
- fun `resolved signature to one argument function`() {
- val query = """
- |/jvmSrc/javadoc/test/Test.kt
- |package javadoc.test
- |class Test {
- | fun test2(s: String) {}
- |}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
- .firstChildOfType<JavadocClasslikePageNode> { it.name == "Test" }
- val testFunctionNode = testClassNode.methods.first { it.name == "test2" }
- assertEquals(
- """<a href=Test.html#test2(java.lang.String)>test2</a>(<a href=https://docs.oracle.com/javase/8/docs/api/java/lang/String.html>String</a> s)""",
- transformer.htmlForContentNode(
- testFunctionNode.signature.signatureWithoutModifiers,
- testClassNode
- )
- )
- }
- }
-
- @Test
- fun `resolved signature to generic function`() {
- val query = """
- |/jvmSrc/javadoc/test/Test.kt
- |package javadoc.test
- |class Test<A>() {
- | fun <T> test3(a: A, t: T) {}
- |}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
- .firstChildOfType<JavadocClasslikePageNode> { it.name == "Test" }
- val testFunctionNode = testClassNode.methods.first { it.name == "test3" }
- assertEquals(
- """<a href=Test.html#test3(A,T)>test3</a>(<a href=Test.html>A</a> a, <a href=Test.html#test3(A,T)>T</a> t)""",
- transformer.htmlForContentNode(
- testFunctionNode.signature.signatureWithoutModifiers,
- testClassNode
- )
- )
- }
- }
-
- @Test
- fun `resolved package path`() {
- val query = """
- |/jvmSrc/javadoc/test/Test.kt
- |package javadoc.test
- |class Test {}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val locationProvider = dokkaContext.plugin<JavadocPlugin>().querySingle { locationProviderFactory }
- .getLocationProvider(rootPageNode)
- val packageNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
- val packagePath = locationProvider.resolve(packageNode)
-
- assertEquals("javadoc/test/package-summary", packagePath)
- }
- }
-
- @Test
- fun `resolve link from another package`(){
- val query = """
- |/jvmSrc/javadoc/test/Test.kt
- |package javadoc.test
- |class Test {}
- |
- |/jvmSrc/another/javadoc/example/Referenced.kt
- |package javadoc.example.another
- |
- |/**
- | * Referencing element from another package: [javadoc.test.Test]
- | */
- |class Referenced {}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.example.another" }
- .firstChildOfType<JavadocClasslikePageNode> { it.name == "Referenced" }
- assertEquals(
- """<p>Referencing element from another package: <a href=../../test/Test.html>javadoc.test.Test</a></p>""",
- transformer.htmlForContentNode(
- testClassNode.description.single(),
- testClassNode
- )
- )
- }
- }
-
- @Test
- fun `should resolve typealias function parameter`() {
- val query = """
- |/jvmSrc/javadoc/test/FunctionParameters.kt
- |package javadoc.test.functionparams
- |
- |typealias StringTypealias = String
- |
- |class FunctionParameters {
- | fun withTypealias(typeAliasParam: StringTypealias) {}
- |}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val methodWithTypealiasParam = rootPageNode.findFunctionNodeWithin(
- packageName = "javadoc.test.functionparams",
- className = "FunctionParameters",
- methodName = "withTypealias"
- )
- val methodSignatureHtml = transformer.htmlForContentNode(methodWithTypealiasParam.signature, null)
-
- val expectedSignatureHtml = "final <a href=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html>Unit</a> " +
- "<a href=javadoc/test/functionparams/FunctionParameters.html#withTypealias(javadoc.test.functionparams.StringTypealias)>withTypealias</a>" +
- "(<a href=https://docs.oracle.com/javase/8/docs/api/java/lang/String.html>String</a> typeAliasParam)"
-
- assertEquals(expectedSignatureHtml, methodSignatureHtml)
- }
- }
-
- @Test
- fun `should resolve definitely non nullable function parameter`() {
- val query = """
- |/jvmSrc/javadoc/test/FunctionParameters.kt
- |package javadoc.test.functionparams
- |
- |class FunctionParameters {
- | fun <T> withDefinitelyNonNullableType(definitelyNonNullable: T & Any) {}
- |}
- """.trimIndent()
-
- locationTestInline(query) { rootPageNode, dokkaContext ->
- val transformer = htmlTranslator(rootPageNode, dokkaContext)
- val methodWithVoidParam = rootPageNode.findFunctionNodeWithin(
- packageName = "javadoc.test.functionparams",
- className = "FunctionParameters",
- methodName = "withDefinitelyNonNullableType"
- )
- val methodSignatureHtml = transformer.htmlForContentNode(methodWithVoidParam.signature, null)
-
- val expectedSignatureHtml = "final &lt;T extends <a href=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html>Any</a>&gt; " +
- "<a href=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html>Unit</a> " +
- "<a href=javadoc/test/functionparams/FunctionParameters.html#withDefinitelyNonNullableType(T)>withDefinitelyNonNullableType</a>" +
- "(<a href=javadoc/test/functionparams/FunctionParameters.html#withDefinitelyNonNullableType(T)>T</a> definitelyNonNullable)"
-
- assertEquals(expectedSignatureHtml, methodSignatureHtml)
- }
- }
-
- private fun RootPageNode.findFunctionNodeWithin(
- packageName: String,
- className: String,
- methodName: String
- ): JavadocFunctionNode {
- return this
- .firstChildOfType<JavadocPackagePageNode> { it.name == packageName }
- .firstChildOfType<JavadocClasslikePageNode> { it.name == className }
- .methods.single { it.name == methodName }
- }
-
- private fun locationTestInline(query: String, testHandler: (RootPageNode, DokkaContext) -> Unit) {
- val config = dokkaConfiguration {
- format = "javadoc"
- sourceSets {
- sourceSet {
- sourceRoots = listOf("jvmSrc/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- DokkaConfiguration.ExternalDocumentationLink.kotlinStdlib()
- )
- analysisPlatform = "jvm"
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- testInline(
- query = query,
- configuration = config,
- cleanupOutput = false,
- pluginOverrides = listOf(JavadocPlugin())
- ) { renderingStage = testHandler }
- }
-
- private fun htmlTranslator(rootPageNode: RootPageNode, dokkaContext: DokkaContext): JavadocContentToHtmlTranslator {
- val locationProvider = dokkaContext.plugin<JavadocPlugin>().querySingle { locationProviderFactory }
- .getLocationProvider(rootPageNode) as JavadocLocationProvider
- return htmlTranslator(dokkaContext, locationProvider)
- }
-
- private fun htmlTranslator(
- dokkaContext: DokkaContext,
- locationProvider: JavadocLocationProvider
- ) = JavadocContentToHtmlTranslator(locationProvider, dokkaContext)
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/packagelist/JavadocPackageListTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/packagelist/JavadocPackageListTest.kt
deleted file mode 100644
index 25883836..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/packagelist/JavadocPackageListTest.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.packagelist
-
-import org.jetbrains.dokka.javadoc.AbstractJavadocTemplateMapTest
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocPackageListTest : AbstractJavadocTemplateMapTest() {
- @Test
- fun `package list should be generated for a flat structure`(){
- val writerPlugin = TestOutputWriterPlugin()
- dualTestTemplateMapInline(
- java = """
- /src/package0/ClassA.java
- package package0
- public class ClassA {
-
- }
-
- /src/package1/ClassB.java
- package package1
- public class ClassB {
- }
- """,
- pluginsOverride = listOf(writerPlugin)
- ){
- val contents = writerPlugin.writer.contents
- val expected = """
- ${'$'}dokka.format:javadoc-v1
- ${'$'}dokka.linkExtension:html
-
- package0
- package1
- """.trimIndent()
- assertEquals(expected, contents["element-list"]?.trimIndent())
- assertEquals(expected, contents["package-list"]?.trimIndent())
- }
- }
-
- @Test
- fun `package list should be generated for nested structure`(){
- val writerPlugin = TestOutputWriterPlugin()
- dualTestTemplateMapInline(
- java = """
- /src/package0/ClassA.java
- package package0
- public class ClassA {
-
- }
-
- /src/package0/package0Inner/ClassB.java
- package package0.package0Inner
- public class ClassB {
- }
-
- /src/package1/package1Inner/package1InnerInner/ClassC.java
- package package1.package1Inner.package1InnerInner
- public class ClassC {
- }
- """,
- pluginsOverride = listOf(writerPlugin)
- ){
- val contents = writerPlugin.writer.contents
- val expected = """
- ${'$'}dokka.format:javadoc-v1
- ${'$'}dokka.linkExtension:html
-
- package0
- package0.package0Inner
- package1.package1Inner.package1InnerInner
- """.trimIndent()
- assertEquals(expected, contents["element-list"]?.trimIndent())
- assertEquals(expected, contents["package-list"]?.trimIndent())
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/search/JavadocIndexSearchTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/search/JavadocIndexSearchTest.kt
deleted file mode 100644
index 074b3487..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/search/JavadocIndexSearchTest.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.search
-
-import org.jetbrains.dokka.javadoc.AbstractJavadocTemplateMapTest
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-internal class JavadocIndexSearchTest : AbstractJavadocTemplateMapTest() {
- @Test
- fun `javadoc index search tag`(){
- val writerPlugin = TestOutputWriterPlugin()
- dualTestTemplateMapInline(
- java = """
- /src/ClassA.java
- package package0;
- /**
- * Documentation for ClassA
- * Defines the implementation of the system Java compiler and its command line equivalent, {@index javac}, as well as javah.
- */
- public class ClassA {
-
- }
- """,
- pluginsOverride = listOf(writerPlugin)
- ) {
- val contents = writerPlugin.writer.contents
- val expectedSearchTagJson = """var tagSearchIndex = [{"p":"package0","c":"ClassA","l":"javac","url":"package0/ClassA.html#javac"}]"""
- assertEquals(expectedSearchTagJson, contents["tag-search-index.js"])
- }
- }
-
- @Test
- fun `javadoc type with member search`(){
- val writerPlugin = TestOutputWriterPlugin()
- dualTestTemplateMapInline(
- java = """
- /src/ClassA.java
- package package0;
- public class ClassA {
- public String propertyOfClassA = "Sample";
-
- public void sampleFunction(){
-
- }
- }
- """,
- pluginsOverride = listOf(writerPlugin)
- ) {
- val contents = writerPlugin.writer.contents
- val expectedPackageJson =
- """var packageSearchIndex = [{"l":"package0","url":"package0/package-summary.html"}, {"l":"All packages","url":"index.html"}]"""
- val expectedClassesJson =
- """var typeSearchIndex = [{"p":"package0","l":"ClassA","url":"package0/ClassA.html"}, {"l":"All classes","url":"allclasses.html"}]"""
- val expectedMembersJson =
- """var memberSearchIndex = [{"p":"package0","c":"ClassA","l":"ClassA()","url":"package0/ClassA.html#ClassA()"}, {"p":"package0","c":"ClassA","l":"sampleFunction()","url":"package0/ClassA.html#sampleFunction()"}, {"p":"package0","c":"ClassA","l":"propertyOfClassA","url":"package0/ClassA.html#propertyOfClassA"}]"""
-
- assertEquals(expectedPackageJson, contents["package-search-index.js"])
- assertEquals(expectedClassesJson, contents["type-search-index.js"])
- assertEquals(expectedMembersJson, contents["member-search-index.js"])
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilterTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilterTest.kt
deleted file mode 100644
index 39dac05d..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/transformers/documentables/JavadocDocumentableJVMSourceSetFilterTest.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.transformers.documentables
-
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JavadocDocumentableJVMSourceSetFilterTest: BaseAbstractTest() {
-
- private val config = dokkaConfiguration {
- format = "javadoc"
- sourceSets {
- sourceSet {
- sourceRoots = listOf("jvmSrc/")
- analysisPlatform = "jvm"
- name = "jvm"
- dependentSourceSets = setOf(DokkaSourceSetID("root", "common"))
- }
- sourceSet {
- sourceRoots = listOf("jsSrc/")
- analysisPlatform = "js"
- name = "js"
- }
- sourceSet {
- sourceRoots = listOf("commonSrc/")
- analysisPlatform = "common"
- name = "common"
- }
- sourceSet {
- sourceRoots = listOf("otherCommonSrc/")
- analysisPlatform = "common"
- name = "otherCommon"
- }
- }
- }
- private val query = """
- /jvmSrc/source0.kt
- package package0
- /**
- * Documentation for ClassA
- */
- class ClassA {
- fun a() {}
- fun b() {}
- fun c() {}
- }
-
- /jsSrc/source1.kt
- package package1
- /**
- * Documentation for ClassB
- */
- class ClassB {
- fun d() {}
- fun e() {}
- fun f() {}
- }
-
- /commonSrc/source2.kt
- package package1
- /**
- * Documentation for ClassC
- */
- class ClassC {
- fun g() {}
- fun h() {}
- fun j() {}
- }
-
- /otherCommonSrc/source3.kt
- package package1
- /**
- * Documentation for ClassD
- */
- class ClassD {
- fun l() {}
- fun m() {}
- fun n() {}
- }
- """.trimIndent()
-
- @Test
- fun `non-jvm and not dependent common source sets are ommited`() {
- testInline(query, config) {
- preMergeDocumentablesTransformationStage = { modules ->
- assertEquals(2, modules.size)
- }
- }
- }
-}
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredCheckerTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredCheckerTest.kt
deleted file mode 100644
index cea32026..00000000
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/validity/MultiplatformConfiguredCheckerTest.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.javadoc.validity
-
-import org.jetbrains.dokka.DokkaConfigurationImpl
-import org.jetbrains.dokka.DokkaException
-import org.jetbrains.dokka.ExternalDocumentationLink
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-
-class MultiplatformConfiguredCheckerTest : BaseAbstractTest() {
-
- val mppConfig: DokkaConfigurationImpl = dokkaConfiguration {
- format = "javadoc"
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/jvm")
- analysisPlatform = "jvm"
- externalDocumentationLinks = listOf(
- ExternalDocumentationLink("https://docs.oracle.com/javase/8/docs/api/"),
- ExternalDocumentationLink("https://kotlinlang.org/api/latest/jvm/stdlib/")
- )
- }
- sourceSet {
- sourceRoots = listOf("src/js")
- analysisPlatform = "js"
- externalDocumentationLinks = listOf(
- ExternalDocumentationLink("https://docs.oracle.com/javase/8/docs/api/"),
- ExternalDocumentationLink("https://kotlinlang.org/api/latest/jvm/stdlib/")
- )
- }
- }
- }
-
- val sppConfig: DokkaConfigurationImpl = dokkaConfiguration {
- format = "javadoc"
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src")
- analysisPlatform = "jvm"
- externalDocumentationLinks = listOf(
- ExternalDocumentationLink("https://docs.oracle.com/javase/8/docs/api/"),
- ExternalDocumentationLink("https://kotlinlang.org/api/latest/jvm/stdlib/")
- )
- }
- }
- }
-
- @Test
- fun `mpp config should fail for javadoc`() {
- testInline(
- """
- |/src/jvm/kotlin/example/Test.kt
- |class Test
- |/src/js/kotlin/example/Test.kt
- |class Test
- """.trimMargin(), mppConfig
- ) {
- verificationStage = { verification ->
- var mppDetected = false
- try {
- verification()
- } catch (e: DokkaException) {
- mppDetected =
- e.localizedMessage == "Pre-generation validity check failed: ${MultiplatformConfiguredChecker.errorMessage}"
- }
- assertTrue(mppDetected, "MPP configuration not detected")
- }
- }
- }
-
- @Test
- fun `spp config should not fail for javadoc`() {
- testInline(
- """
- |/src/main/kotlin/example/Test.kt
- |class Test
- """.trimMargin(), sppConfig
- ) {
- verificationStage = { verification ->
- var mppDetected = false
- try {
- verification()
- } catch (e: DokkaException) {
- mppDetected =
- e.localizedMessage == "Pre-generation validity check failed: ${MultiplatformConfiguredChecker.errorMessage}"
- }
- assertFalse(mppDetected, "SPP taken as multiplatform")
- }
- }
- }
-}
diff --git a/plugins/jekyll/README.md b/plugins/jekyll/README.md
deleted file mode 100644
index 15ad9071..00000000
--- a/plugins/jekyll/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Jekyll plugin
-
-The Jekyll plugin adds the ability to generate documentation in `Jekyll Flavoured Markdown` format. It supports both
-multi-module and multiplatform projects.
-
-The Jekyll plugin is shipped together with the Dokka Gradle Plugin, so you can start using it
-right away with one of the following tasks:
-
-* `dokkaJekyll` - generate documentation for a single-project build or one specific module.
-* `dokkaJekyllMultiModule` - generate documentation for a multi-module project, assemble it together and
- generate navigation page/menu for all the modules.
-
-To use it with Maven or CLI runners, you have to add it as a dependency. You can find it on
-[Maven Central](https://mvnrepository.com/artifact/org.jetbrains.dokka/jekyll-plugin)
-
-**This plugin is at its early stages**, so you may experience issues and encounter bugs. Feel free to
-[report](https://github.com/Kotlin/dokka/issues/new/choose) any errors you see.
diff --git a/plugins/jekyll/api/jekyll.api b/plugins/jekyll/api/jekyll.api
deleted file mode 100644
index 2d75b214..00000000
--- a/plugins/jekyll/api/jekyll.api
+++ /dev/null
@@ -1,16 +0,0 @@
-public final class org/jetbrains/dokka/jekyll/JekyllPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getBriefCommentPreprocessor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJekyllPreprocessors ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPackageListCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getRenderer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getRootCreator ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/jekyll/JekyllRenderer : org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun buildPage (Lorg/jetbrains/dokka/pages/ContentPage;Lkotlin/jvm/functions/Function2;)Ljava/lang/String;
- public synthetic fun getPreprocessors ()Ljava/lang/Iterable;
-}
-
diff --git a/plugins/jekyll/build.gradle.kts b/plugins/jekyll/build.gradle.kts
deleted file mode 100644
index 8ea5ec00..00000000
--- a/plugins/jekyll/build.gradle.kts
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
- implementation(projects.plugins.gfm)
-
- implementation(kotlin("reflect"))
-
- testImplementation(kotlin("test"))
- testImplementation(projects.core.testApi)
-}
-
-registerDokkaArtifactPublication("jekyllPlugin") {
- artifactId = "jekyll-plugin"
-}
diff --git a/plugins/jekyll/jekyll-template-processing/api/jekyll-template-processing.api b/plugins/jekyll/jekyll-template-processing/api/jekyll-template-processing.api
deleted file mode 100644
index 482a0d40..00000000
--- a/plugins/jekyll/jekyll-template-processing/api/jekyll-template-processing.api
+++ /dev/null
@@ -1,6 +0,0 @@
-public final class org/jetbrains/dokka/gfm/templateProcessing/JekyllTemplateProcessingPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getJekyllLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJekyllPartialLocationProvider ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
diff --git a/plugins/jekyll/jekyll-template-processing/build.gradle.kts b/plugins/jekyll/jekyll-template-processing/build.gradle.kts
deleted file mode 100644
index 55f59754..00000000
--- a/plugins/jekyll/jekyll-template-processing/build.gradle.kts
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
- implementation(projects.plugins.jekyll)
- implementation(projects.plugins.allModulesPage)
- implementation(projects.plugins.templating)
- implementation(projects.plugins.gfm)
- implementation(projects.plugins.gfm.gfmTemplateProcessing)
-
- implementation(kotlin("reflect"))
- implementation(libs.kotlinx.coroutines.core)
-
- testImplementation(kotlin("test"))
- testImplementation(projects.core.testApi)
-}
-
-registerDokkaArtifactPublication("dokkaJekyllTemplateProcessing") {
- artifactId = "jekyll-template-processing-plugin"
-}
diff --git a/plugins/jekyll/jekyll-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/JekyllTemplateProcessingPlugin.kt b/plugins/jekyll/jekyll-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/JekyllTemplateProcessingPlugin.kt
deleted file mode 100644
index c5bcd67b..00000000
--- a/plugins/jekyll/jekyll-template-processing/src/main/kotlin/org/jetbrains/dokka/gfm/templateProcessing/JekyllTemplateProcessingPlugin.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.gfm.templateProcessing
-
-import org.jetbrains.dokka.allModulesPage.AllModulesPagePlugin
-import org.jetbrains.dokka.allModulesPage.MultimoduleLocationProvider
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.jekyll.JekyllPlugin
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.Extension
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-
-public class JekyllTemplateProcessingPlugin : DokkaPlugin() {
-
- private val allModulesPagePlugin by lazy { plugin<AllModulesPagePlugin>() }
-
- private val jekyllPlugin by lazy { plugin<JekyllPlugin>() }
- private val gfmTemplatingPlugin by lazy { plugin<GfmTemplateProcessingPlugin>() }
-
- private val dokkaBase by lazy { plugin<DokkaBase>() }
-
- public val jekyllLocationProvider: Extension<LocationProviderFactory, *, *> by extending {
- dokkaBase.locationProviderFactory providing MultimoduleLocationProvider::Factory override listOf(
- jekyllPlugin.locationProvider,
- gfmTemplatingPlugin.gfmLocationProvider
- )
- }
-
- public val jekyllPartialLocationProvider: Extension<LocationProviderFactory, *, *> by extending {
- allModulesPagePlugin.partialLocationProviderFactory providing ::DokkaLocationProviderFactory override listOf(
- allModulesPagePlugin.baseLocationProviderFactory,
- gfmTemplatingPlugin.gfmPartialLocationProvider
- )
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/jekyll/jekyll-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/jekyll/jekyll-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index d9584167..00000000
--- a/plugins/jekyll/jekyll-template-processing/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.gfm.templateProcessing.JekyllTemplateProcessingPlugin
diff --git a/plugins/jekyll/src/main/kotlin/JekyllPlugin.kt b/plugins/jekyll/src/main/kotlin/JekyllPlugin.kt
deleted file mode 100644
index 733c81bb..00000000
--- a/plugins/jekyll/src/main/kotlin/JekyllPlugin.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.jekyll
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.renderers.PackageListCreator
-import org.jetbrains.dokka.base.renderers.RootCreator
-import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory
-import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat
-import org.jetbrains.dokka.gfm.GfmPlugin
-import org.jetbrains.dokka.gfm.renderer.BriefCommentPreprocessor
-import org.jetbrains.dokka.gfm.renderer.CommonmarkRenderer
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.renderers.PostAction
-import org.jetbrains.dokka.renderers.Renderer
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class JekyllPlugin : DokkaPlugin() {
-
- public val jekyllPreprocessors: ExtensionPoint<PageTransformer> by extensionPoint<PageTransformer>()
-
- private val dokkaBase by lazy { plugin<DokkaBase>() }
-
- private val gfmPlugin by lazy { plugin<GfmPlugin>() }
-
- public val renderer: Extension<Renderer, *, *> by extending {
- (CoreExtensions.renderer
- providing { JekyllRenderer(it) }
- override plugin<GfmPlugin>().renderer)
- }
-
- public val rootCreator: Extension<PageTransformer, *, *> by extending {
- jekyllPreprocessors with RootCreator
- }
-
- public val briefCommentPreprocessor: Extension<PageTransformer, *, *> by extending {
- jekyllPreprocessors with BriefCommentPreprocessor()
- }
-
- public val packageListCreator: Extension<PageTransformer, *, *> by extending {
- jekyllPreprocessors providing {
- PackageListCreator(it, RecognizedLinkFormat.DokkaJekyll)
- } order { after(rootCreator) }
- }
-
- public val locationProvider: Extension<LocationProviderFactory, *, *> by extending {
- dokkaBase.locationProviderFactory providing ::DokkaLocationProviderFactory override listOf(gfmPlugin.locationProvider)
- }
-
- internal val alphaVersionNotifier by extending {
- CoreExtensions.postActions providing { ctx ->
- PostAction {
- ctx.logger.info(
- "The Jekyll output format is still in Alpha so you may find bugs and experience migration " +
- "issues when using it. You use it at your own risk."
- )
- }
- }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
-
-public class JekyllRenderer(
- context: DokkaContext
-) : CommonmarkRenderer(context) {
-
- override val preprocessors: List<PageTransformer> = context.plugin<JekyllPlugin>().query { jekyllPreprocessors }
-
- override fun buildPage(page: ContentPage, content: (StringBuilder, ContentPage) -> Unit): String {
- val builder = StringBuilder()
- builder.append("---\n")
- builder.append("title: ${page.name}\n")
- builder.append("---\n")
- content(builder, page)
- return builder.toString()
- }
-}
diff --git a/plugins/jekyll/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/jekyll/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index 563945eb..00000000
--- a/plugins/jekyll/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.jekyll.JekyllPlugin
diff --git a/plugins/kotlin-as-java/README.md b/plugins/kotlin-as-java/README.md
deleted file mode 100644
index e33bd1bb..00000000
--- a/plugins/kotlin-as-java/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Kotlin as Java plugin
-
-With Kotlin as Java plugin applied, all Kotlin signatures will be rendered as Java signatures.
-
-For instance, `fun foo(bar: Bar): Baz` will be rendered as `public final Baz foo(Bar bar)`.
-
-The Kotlin as Java plugin is published to maven central as a
-[separate artifact](https://mvnrepository.com/artifact/org.jetbrains.dokka/kotlin-as-java-plugin):
-
-```text
-org.jetbrains.dokka:kotlin-as-java-plugin:1.9.10
-```
-
-**This plugin is at its early stages**, so you may experience issues and encounter bugs. Feel free to
-[report](https://github.com/Kotlin/dokka/issues/new/choose) any errors you see.
diff --git a/plugins/kotlin-as-java/api/kotlin-as-java.api b/plugins/kotlin-as-java/api/kotlin-as-java.api
deleted file mode 100644
index e7766e36..00000000
--- a/plugins/kotlin-as-java/api/kotlin-as-java.api
+++ /dev/null
@@ -1,103 +0,0 @@
-public final class org/jetbrains/dokka/kotlinAsJava/KotlinAsJavaPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getJavaSignatureProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getJvmNameTransformer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getKotlinAsJavaDocumentableToPageTranslator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getKotlinAsJavaDocumentableTransformer ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/TransformToJavaKt {
- public static final fun transformToJava (Lorg/jetbrains/dokka/model/DClasslike;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DClasslike;
- public static final fun transformToJava (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;Z)Ljava/util/List;
- public static final fun transformToJava (Lorg/jetbrains/dokka/model/DPackage;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DPackage;
- public static final fun transformToJava (Lorg/jetbrains/dokka/model/DProperty;Lorg/jetbrains/dokka/plugability/DokkaContext;ZLjava/lang/String;)Lorg/jetbrains/dokka/model/DProperty;
- public static synthetic fun transformToJava$default (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/plugability/DokkaContext;Ljava/lang/String;ZILjava/lang/Object;)Ljava/util/List;
- public static synthetic fun transformToJava$default (Lorg/jetbrains/dokka/model/DProperty;Lorg/jetbrains/dokka/plugability/DokkaContext;ZLjava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/model/DProperty;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/converters/KotlinToJavaConverter {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/converters/KotlinToJavaConverterKt {
- public static final fun getJvmNameProvider ()Lorg/jetbrains/dokka/kotlinAsJava/transformers/JvmNameProvider;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/signatures/JavaSignatureProvider : org/jetbrains/dokka/base/signatures/JvmSignatureUtils, org/jetbrains/dokka/base/signatures/SignatureProvider {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun annotations (Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun annotationsBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun annotationsInline (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun modifiers (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun parametersBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public fun signature (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/List;
- public fun stylesIfDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public fun toSignatureString (Ljava/util/Collection;)Ljava/lang/String;
- public fun toSignatureString (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun uses (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/signatures/JavaSignatureUtils : org/jetbrains/dokka/base/signatures/JvmSignatureUtils {
- public static final field INSTANCE Lorg/jetbrains/dokka/kotlinAsJava/signatures/JavaSignatureUtils;
- public fun annotations (Lorg/jetbrains/dokka/model/DProperty;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/Documentable;)Ljava/util/Map;
- public fun annotations (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun annotationsBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsBlockWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun annotationsInline (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;)V
- public fun annotationsInlineWithIgnored (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/AnnotationTarget;Ljava/util/Set;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun modifiers (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;)Ljava/util/Map;
- public fun parametersBlock (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/DFunction;Lkotlin/jvm/functions/Function2;)V
- public fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
- public fun stylesIfDeprecated (Lorg/jetbrains/dokka/model/properties/WithExtraProperties;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;)Ljava/util/Set;
- public fun toSignatureString (Ljava/util/Collection;)Ljava/lang/String;
- public fun toSignatureString (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/model/Annotations$Annotation;Lorg/jetbrains/dokka/base/signatures/AtStrategy;Lkotlin/Pair;Ljava/lang/String;)V
- public fun uses (Lorg/jetbrains/dokka/model/DFunction;Lorg/jetbrains/dokka/model/DTypeParameter;)Z
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/transformers/JvmNameDocumentableTransformer : org/jetbrains/dokka/transformers/documentation/DocumentableTransformer {
- public fun <init> ()V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/transformers/JvmNameProvider {
- public fun <init> ()V
- public final fun nameFor (Lorg/jetbrains/dokka/model/Documentable;)Ljava/lang/String;
- public final fun nameForGetter (Lorg/jetbrains/dokka/model/DProperty;)Ljava/lang/String;
- public final fun nameForSetter (Lorg/jetbrains/dokka/model/DProperty;)Ljava/lang/String;
- public final fun nameForSyntheticClass (Lorg/jetbrains/dokka/model/Documentable;)Lorg/jetbrains/dokka/kotlinAsJava/transformers/Name;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/transformers/KotlinAsJavaDocumentableTransformer : org/jetbrains/dokka/transformers/documentation/DocumentableTransformer {
- public fun <init> ()V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;Lorg/jetbrains/dokka/plugability/DokkaContext;)Lorg/jetbrains/dokka/model/DModule;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/transformers/Name {
- public fun <init> (Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;)Lorg/jetbrains/dokka/kotlinAsJava/transformers/Name;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/kotlinAsJava/transformers/Name;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/dokka/kotlinAsJava/transformers/Name;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getFqName ()Ljava/lang/String;
- public final fun getName ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/translators/KotlinAsJavaDocumentableToPageTranslator : org/jetbrains/dokka/transformers/documentation/DocumentableToPageTranslator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/ModulePageNode;
- public synthetic fun invoke (Lorg/jetbrains/dokka/model/DModule;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/kotlinAsJava/translators/KotlinAsJavaPageCreator : org/jetbrains/dokka/base/translators/documentables/DefaultPageCreator {
- public fun <init> (Lorg/jetbrains/dokka/base/DokkaBaseConfiguration;Lorg/jetbrains/dokka/base/transformers/pages/comments/CommentsToContentConverter;Lorg/jetbrains/dokka/base/signatures/SignatureProvider;Lorg/jetbrains/dokka/utilities/DokkaLogger;Ljava/util/List;Lorg/jetbrains/dokka/analysis/kotlin/internal/DocumentableSourceLanguageParser;)V
- public fun pageForProperty (Lorg/jetbrains/dokka/model/DProperty;)Lorg/jetbrains/dokka/pages/MemberPageNode;
-}
-
diff --git a/plugins/kotlin-as-java/build.gradle.kts b/plugins/kotlin-as-java/build.gradle.kts
deleted file mode 100644
index 0b855895..00000000
--- a/plugins/kotlin-as-java/build.gradle.kts
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
- id("org.jetbrains.conventions.base-unit-test")
-}
-
-dependencies {
- compileOnly(projects.core)
- compileOnly(projects.subprojects.analysisKotlinApi)
-
- implementation(projects.plugins.base)
-
- implementation(kotlin("reflect"))
-
- testImplementation(kotlin("test"))
- testImplementation(libs.jsoup)
- testImplementation(projects.plugins.base)
- symbolsTestConfiguration(project(path = ":subprojects:analysis-kotlin-symbols", configuration = "shadow"))
- descriptorsTestConfiguration(project(path = ":subprojects:analysis-kotlin-descriptors", configuration = "shadow"))
- testImplementation(projects.plugins.base.baseTestUtils) {
- exclude(module = "analysis-kotlin-descriptors")
- }
- testImplementation(projects.core.contentMatcherTestUtils)
- testImplementation(projects.core.testApi)
-}
-
-registerDokkaArtifactPublication("kotlinAsJavaPlugin") {
- artifactId = "kotlin-as-java-plugin"
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt b/plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt
deleted file mode 100644
index 3eab0aeb..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/CollectionExtensions.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-// TODO [beresnev] remove this copy-paste and use the same method from stdlib instead after updating to 1.5
-internal inline fun <T, R : Any> Iterable<T>.firstNotNullOfOrNull(transform: (T) -> R?): R? {
- for (element in this) {
- val result = transform(element)
- if (result != null) {
- return result
- }
- }
- return null
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt b/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt
deleted file mode 100644
index 36da34dc..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.kotlinAsJava.signatures.JavaSignatureProvider
-import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameDocumentableTransformer
-import org.jetbrains.dokka.kotlinAsJava.transformers.KotlinAsJavaDocumentableTransformer
-import org.jetbrains.dokka.kotlinAsJava.translators.KotlinAsJavaDocumentableToPageTranslator
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.Extension
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import org.jetbrains.dokka.renderers.PostAction
-import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-
-public class KotlinAsJavaPlugin : DokkaPlugin() {
- public val kotlinAsJavaDocumentableTransformer: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer with KotlinAsJavaDocumentableTransformer()
- }
-
- public val jvmNameTransformer: Extension<DocumentableTransformer, *, *> by extending {
- CoreExtensions.documentableTransformer with JvmNameDocumentableTransformer() order {
- after(kotlinAsJavaDocumentableTransformer)
- }
- }
-
- public val javaSignatureProvider: Extension<SignatureProvider, *, *> by extending {
- with(plugin<DokkaBase>()) {
- signatureProvider providing ::JavaSignatureProvider override kotlinSignatureProvider
- }
- }
-
- public val kotlinAsJavaDocumentableToPageTranslator: Extension<DocumentableToPageTranslator, *, *> by extending {
- CoreExtensions.documentableToPageTranslator providing ::KotlinAsJavaDocumentableToPageTranslator override
- plugin<DokkaBase>().documentableToPageTranslator
- }
-
- internal val alphaVersionNotifier by extending {
- CoreExtensions.postActions providing { ctx ->
- PostAction {
- ctx.logger.info("KotlinAsJava plugin is in Alpha version, use at your own risk, expect bugs and migration issues")
- }
- }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt
deleted file mode 100644
index 260fc25d..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.converters
-
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-
-private const val DEFAULT_COMPANION_NAME = "Companion"
-
-internal fun DObject?.staticFunctionsForJava(): List<DFunction> {
- if (this == null) return emptyList()
- return functions.filter { it.isJvmStatic }
-}
-
-/**
- * @return properties that will be visible as static for java.
- * See [Static fields](https://kotlinlang.org/docs/java-to-kotlin-interop.html#static-fields)
- */
-internal fun DObject?.staticPropertiesForJava(): List<DProperty> {
- if (this == null) return emptyList()
- return properties.filter { it.isJvmField || it.isConst || it.isLateInit }
-}
-
-internal fun DObject.companionInstancePropertyForJava(): DProperty? {
- if (hasNothingToRender()) return null // do not show if companion not rendered
-
- return DProperty(
- name = name ?: DEFAULT_COMPANION_NAME,
- modifier = sourceSets.associateWith { JavaModifier.Final },
- dri = dri.copy(callable = Callable(name ?: DEFAULT_COMPANION_NAME, null, emptyList())),
- documentation = emptyMap(),
- sources = emptyMap(),
- visibility = sourceSets.associateWith {
- JavaVisibility.Public
- },
- type = GenericTypeConstructor(dri, emptyList()),
- setter = null,
- getter = null,
- sourceSets = sourceSets,
- receiver = null,
- generics = emptyList(),
- expectPresentInSet = expectPresentInSet,
- isExpectActual = false,
- extra = PropertyContainer.withAll(sourceSets.map {
- mapOf(it to setOf(ExtraModifiers.JavaOnlyModifiers.Static)).toAdditionalModifiers()
- })
- )
-}
-
-/**
- * Hide companion object if there isn't members of parents.
- * Properties and functions that are moved to outer class are not counted as members.
- */
-internal fun DObject.hasNothingToRender(): Boolean {
- val nonStaticPropsCount = properties.size - staticPropertiesForJava().size
- val nonStaticFunctionsCount = functions.size - staticFunctionsForJava().size
- val classLikesCount = classlikes.size
- val superTypesCount = supertypes.values.firstOrNull()?.size ?: 0
-
- return nonStaticFunctionsCount + nonStaticPropsCount +
- classLikesCount + superTypesCount == 0
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt
deleted file mode 100644
index a8b3a86c..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.converters
-
-import org.jetbrains.dokka.kotlinAsJava.*
-import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameProvider
-import org.jetbrains.dokka.kotlinAsJava.transformers.withCallableName
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.withClass
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-public val jvmNameProvider: JvmNameProvider = JvmNameProvider()
-internal const val OBJECT_INSTANCE_NAME = "INSTANCE"
-
-internal val DProperty.isConst: Boolean
- get() = hasModifier(ExtraModifiers.KotlinOnlyModifiers.Const)
-
-internal val DProperty.isLateInit: Boolean
- get() = hasModifier(ExtraModifiers.KotlinOnlyModifiers.LateInit)
-
-internal val DProperty.isJvmField: Boolean
- get() = jvmField() != null
-
-internal val DFunction.isJvmStatic: Boolean
- get() = jvmStatic() != null
-
-private fun DProperty.hasModifier(modifier: ExtraModifiers.KotlinOnlyModifiers): Boolean =
- extra[AdditionalModifiers]
- ?.content
- ?.any { (_, modifiers) -> modifier in modifiers } == true
-
-public class KotlinToJavaConverter(
- private val context: DokkaContext
-) {
- private val kotlinToJavaMapper by lazy {
- context.plugin<InternalKotlinAnalysisPlugin>().querySingle { kotlinToJavaService }
- }
-
- internal fun DPackage.asJava(): DPackage {
- val syntheticClasses =
- (properties.map { jvmNameProvider.nameForSyntheticClass(it) to it }
- + functions.map { jvmNameProvider.nameForSyntheticClass(it) to it })
- .groupBy({ it.first }) { it.second }
- .map { (syntheticClassName, nodes) ->
- DClass(
- dri = dri.withClass(syntheticClassName.name),
- name = syntheticClassName.name,
- properties = nodes
- .filterIsInstance<DProperty>()
- .filterNot { it.hasJvmSynthetic() }
- .map { it.asJava(true) },
- constructors = emptyList(),
- functions = (
- nodes
- .filterIsInstance<DProperty>()
- .filterNot { it.isConst || it.isJvmField || it.hasJvmSynthetic() }
- .flatMap { it.javaAccessors(relocateToClass = syntheticClassName.name) } +
- nodes
- .filterIsInstance<DFunction>()
- .flatMap { it.asJava(syntheticClassName.name, true) })
- .filterNot { it.hasJvmSynthetic() },
- classlikes = emptyList(),
- sources = emptyMap(),
- expectPresentInSet = null,
- visibility = sourceSets.associateWith {
- JavaVisibility.Public
- },
- companion = null,
- generics = emptyList(),
- supertypes = emptyMap(),
- documentation = emptyMap(),
- modifier = sourceSets.associateWith { JavaModifier.Final },
- sourceSets = sourceSets,
- isExpectActual = false,
- extra = PropertyContainer.empty()
- )
- }
-
- return copy(
- functions = emptyList(),
- properties = emptyList(),
- classlikes = classlikes.map { it.asJava() } + syntheticClasses,
- typealiases = emptyList()
- )
- }
-
- internal fun DProperty.asJava(
- isTopLevel: Boolean = false,
- relocateToClass: String? = null,
- isFromObjectOrCompanion: Boolean = false
- ) =
- copy(
- dri = if (relocateToClass.isNullOrBlank()) {
- dri
- } else {
- dri.withClass(relocateToClass)
- },
- modifier = javaModifierFromSetter(),
- visibility = visibility.mapValues {
- if (isConst || isJvmField || (getter == null && setter == null) || (isFromObjectOrCompanion && isLateInit)) {
- it.value.asJava()
- } else {
- it.value.propertyVisibilityAsJava()
- }
- },
- type = type.asJava(), // TODO: check
- setter = null,
- getter = null, // Removing getters and setters as they will be available as functions
- extra = if (isTopLevel || isConst || (isFromObjectOrCompanion && isJvmField) || (isFromObjectOrCompanion && isLateInit))
- extra + extra.mergeAdditionalModifiers(
- sourceSets.associateWith {
- setOf(ExtraModifiers.JavaOnlyModifiers.Static)
- }
- )
- else extra
- )
-
- internal fun Visibility.asJava() =
- when (this) {
- is JavaVisibility -> this
- is KotlinVisibility.Public, KotlinVisibility.Internal -> JavaVisibility.Public
- is KotlinVisibility.Private -> JavaVisibility.Private
- is KotlinVisibility.Protected -> JavaVisibility.Protected
- }
-
- internal fun DProperty.javaModifierFromSetter() =
- modifier.mapValues {
- when {
- it.value is JavaModifier -> it.value
- setter == null -> JavaModifier.Final
- else -> JavaModifier.Empty
- }
- }
-
- internal fun DProperty.javaAccessors(
- isTopLevel: Boolean = false,
- relocateToClass: String? = null
- ): List<DFunction> =
- listOfNotNull(
- getter?.let { getter ->
- val name = "get" + name.capitalize()
- getter.copy(
- dri = if (relocateToClass.isNullOrBlank()) {
- getter.dri
- } else {
- getter.dri.withClass(relocateToClass)
- }.withCallableName(name),
- name = name,
- modifier = javaModifierFromSetter(),
- visibility = visibility.mapValues { JavaVisibility.Public },
- type = getter.type.asJava(),
- extra = if (isTopLevel) getter.extra +
- getter.extra.mergeAdditionalModifiers(
- sourceSets.associateWith {
- setOf(ExtraModifiers.JavaOnlyModifiers.Static)
- }
- )
- else getter.extra
- )
- },
- setter?.let { setter ->
- val name = "set" + name.capitalize()
- val baseDRI = (if (relocateToClass.isNullOrBlank()) {
- setter.dri
- } else {
- setter.dri.withClass(relocateToClass)
- }).withCallableName(name)
- setter.copy(
- dri = baseDRI,
- name = name,
- parameters = setter.parameters.map {
- it.copy(
- dri = baseDRI.copy(
- target = it.dri.target,
- extra = it.dri.extra
- ), type = it.type.asJava()
- )
- },
- modifier = javaModifierFromSetter(),
- visibility = visibility.mapValues { JavaVisibility.Public },
- type = Void,
- extra = if (isTopLevel) setter.extra + setter.extra.mergeAdditionalModifiers(
- sourceSets.associateWith {
- setOf(ExtraModifiers.JavaOnlyModifiers.Static)
- }
- )
- else setter.extra
- )
- }
- )
-
- private fun DFunction.asJava(
- containingClassName: String,
- newName: String,
- parameters: List<DParameter>,
- isTopLevel: Boolean = false
- ): DFunction {
- return copy(
- dri = dri.copy(classNames = containingClassName, callable = dri.callable?.copy(name = newName)),
- name = newName,
- type = type.asJava(),
- modifier = if (modifier.all { (_, v) -> v is KotlinModifier.Final } && isConstructor)
- sourceSets.associateWith { JavaModifier.Empty }
- else sourceSets.associateWith { modifier.values.first() },
- parameters = listOfNotNull(receiver?.asJava()) + parameters.map { it.asJava() },
- visibility = visibility.map { (sourceSet, visibility) -> Pair(sourceSet, visibility.asJava()) }.toMap(),
- receiver = null,
- extra = if (isTopLevel || isJvmStatic) {
- extra + extra.mergeAdditionalModifiers(
- sourceSets.associateWith {
- setOf(ExtraModifiers.JavaOnlyModifiers.Static)
- }
- )
- } else {
- extra
- }
- )
- }
-
- private fun DFunction.withJvmOverloads(
- containingClassName: String,
- newName: String,
- isTopLevel: Boolean = false
- ): List<DFunction>? {
- val (paramsWithDefaults, paramsWithoutDefaults) = parameters
- .withIndex()
- .partition { (_, p) -> p.extra[DefaultValue] != null }
- return paramsWithDefaults
- .runningFold(paramsWithoutDefaults) { acc, param -> (acc + param) }
- .map { params ->
- asJava(
- containingClassName,
- newName,
- params
- .sortedBy(IndexedValue<DParameter>::index)
- .map { it.value },
- isTopLevel
- )
- }
- .reversed()
- .takeIf { it.isNotEmpty() }
- }
-
- internal fun DFunction.asJava(containingClassName: String, isTopLevel: Boolean = false): List<DFunction> {
- val newName = when {
- isConstructor -> containingClassName
- else -> name
- }
- val baseFunction = asJava(containingClassName, newName, parameters, isTopLevel)
- return if (hasJvmOverloads()) {
- withJvmOverloads(containingClassName, newName, isTopLevel) ?: listOf(baseFunction)
- } else {
- listOf(baseFunction)
- }
- }
-
- internal fun DClasslike.asJava(): DClasslike = when (this) {
- is DClass -> asJava()
- is DEnum -> asJava()
- is DAnnotation -> asJava()
- is DObject -> asJava()
- is DInterface -> asJava()
- else -> throw IllegalArgumentException("$this shouldn't be here")
- }
-
- internal fun DClass.asJava(): DClass = copy(
- constructors = constructors
- .filterNot { it.hasJvmSynthetic() }
- .flatMap {
- it.asJava(
- dri.classNames ?: name
- )
- }, // name may not always be valid here, however classNames should always be not null
- functions = functionsInJava(),
- properties = propertiesInJava(),
- classlikes = classlikesInJava(),
- generics = generics.map { it.asJava() },
- companion = companion?.companionAsJava(),
- supertypes = supertypes.mapValues { it.value.map { it.asJava() } },
- modifier = if (modifier.all { (_, v) -> v is KotlinModifier.Empty }) sourceSets.associateWith { JavaModifier.Final }
- else sourceSets.associateWith { modifier.values.first() }
- )
-
- /**
- * Companion objects requires some custom logic for rendering as Java.
- * They are excluded from usual classlikes rendering and added after.
- */
- internal fun DClass.classlikesInJava(): List<DClasslike> {
- val classlikes = classlikes
- .filter { it.name != companion?.name }
- .map { it.asJava() }
-
- val companionAsJava = companion?.companionAsJava()
- return if (companionAsJava != null) classlikes.plus(companionAsJava) else classlikes
- }
-
-
- internal fun DClass.functionsInJava(): List<DFunction> =
- properties
- .filter { !it.isJvmField && !it.hasJvmSynthetic() }
- .flatMap { property -> listOfNotNull(property.getter, property.setter) }
- .plus(functions)
- .plus(companion.staticFunctionsForJava())
- .filterNot { it.hasJvmSynthetic() }
- .flatMap { it.asJava(it.dri.classNames ?: it.name) }
-
- internal fun DClass.propertiesInJava(): List<DProperty> {
- val propertiesFromCompanion = companion
- .staticPropertiesForJava()
- .filterNot { it.hasJvmSynthetic() }
- .map { it.asJava(isFromObjectOrCompanion = true) }
- val companionInstanceProperty = companion?.companionInstancePropertyForJava()
- val ownProperties = properties
- .filterNot { it.hasJvmSynthetic() }
- .map { it.asJava() }
-
- return propertiesFromCompanion + ownProperties + listOfNotNull(companionInstanceProperty)
- }
-
- private fun DTypeParameter.asJava(): DTypeParameter = copy(
- variantTypeParameter = variantTypeParameter.withDri(dri.possiblyAsJava()),
- bounds = bounds.map { it.asJava() }
- )
-
- private fun Projection.asJava(): Projection = when (this) {
- is Star -> Star
- is Covariance<*> -> copy(inner.asJava())
- is Contravariance<*> -> copy(inner.asJava())
- is Invariance<*> -> copy(inner.asJava())
- is Bound -> asJava()
- }
-
- private fun Bound.asJava(): Bound = when (this) {
- is TypeParameter -> copy(dri.possiblyAsJava())
- is GenericTypeConstructor -> copy(
- dri = dri.possiblyAsJava(),
- projections = projections.map { it.asJava() }
- )
-
- is FunctionalTypeConstructor -> copy(
- dri = dri.possiblyAsJava(),
- projections = projections.map { it.asJava() }
- )
-
- is TypeAliased -> copy(
- typeAlias = typeAlias.asJava(),
- inner = inner.asJava()
- )
-
- is Nullable -> copy(inner.asJava())
- is DefinitelyNonNullable -> copy(inner.asJava())
- is PrimitiveJavaType -> this
- is Void -> this
- is JavaObject -> this
- is Dynamic -> this
- is UnresolvedBound -> this
- }
-
- internal fun DEnum.asJava(): DEnum = copy(
- constructors = constructors.flatMap { it.asJava(dri.classNames ?: name) },
- functions = functions
- .plus(
- properties
- .filter { !it.isJvmField && !it.hasJvmSynthetic() }
- .flatMap { listOf(it.getter, it.setter) }
- )
- .filterNotNull()
- .filterNot { it.hasJvmSynthetic() }
- .flatMap { it.asJava(dri.classNames ?: name) },
- properties = properties
- .filterNot { it.hasJvmSynthetic() }
- .map { it.asJava() },
- classlikes = classlikes.map { it.asJava() },
- supertypes = supertypes.mapValues { it.value.map { it.asJava() } }
-// , entries = entries.map { it.asJava() }
- )
-
- /**
- * Parameters [excludedProps] and [excludedFunctions] used for rendering companion objects
- * where some members (that lifted to outer class) are not rendered
- */
- internal fun DObject.asJava(
- excludedProps: List<DProperty> = emptyList(),
- excludedFunctions: List<DFunction> = emptyList()
- ): DObject = copy(
- functions = functions
- .plus(
- properties
- .filterNot { it in excludedProps }
- .filter { !it.isJvmField && !it.isConst && !it.isLateInit && !it.hasJvmSynthetic() }
- .flatMap { listOf(it.getter, it.setter) }
- )
- .filterNotNull()
- .filterNot { it in excludedFunctions }
- .filterNot { it.hasJvmSynthetic() }
- .flatMap { it.asJava(dri.classNames ?: name.orEmpty()) },
- properties = properties
- .filterNot { it.hasJvmSynthetic() }
- .filterNot { it in excludedProps }
- .map { it.asJava(isFromObjectOrCompanion = true) } +
- DProperty(
- name = OBJECT_INSTANCE_NAME,
- modifier = sourceSets.associateWith { JavaModifier.Final },
- dri = dri.copy(callable = Callable(OBJECT_INSTANCE_NAME, null, emptyList())),
- documentation = emptyMap(),
- sources = emptyMap(),
- visibility = sourceSets.associateWith {
- JavaVisibility.Public
- },
- type = GenericTypeConstructor(dri, emptyList()),
- setter = null,
- getter = null,
- sourceSets = sourceSets,
- receiver = null,
- generics = emptyList(),
- expectPresentInSet = expectPresentInSet,
- isExpectActual = false,
- extra = PropertyContainer.withAll(sourceSets.map {
- mapOf(it to setOf(ExtraModifiers.JavaOnlyModifiers.Static)).toAdditionalModifiers()
- })
- ),
- classlikes = classlikes.map { it.asJava() },
- supertypes = supertypes.mapValues { it.value.map { it.asJava() } }
- )
-
- internal fun DInterface.asJava(): DInterface = copy(
- functions = functions
- .plus(
- properties
- .filter { it.jvmField() == null && !it.hasJvmSynthetic() }
- .flatMap { listOf(it.getter, it.setter) }
- )
- .filterNotNull()
- .filterNot { it.hasJvmSynthetic() }
- .flatMap { it.asJava(dri.classNames ?: name) },
- properties = emptyList(),
- classlikes = classlikes.map { it.asJava() }, // TODO: public static final class DefaultImpls with impls for methods
- generics = generics.map { it.asJava() },
- supertypes = supertypes.mapValues { it.value.map { it.asJava() } }
- )
-
- internal fun DAnnotation.asJava(): DAnnotation = copy(
- properties = properties.map { it.asJava() },
- constructors = emptyList(),
- classlikes = classlikes.map { it.asJava() }
- ) // TODO investigate if annotation class can have methods and properties not from constructor
-
- internal fun DParameter.asJava(): DParameter = copy(
- type = type.asJava(),
- name = if (name.isNullOrBlank()) "\$self" else name
- )
-
- internal fun Visibility.propertyVisibilityAsJava(): Visibility =
- if (this is JavaVisibility) this
- else JavaVisibility.Private
-
- private fun TypeConstructor.possiblyAsJava(): TypeConstructor = when (this) {
- is GenericTypeConstructor -> copy(dri = this.dri.possiblyAsJava())
- is FunctionalTypeConstructor -> copy(dri = this.dri.possiblyAsJava())
- }
-
-
- internal fun TypeConstructorWithKind.asJava(): TypeConstructorWithKind =
- TypeConstructorWithKind(
- typeConstructor = typeConstructor.possiblyAsJava(),
- kind = kind.asJava()
- )
-
- internal fun ClassKind.asJava(): ClassKind {
- return when (this) {
- is JavaClassKindTypes -> this
- KotlinClassKindTypes.CLASS -> JavaClassKindTypes.CLASS
- KotlinClassKindTypes.INTERFACE -> JavaClassKindTypes.INTERFACE
- KotlinClassKindTypes.ENUM_CLASS -> JavaClassKindTypes.ENUM_CLASS
- KotlinClassKindTypes.ENUM_ENTRY -> JavaClassKindTypes.ENUM_ENTRY
- KotlinClassKindTypes.ANNOTATION_CLASS -> JavaClassKindTypes.ANNOTATION_CLASS
- KotlinClassKindTypes.OBJECT -> JavaClassKindTypes.CLASS
- else -> throw IllegalStateException("Non exchaustive match while trying to convert $this to Java")
- }
- }
-
- private fun <T : Documentable> PropertyContainer<T>.mergeAdditionalModifiers(second: SourceSetDependent<Set<ExtraModifiers>>) =
- this[AdditionalModifiers]?.squash(AdditionalModifiers(second)) ?: AdditionalModifiers(second)
-
- private fun AdditionalModifiers.squash(second: AdditionalModifiers) =
- AdditionalModifiers(content + second.content)
-
- internal fun DObject.companionAsJava(): DObject? {
- if (hasNothingToRender()) return null
-
- return asJava(
- excludedProps = staticPropertiesForJava(),
- excludedFunctions = staticFunctionsForJava()
- )
- }
-
- private fun DRI.possiblyAsJava(): DRI {
- return kotlinToJavaMapper.findAsJava(this) ?: this
- }
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmField.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmField.kt
deleted file mode 100644
index 3cf9b8fa..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/jvmField.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-internal fun <T : Documentable> WithExtraProperties<T>.jvmField(): Annotations.Annotation? =
- extra[Annotations]?.directAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations) -> annotations.jvmFieldAnnotation() }
-
-internal fun List<Annotations.Annotation>.jvmFieldAnnotation(): Annotations.Annotation? =
- firstOrNull { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmField" }
-
diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmName.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmName.kt
deleted file mode 100644
index 6561f079..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/jvmName.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.StringValue
-import org.jetbrains.dokka.model.isJvmName
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-internal fun <T : Documentable> WithExtraProperties<T>.directlyAnnotatedJvmName(): Annotations.Annotation? =
- extra[Annotations]?.directAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations)-> annotations.jvmNameAnnotation() }
-
-internal fun <T : Documentable> WithExtraProperties<T>.fileLevelJvmName(): Annotations.Annotation? =
- extra[Annotations]?.fileLevelAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations) -> annotations.jvmNameAnnotation() }
-
-internal fun List<Annotations.Annotation>.jvmNameAnnotation(): Annotations.Annotation? =
- firstOrNull { it.isJvmName() }
-
-internal fun Annotations.Annotation.jvmNameAsString(): String? = (params["name"] as? StringValue)?.value
-
diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt
deleted file mode 100644
index 08fbca07..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/jvmOverloads.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-internal fun <T : Documentable> WithExtraProperties<T>.hasJvmOverloads(): Boolean {
- return extra[Annotations]
- ?.directAnnotations
- ?.entries
- ?.any { (_, annotations) ->
- annotations.any { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmOverloads" }
- } == true
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt
deleted file mode 100644
index a253dc83..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/jvmStatic.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.Documentable
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-internal fun <T : Documentable> WithExtraProperties<T>.jvmStatic(): Annotations.Annotation? =
- extra[Annotations]?.directAnnotations?.entries?.firstNotNullOfOrNull { (_, annotations) -> annotations.jvmStaticAnnotation() }
-
-internal fun List<Annotations.Annotation>.jvmStaticAnnotation(): Annotations.Annotation? =
- firstOrNull { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmStatic" }
-
diff --git a/plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt b/plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt
deleted file mode 100644
index bf2a9ad1..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/jvmSynthetic.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-internal fun <T : org.jetbrains.dokka.model.AnnotationTarget> WithExtraProperties<T>.hasJvmSynthetic(): Boolean {
- return extra[Annotations]
- ?.directAnnotations
- ?.entries
- ?.any { (_, annotations) ->
- annotations.any { it.dri.packageName == "kotlin.jvm" && it.dri.classNames == "JvmSynthetic" }
- } == true
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt b/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt
deleted file mode 100644
index e4c9d5dd..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureProvider.kt
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.signatures
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.signatures.JvmSignatureUtils
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-import org.jetbrains.dokka.pages.ContentKind
-import org.jetbrains.dokka.pages.ContentNode
-import org.jetbrains.dokka.pages.TextStyle
-import org.jetbrains.dokka.pages.TokenStyle
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.DokkaLogger
-import kotlin.text.Typography.nbsp
-
-public class JavaSignatureProvider internal constructor(
- ctcc: CommentsToContentConverter,
- logger: DokkaLogger
-) : SignatureProvider, JvmSignatureUtils by JavaSignatureUtils {
-
- public constructor(context: DokkaContext) : this(
- context.plugin<DokkaBase>().querySingle { commentsToContentConverter },
- context.logger
- )
-
- private val contentBuilder = PageContentBuilder(ctcc, this, logger)
-
- private val ignoredVisibilities = setOf(JavaVisibility.Default)
-
- private val ignoredModifiers =
- setOf(KotlinModifier.Open, JavaModifier.Empty, KotlinModifier.Empty, KotlinModifier.Sealed)
-
- override fun signature(documentable: Documentable): List<ContentNode> = when (documentable) {
- is DFunction -> signature(documentable)
- is DProperty -> signature(documentable)
- is DClasslike -> signature(documentable)
- is DEnumEntry -> signature(documentable)
- is DTypeParameter -> signature(documentable)
- else -> throw NotImplementedError(
- "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}"
- )
- }
-
- private fun signature(e: DEnumEntry) =
- e.sourceSets.map {
- contentBuilder.contentFor(
- e,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = setOf(it)
- ) {
- link(e.name, e.dri, styles = mainStyles + e.stylesIfDeprecated(it))
- }
- }
-
- private fun signature(c: DClasslike) =
- c.sourceSets.map { sourceSet ->
- @Suppress("UNCHECKED_CAST")
- val deprecationStyles = (c as? WithExtraProperties<out Documentable>)
- ?.stylesIfDeprecated(sourceSet)
- ?: emptySet()
-
- contentBuilder.contentFor(
- c,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace),
- sourceSets = setOf(sourceSet)
- ) {
- annotationsBlock(c)
- c.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.plus(" ")?.let { keyword(it) }
-
- if (c is DClass) {
- c.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.name?.plus(" ")?.let { keyword(it) }
- c.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) }
- }
-
- when (c) {
- is DClass -> keyword("class ")
- is DInterface -> keyword("interface ")
- is DEnum -> keyword("enum ")
- is DObject -> keyword("class ")
- is DAnnotation -> keyword("@interface ")
- }
- link(c.name!!, c.dri, styles = mainStyles + deprecationStyles)
- if (c is WithGenerics) {
- list(c.generics, prefix = "<", suffix = ">",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- +buildSignature(it)
- }
- }
- if (c is WithSupertypes) {
- c.supertypes.map { (p, dris) ->
- val (classes, interfaces) = dris.partition { it.kind == JavaClassKindTypes.CLASS }
- list(classes, prefix = " extends ", sourceSets = setOf(p),
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Keyword) {
- signatureForProjection(it.typeConstructor)
- }
- list(interfaces, prefix = " implements ", sourceSets = setOf(p),
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Keyword) {
- signatureForProjection(it.typeConstructor)
- }
- }
- }
- }
- }
-
- private fun signature(p: DProperty) =
- p.sourceSets.map {
- contentBuilder.contentFor(
- p,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace, TextStyle.Block),
- sourceSets = setOf(it)
- ) {
- annotationsBlock(p)
- p.visibility[it]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") }
- p.modifier[it]?.takeIf { it !in ignoredModifiers }?.name?.let { keyword("$it ") }
- p.modifiers()[it]?.toSignatureString()?.let { keyword(it) }
- signatureForProjection(p.type)
- text(nbsp.toString())
- link(p.name, p.dri, styles = mainStyles + p.stylesIfDeprecated(it))
- }
- }
-
- private fun signature(f: DFunction) =
- f.sourceSets.map { sourceSet ->
- contentBuilder.contentFor(
- f,
- ContentKind.Symbol,
- setOf(TextStyle.Monospace, TextStyle.Block),
- sourceSets = setOf(sourceSet)
- ) {
- annotationsBlock(f)
- f.visibility[sourceSet]?.takeIf { it !in ignoredVisibilities }?.name?.let { keyword("$it ") }
- f.modifier[sourceSet]?.takeIf { it !in ignoredModifiers }?.name?.plus(" ")?.let { keyword(it) }
- f.modifiers()[sourceSet]?.toSignatureString()?.let { keyword(it) }
- val returnType = f.type
- signatureForProjection(returnType)
- text(nbsp.toString())
- link(f.name, f.dri, styles = mainStyles + TokenStyle.Function + f.stylesIfDeprecated(sourceSet))
- val usedGenerics = if (f.isConstructor) f.generics.filter { f uses it } else f.generics
- list(usedGenerics, prefix = "<", suffix = ">",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- +buildSignature(it)
- }
- punctuation("(")
- if (f.parameters.isNotEmpty()) {
- parametersBlock(f) {
- annotationsInline(it)
- text(it.modifiers()[sourceSet]?.toSignatureString() ?: "", styles = mainStyles + TokenStyle.Keyword)
- signatureForProjection(it.type)
- text(nbsp.toString())
- text(it.name!!)
- }
- }
- punctuation(")")
- }
- }
-
- private fun signature(t: DTypeParameter) =
- t.sourceSets.map {
- contentBuilder.contentFor(t, sourceSets = setOf(it)) {
- annotationsInline(t)
- text(t.name.substringAfterLast("."), styles = mainStyles + t.stylesIfDeprecated(it))
- list(
- elements = t.bounds,
- prefix = " extends ",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Keyword
- ) {
- signatureForProjection(it)
- }
- }
-
- }
-
- private fun PageContentBuilder.DocumentableContentBuilder.signatureForProjection(p: Projection): Unit = when (p) {
- is TypeParameter -> {
- annotationsInline(p)
- link(p.name, p.dri)
- }
-
- is TypeConstructor -> group(styles = emptySet()) {
- annotationsInline(p)
- link(p.dri.classNames.orEmpty(), p.dri)
- list(p.projections, prefix = "<", suffix = ">",
- separatorStyles = mainStyles + TokenStyle.Punctuation,
- surroundingCharactersStyle = mainStyles + TokenStyle.Operator) {
- signatureForProjection(it)
- }
- }
-
- is Variance<*> -> group(styles = emptySet()) {
- val variance = when(p) {
- is Covariance<*> -> "? extends "
- is Contravariance<*> -> "? super "
- is Invariance<*> -> ""
- }
- keyword(variance)
- signatureForProjection(p.inner)
- }
-
- is Star -> operator("?")
-
- is Nullable -> signatureForProjection(p.inner)
- is DefinitelyNonNullable -> signatureForProjection(p.inner)
-
- is JavaObject, is Dynamic -> link("Object", DRI("java.lang", "Object"))
- is Void -> text("void")
- is PrimitiveJavaType -> text(p.name)
- is UnresolvedBound -> text(p.name)
- is TypeAliased -> signatureForProjection(p.inner)
- }
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt b/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt
deleted file mode 100644
index 1738d40d..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/signatures/JavaSignatureUtils.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.signatures
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.signatures.All
-import org.jetbrains.dokka.base.signatures.JvmSignatureUtils
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.AnnotationTarget
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-public object JavaSignatureUtils : JvmSignatureUtils {
-
- private val ignoredAnnotations = setOf(
- Annotations.Annotation(DRI("kotlin.jvm", "Transient"), emptyMap()),
- Annotations.Annotation(DRI("kotlin.jvm", "Volatile"), emptyMap()),
- Annotations.Annotation(DRI("kotlin.jvm", "Transitive"), emptyMap()),
- Annotations.Annotation(DRI("kotlin.jvm", "Strictfp"), emptyMap()),
- Annotations.Annotation(DRI("kotlin.jvm", "JvmStatic"), emptyMap())
- )
-
- private val strategy = All
- private val listBrackets = Pair('{', '}')
- private val classExtension = ".class"
-
- override fun PageContentBuilder.DocumentableContentBuilder.annotationsBlock(d: AnnotationTarget) {
- annotationsBlockWithIgnored(d, ignoredAnnotations, strategy, listBrackets, classExtension)
- }
-
- override fun PageContentBuilder.DocumentableContentBuilder.annotationsInline(d: AnnotationTarget) {
- annotationsInlineWithIgnored(d, ignoredAnnotations, strategy, listBrackets, classExtension)
- }
-
- override fun <T : Documentable> WithExtraProperties<T>.modifiers(): Map<DokkaConfiguration.DokkaSourceSet, Set<ExtraModifiers.JavaOnlyModifiers>> {
- return extra[AdditionalModifiers]?.content?.entries?.associate {
- it.key to it.value.filterIsInstance<ExtraModifiers.JavaOnlyModifiers>().toSet()
- } ?: emptyMap()
- }
-
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt b/plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt
deleted file mode 100644
index 32344dd9..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/transformToJava.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava
-
-import org.jetbrains.dokka.kotlinAsJava.converters.KotlinToJavaConverter
-import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameDocumentableTransformer
-import org.jetbrains.dokka.model.DClasslike
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.DPackage
-import org.jetbrains.dokka.model.DProperty
-import org.jetbrains.dokka.plugability.DokkaContext
-
-private val JVM_NAME_DOCUMENTABLE_TRANSFORMER by lazy {
- JvmNameDocumentableTransformer()
-}
-
-public fun DPackage.transformToJava(context: DokkaContext): DPackage {
- with(KotlinToJavaConverter(context)) {
- return JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(this@transformToJava.asJava(), context)
- }
-}
-
-public fun DClasslike.transformToJava(context: DokkaContext): DClasslike {
- with(KotlinToJavaConverter(context)) {
- return JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(this@transformToJava.asJava(), context)
- }
-}
-
-public fun DFunction.transformToJava(context: DokkaContext, containingClassName: String, isTopLevel: Boolean = false): List<DFunction> {
- with(KotlinToJavaConverter(context)) {
- return this@transformToJava.asJava(containingClassName, isTopLevel)
- .map { JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(it, context) }
- }
-}
-
-public fun DProperty.transformToJava(context: DokkaContext, isTopLevel: Boolean = false, relocateToClass: String? = null): DProperty {
- with(KotlinToJavaConverter(context)) {
- return JVM_NAME_DOCUMENTABLE_TRANSFORMER.transform(this@transformToJava.asJava(isTopLevel, relocateToClass), context)
- }
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt
deleted file mode 100644
index fe625e1c..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameDocumentableTransformer.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.transformers
-
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.PropertyContainer
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-
-public class JvmNameDocumentableTransformer : DocumentableTransformer {
- private val jvmNameProvider = JvmNameProvider()
-
- override fun invoke(original: DModule, context: DokkaContext): DModule {
- return original.copy(packages = original.packages.map { transform(it, context) })
- }
-
- internal fun <T : Documentable> transform(documentable: T, context: DokkaContext): T {
- val transformResult = with(documentable) {
- when (this) {
- is DPackage -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- is DFunction -> {
- val name = jvmNameProvider.nameFor(this)
- copy(
- dri = documentable.dri.withCallableName(name),
- name = name,
- extra = extra.withoutJvmName()
- )
- }
- is DProperty -> transformGetterAndSetter(this)
- is DClasslike -> transformClassLike(this, context)
- is DEnumEntry -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- else -> {
- context.logger.warn("Failed to translate a JvmName for ${this.javaClass.canonicalName}")
- this
- }
- }
- }
- @Suppress("UNCHECKED_CAST")
- return transformResult as T
- }
-
- private fun PropertyContainer<DFunction>.withoutJvmName(): PropertyContainer<DFunction> {
- val annotationsWithoutJvmName = get(Annotations)?.let { annotations ->
- annotations.copy((annotations.directAnnotations).map { (sourceset, annotations) ->
- sourceset to annotations.filterNot { it.isJvmName() }
- }.toMap() + annotations.fileLevelAnnotations)
- }
- val extraWithoutAnnotations: PropertyContainer<DFunction> = minus(Annotations)
-
- return extraWithoutAnnotations.addAll(listOfNotNull(annotationsWithoutJvmName))
- }
-
- private fun transformClassLike(documentable: DClasslike, context: DokkaContext): DClasslike =
- with(documentable) {
- when (this) {
- is DClass -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- is DAnnotation -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- is DObject -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- is DEnum -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- is DInterface -> copy(
- functions = functions.map { transform(it, context) },
- properties = properties.map { transform(it, context) },
- classlikes = classlikes.map { transform(it, context) },
- )
- }
- }
-
- private fun transformGetterAndSetter(entry: DProperty): DProperty =
- with(entry) {
- copy(
- setter = jvmNameProvider.nameForSetter(this)?.let { setterName ->
- setter?.let { setter ->
- setter.copy(
- dri = setter.dri.withCallableName(setterName),
- name = setterName,
- extra = setter.extra.withoutJvmName()
- )
- }
- },
- getter = jvmNameProvider.nameForGetter(this)?.let { getterName ->
- getter?.let { getter ->
- getter.copy(
- dri = getter.dri.withCallableName(getterName),
- name = getterName,
- extra = getter.extra.withoutJvmName()
- )
- }
- })
- }
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt
deleted file mode 100644
index caf76b68..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/transformers/JvmNameProvider.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.transformers
-
-import org.jetbrains.dokka.kotlinAsJava.directlyAnnotatedJvmName
-import org.jetbrains.dokka.kotlinAsJava.fileLevelJvmName
-import org.jetbrains.dokka.kotlinAsJava.jvmNameAsString
-import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.properties.WithExtraProperties
-
-public data class Name(val fqName: String) {
- val name: String = fqName.substringAfterLast(".")
-}
-
-public class JvmNameProvider {
- public fun <T> nameFor(entry: T): String where T : Documentable, T : WithExtraProperties<T> =
- entry.directlyAnnotatedJvmName()?.jvmNameAsString()
- ?: entry.name
- ?: throw IllegalStateException("Failed to provide a name for ${entry.javaClass.canonicalName}")
-
- public fun <T> nameForSyntheticClass(entry: T): Name where T : WithSources, T : WithExtraProperties<T>, T : Documentable {
- val name: String = (entry.fileLevelJvmName()?.params?.get("name") as? StringValue)?.value
- ?: (entry.sources.entries.first().value.path.split("/").last().split(".").first().capitalize() + "Kt")
- return Name("${entry.dri.packageName}.$name")
- }
-
- public fun nameForGetter(entry: DProperty): String? =
- entry.getter?.directlyAnnotatedJvmName()?.jvmNameAsString()
-
- public fun nameForSetter(entry: DProperty): String? =
- entry.setter?.directlyAnnotatedJvmName()?.jvmNameAsString()
-
- private fun List<Annotations.Annotation>.jvmNameAnnotation(): Annotations.Annotation? =
- firstOrNull { it.isJvmName() }
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt
deleted file mode 100644
index 45682ea4..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/transformers/KotlinAsJavaDocumentableTransformer.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.transformers
-
-import org.jetbrains.dokka.kotlinAsJava.converters.KotlinToJavaConverter
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer
-
-public class KotlinAsJavaDocumentableTransformer : DocumentableTransformer {
- override fun invoke(original: DModule, context: DokkaContext): DModule =
- original.copy(packages = original.packages.map {
- with(KotlinToJavaConverter(context)) {
- it.asJava()
- }
- })
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt b/plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt
deleted file mode 100644
index d2f5a9cf..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/transformers/withCallableName.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.transformers
-
-import org.jetbrains.dokka.links.DRI
-
-internal fun DRI.withCallableName(newName: String): DRI = copy(callable = callable?.copy(name = newName))
diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt
deleted file mode 100644
index a0ed24d4..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.translators
-
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.model.DModule
-import org.jetbrains.dokka.pages.ModulePageNode
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.analysis.kotlin.internal.InternalKotlinAnalysisPlugin
-
-public class KotlinAsJavaDocumentableToPageTranslator(
- context: DokkaContext
-) : DocumentableToPageTranslator {
- private val configuration = configuration<DokkaBase, DokkaBaseConfiguration>(context)
- private val commentsToContentConverter = context.plugin<DokkaBase>().querySingle { commentsToContentConverter }
- private val signatureProvider = context.plugin<DokkaBase>().querySingle { signatureProvider }
- private val customTagContentProviders = context.plugin<DokkaBase>().query { customTagContentProvider }
- private val documentableSourceLanguageParser = context.plugin<InternalKotlinAnalysisPlugin>().querySingle { documentableSourceLanguageParser }
- private val logger: DokkaLogger = context.logger
-
- override fun invoke(module: DModule): ModulePageNode =
- KotlinAsJavaPageCreator(
- configuration,
- commentsToContentConverter,
- signatureProvider,
- logger,
- customTagContentProviders,
- documentableSourceLanguageParser
- ).pageForModule(module)
-}
diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt
deleted file mode 100644
index fcdc1d83..00000000
--- a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.kotlinAsJava.translators
-
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.base.signatures.SignatureProvider
-import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
-import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider
-import org.jetbrains.dokka.base.translators.documentables.DefaultPageCreator
-import org.jetbrains.dokka.model.DProperty
-import org.jetbrains.dokka.pages.MemberPageNode
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.analysis.kotlin.internal.DocumentableSourceLanguageParser
-
-public class KotlinAsJavaPageCreator(
- configuration: DokkaBaseConfiguration?,
- commentsToContentConverter: CommentsToContentConverter,
- signatureProvider: SignatureProvider,
- logger: DokkaLogger,
- customTagContentProviders: List<CustomTagContentProvider>,
- documentableAnalyzer: DocumentableSourceLanguageParser
-) : DefaultPageCreator(
- configuration,
- commentsToContentConverter,
- signatureProvider,
- logger,
- customTagContentProviders = customTagContentProviders,
- documentableAnalyzer = documentableAnalyzer
-) {
- override fun pageForProperty(p: DProperty): MemberPageNode? = null
-}
diff --git a/plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index 4b6619b1..00000000
--- a/plugins/kotlin-as-java/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.kotlinAsJava.KotlinAsJavaPlugin
diff --git a/plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt b/plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt
deleted file mode 100644
index cba5e9ef..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/CompanionAsJavaTest.kt
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.*
-import kotlin.test.*
-
-private const val COMPANION_NAME = "C"
-
-class CompanionAsJavaTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `empty companion object should not be rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {}
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionNotRendered(parentClass)
- }
- }
- }
-
- @Test
- fun `companion object with only jvmField should not be rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmField val jvmFieldProp: String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionNotRendered(parentClass)
- }
- }
- }
-
- @Test
- fun `companion property with jvmField should be static`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmField val jvmFieldProp: String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- val parentClassProperty = parentClass.properties.firstOrNull { it.name == "jvmFieldProp" }
- assertNotNull(parentClassProperty, "Parent class should contain the companion jvmField property")
- assertIsStatic(parentClassProperty)
- }
- }
- }
-
- @Test
- fun `companion object with only const should not be rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | const val constProp: Int = 0
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionNotRendered(parentClass)
- }
- }
- }
-
- @Test
- fun `companion property with const should be static`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | const val constProp: Int = 0
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- val parentClassProperty = parentClass.properties.firstOrNull { it.name == "constProp" }
- assertNotNull(parentClassProperty, "Parent class should contain the companion const property")
- assertIsStatic(parentClassProperty)
- }
- }
- }
-
- @Test
- fun `companion object with only lateinit not rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | lateinit var lateInitProp: String
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionNotRendered(parentClass)
- }
- }
- }
-
- @Test
- fun `companion property with lateinit should be static`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | lateinit var lateInitProp: String
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- val parentClassProperty = parentClass.properties.firstOrNull { it.name == "lateInitProp" }
- assertNotNull(parentClassProperty, "Parent class should contain the companion lateinit property")
- assertIsStatic(parentClassProperty)
- }
- }
- }
-
- @Test
- fun `companion object with only jvmStatic fun not rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmStatic fun staticFun(): String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionNotRendered(parentClass)
- }
- }
- }
-
- @Test
- fun `companion function with JvmStatic should be static`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmStatic fun staticFun(): String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- val parentClassFunction = parentClass.functions.firstOrNull { it.name == "staticFun" }
- assertNotNull(parentClassFunction, "Parent class should contains the companion jvmStatic function")
- assertIsStatic(parentClassFunction)
- }
- }
- }
-
- @Test
- fun `companion object with nested classes is rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmStatic
- | fun staticFun1(): String = ""
- |
- | const val CONST_VAL: Int = 100
- |
- | class NestedClass
- | object NestedObject
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionRendered(parentClass)
-
- val classLikes = parentClass.companion?.classlikes
- assertNotNull(classLikes)
- assertEquals(2, classLikes.size,
- "Classlike list should contains nested class and object")
- assertTrue(classLikes.any { it.name == "NestedClass" })
- assertTrue(classLikes.any { it.name == "NestedObject" })
-
- }
- }
- }
-
- @Test
- fun `companion object with supertype is rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |
- |class Parent
- |interface IParent
- |class MyClass {
- | companion object $COMPANION_NAME : Parent(), IParent {
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionRendered(parentClass)
- }
- }
- }
-
- @Test
- fun `companion object rendered for own properties`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmField
- | val jvmField: String = ""
- | const val contVal: Int = 0
- | lateinit var lateInit: String
- |
- | val rendered: Int = TODO()
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionRendered(parentClass)
-
- val properties = parentClass.companion?.properties
-
- assertNotNull(properties)
- assertEquals(2, properties.size) // including INSTANCE
- assertTrue(properties.any { it.name == "rendered" })
- assertTrue(properties.none { it.name == "jvmField1" })
- assertTrue(properties.none { it.name == "contVal" })
- assertTrue(properties.none { it.name == "lateInit" })
- }
- }
- }
-
- @Test
- fun `companion object rendered for own functions`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | @JvmStatic
- | fun staticFun(): String = ""
- |
- | fun renderedFun(): String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertCompanionRendered(parentClass)
-
- val functions = parentClass.companion?.functions
-
- assertNotNull(functions)
- assertEquals(1, functions.size)
- assertTrue(functions.any { it.name == "renderedFun" })
- assertTrue(functions.none { it.name == "staticFun" })
- }
- }
- }
-
- @Test
- fun `companion const value should be rendered as public by default`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | const val constProp: String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertEquals(
- JavaVisibility.Public,
- parentClass.properties.firstOrNull()?.visibility?.values?.first()
- )
- assertNull(parentClass.findFunction("constProp"), "There is no getter for the cont field")
- }
- }
- }
-
- @Test
- fun `companion const value should preserve Java modifier`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | protected const val constProp: String = ""
- | }
- |}
- """.trimMargin(),
- dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- documentedVisibilities = setOf(
- org.jetbrains.dokka.DokkaConfiguration.Visibility.PUBLIC,
- org.jetbrains.dokka.DokkaConfiguration.Visibility.PROTECTED
- )
- }
- }
- },
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertEquals(
- JavaVisibility.Protected,
- parentClass.properties.firstOrNull()?.visibility?.values?.first()
- )
- assertNull(parentClass.findFunction("constProp"), "There is no getter for the cont field")
- }
- }
- }
-
- @Test
- fun `companion lateinit value should be rendered as public by default`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | lateinit var lateInitProp: String
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertEquals(
- JavaVisibility.Public,
- parentClass.properties.firstOrNull()?.visibility?.values?.first()
- )
- assertNull(parentClass.findFunction("lateInitProp"), "There is no getter for the cont field")
- }
- }
- }
-
- @Test
- fun `named companion instance property should be rendered if companion rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | var property: String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertNotNull(parentClass.properties.any { it.name == COMPANION_NAME })
- }
- }
- }
-
- @Test
- fun `default named companion instance property should be rendered if companion rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object {
- | var property: String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertTrue(parentClass.properties.any { it.name == "Companion" })
- }
- }
- }
-
- @Test
- fun `companion instance property should be hidden if companion not rendered`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class MyClass {
- | companion object $COMPANION_NAME {
- | const val property: String = ""
- | }
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val parentClass = module.findClass("MyClass")
-
- assertTrue(parentClass.properties.none { it.name == COMPANION_NAME })
- }
- }
- }
-}
-
-private fun DModule.findClass(name: String) = packages.flatMap { it.classlikes }
- .firstOrNull { it.name == name } as DClass
-
-private fun DClass.findFunction(name: String) = functions.firstOrNull { it.name.contains(name, ignoreCase = true) }
-
-private fun assertCompanionRendered(parentClass: DClass) {
- assertNotNull(parentClass.companion, "Companion should not be null")
- assertTrue(
- parentClass.classlikes.any { it.name == COMPANION_NAME },
- "Companion should be in classlikes list"
- )
-}
-
-private fun assertCompanionNotRendered(parentClass: DClass) {
- assertNull(parentClass.companion, "Companion should be null")
- assertTrue(
- parentClass.classlikes.none { it.name == COMPANION_NAME },
- "Companion should not be in classlikes list"
- )
-}
-
-private fun assertIsStatic(property: DProperty) {
- val extra = property.extra[AdditionalModifiers]
- assertNotNull(extra, "extra for property is present")
- assertTrue(
- extra.content.values.contains(setOf(ExtraModifiers.JavaOnlyModifiers.Static)),
- "Property contains extra modifier static"
- )
-}
-
-private fun assertIsStatic(function: DFunction) {
- val extra = function.extra[AdditionalModifiers]
- assertNotNull(extra, "extra for property is present")
- assertTrue(
- extra.content.values.contains(setOf(ExtraModifiers.JavaOnlyModifiers.Static)),
- "Function contains extra modifier static"
- )
-}
diff --git a/plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt b/plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt
deleted file mode 100644
index bdea1cb4..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/DRITranslationTest.kt
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.DEnum
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class DRITranslationTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `should correctly handle nested classes`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class A {
- | class B(val x: String)
- |}
- |class C {
- | class B(val x: String)
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val nestedClasslikesDRIs = module.packages.flatMap { it.classlikes }.flatMap { it.classlikes }.map { it.dri }
- val driRegex = "[AC]\\.B".toRegex()
-
- nestedClasslikesDRIs.forEach { dri ->
- assertTrue(driRegex.matches(dri.classNames.toString()))
- }
- }
- }
- }
-
- @Test
- fun `should correctly handle interface methods`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |interface A {
- | fun b()
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val nestedFunctionDRI = module.packages.flatMap { it.classlikes }.flatMap { it.functions }.filter { it.name == "b" }.map { it.dri }.single()
-
- assertTrue(nestedFunctionDRI.classNames == "A")
- }
- }
- }
-
- @Test
- fun `should correctly handle object methods`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |object A {
- | fun b() {}
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val nestedFunctionDRI = module.packages.flatMap { it.classlikes }.flatMap { it.functions }.filter { it.name == "b" }.map { it.dri }.single()
-
- assertTrue(nestedFunctionDRI.classNames == "A")
- }
- }
- }
-
- @Test
- fun `should correctly handle enum functions`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |enum class A(private val x: Int) {
- | X(0);
- | fun b() = x
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val nestedFunctionDRI = (module.packages.single().classlikes.single() as DEnum).functions.filter { it.name == "b" }.map { it.dri }.single()
-
- assertTrue(nestedFunctionDRI.classNames == "A")
- }
- }
- }
-
- @Test
- fun `should correctly handle nested classes' constructors`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class A {
- | class B(val x: String)
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val constructorDRI = (module.packages.flatMap { it.classlikes }.flatMap { it.classlikes }.single() as DClass).constructors.single().dri
- assertTrue(constructorDRI.classNames == "A.B")
- }
- }
- }
-}
diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt
deleted file mode 100644
index 6167e13a..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/JvmFieldTest.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.model.AdditionalModifiers
-import org.jetbrains.dokka.model.ExtraModifiers
-import org.jetbrains.dokka.model.JavaVisibility
-import kotlin.test.*
-
-class JvmFieldTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `should keep properties annotated with JvmField as properties`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class SampleClass(@JvmField val property: String, val otherProperty: String)
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first()
- assertNotNull(classLike.properties.firstOrNull { it.name == "property" })
- assertEquals(
- listOf("getOtherProperty"),
- classLike.functions.map { it.name })
- }
- }
- }
-
- @Test
- fun `should work for top-level property`(){
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |@JvmField
- |val property: String = TODO()
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first()
- assertNotNull(classLike.properties.firstOrNull { it.name == "property" })
- assertEquals(
- emptyList(),
- classLike.functions.map { it.name })
- }
- }
- }
-
- @Test
- fun `properties without JvmName should be kept private`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |class SampleClass(val property: String)
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first()
- assertEquals(JavaVisibility.Private, classLike.properties.firstOrNull()?.visibility?.values?.first())
- assertNotNull(classLike.functions.firstOrNull { it.name.startsWith("get") })
- assertEquals(
- JavaVisibility.Public,
- classLike.functions.first { it.name.startsWith("get") }.visibility.values.first()
- )
- }
- }
- }
-
- @Test
- fun `object jvmfield property should have no getters`(){
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |object MyObject {
- | @JvmField
- | val property: String = TODO()
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first()
- val property = classLike.properties.singleOrNull { it.name == "property" }
- assertNotNull(property)
- assertEquals(
- emptyList(),
- classLike.functions.map { it.name }
- )
- assertNull(property.getter)
- assertNull(property.setter)
- }
- }
- }
-
- @Test
- fun `enum jvmfield property should have no getters`(){
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |enum class MyEnum {
- | ITEM;
- |
- | @JvmField
- | val property: String = TODO()
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first()
- val property = classLike.properties.singleOrNull { it.name == "property" }
- assertNotNull(property)
- assertEquals(
- emptyList(),
- classLike.functions
- .filter{ it.name.contains("property", ignoreCase = true) }
- .map { it.name }
- )
- assertNull(property.getter)
- assertNull(property.setter)
- }
- }
- }
-
-
- @Test
- fun `object jvmfield property should be static`(){
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |object MyObject {
- | @JvmField
- | val property: String = TODO()
- |}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first()
- val property = classLike.properties.singleOrNull { it.name == "property" }
- assertNotNull(property)
-
- val extra = property.extra[AdditionalModifiers]
- assertNotNull(extra, "Additional modifiers for property are exist")
- assertTrue(extra.content.values.contains(setOf(ExtraModifiers.JavaOnlyModifiers.Static)),
- "Extra modifiers contains static")
- }
- }
- }
-}
diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt
deleted file mode 100644
index 7a087fb7..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/JvmNameTest.kt
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.links.Callable
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.links.TypeConstructor
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.DClass
-import org.jetbrains.dokka.model.isJvmName
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNull
-
-class JvmNameTest : BaseAbstractTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `should change name for class containing top level function`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |@file:JvmName("CustomJvmName")
- |package kotlinAsJavaPlugin
- |fun sample(): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val expectedClassLikeDri = DRI(
- packageName = "kotlinAsJavaPlugin",
- classNames = "CustomJvmName",
- )
- val classLike = module.packages.flatMap { it.classlikes }.first()
- assertEquals(expectedClassLikeDri, classLike.dri)
- assertEquals("CustomJvmName", classLike.name)
- }
- }
- }
-
- @Test
- fun `should change name for top level function`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |@file:JvmName("CustomJvmName")
- |package kotlinAsJavaPlugin
- |@JvmName("jvmSample")
- |fun sample(): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val expectedFunctionDri = DRI(
- packageName = "kotlinAsJavaPlugin",
- classNames = "CustomJvmName",
- callable = Callable(
- "jvmSample",
- receiver = null,
- params = emptyList()
- )
- )
- val function = module.packages.flatMap { it.classlikes }.flatMap { it.functions }.first()
- assertEquals(expectedFunctionDri, function.dri)
- assertEquals("jvmSample", function.name)
- }
- }
- }
-
- @Test
- fun `should change name of a setter for top level property`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |@file:JvmName("CustomJvmName")
- |package kotlinAsJavaPlugin
- |@get:JvmName("xd")
- |@set:JvmName("asd")
- |var property: String
- | get() = ""
- | set(value) {}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val expectedSetterDri = DRI(
- packageName = "kotlinAsJavaPlugin",
- classNames = "CustomJvmName",
- callable = Callable(
- "asd",
- receiver = null,
- //Todo this is bad, this should be a type in java, look at the bytecode
- params = listOf(TypeConstructor("kotlin.String", emptyList()))
- )
- )
- val function =
- module.packages.flatMap { it.classlikes }.flatMap { it.functions }.first { it.name == "asd" }
- assertEquals(expectedSetterDri, function.dri)
- assertEquals("asd", function.name)
- }
- }
- }
-
- @Test
- fun `should change name of a getter for top level property`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |@file:JvmName("CustomJvmName")
- |package kotlinAsJavaPlugin
- |@get:JvmName("xd")
- |@set:JvmName("asd")
- |var property: String
- | get() = ""
- | set(value) {}
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val expectedGetterDri = DRI(
- packageName = "kotlinAsJavaPlugin",
- classNames = "CustomJvmName",
- callable = Callable(
- "xd",
- receiver = null,
- params = emptyList()
- )
- )
- val function =
- module.packages.flatMap { it.classlikes }.flatMap { it.functions }.first { it.name == "xd" }
- assertEquals(expectedGetterDri, function.dri)
- assertEquals("xd", function.name)
- }
- }
- }
-
- @Test
- fun `should leave the name as default if annotation is not provided`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |fun sample(): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val expectedClassLikeDri = DRI(
- packageName = "kotlinAsJavaPlugin",
- classNames = "SampleKt",
- )
- val classLike = module.packages.flatMap { it.classlikes }.first()
- assertEquals(expectedClassLikeDri, classLike.dri)
- assertEquals("SampleKt", classLike.name)
- }
- }
- }
-
- @Test
- fun `jvmName extra should be removed after the name swap`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |@JvmName("CustomJvmName")
- |fun sample(): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val classLike = module.packages.flatMap { it.classlikes }.first() as DClass
- assertNull(
- classLike.extra[Annotations]?.directAnnotations?.flatMap { it.value }
- ?.map { it.dri }
- ?.firstOrNull { it.isJvmName() }
- )
- }
- }
- }
-}
diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt
deleted file mode 100644
index 1d6f4698..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/JvmOverloadsTest.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JvmOverloadsTest : BaseAbstractTest() {
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `should generate multiple functions`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |@JvmOverloads
- |fun sample(a: Int = 0, b: String, c: Int = 0): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(3, functions.size)
- assertEquals(3, functions[0].parameters.size)
- assertEquals(2, functions[1].parameters.size)
- assertEquals(1, functions[2].parameters.size)
- }
- }
- }
-
- @Test
- fun `should do nothing if there is no default values`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |@JvmOverloads
- |fun sample(a: Int, b: String, c: Int): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(1, functions.size)
- assertEquals(3, functions[0].parameters.size)
- }
- }
- }
-}
diff --git a/plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt b/plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt
deleted file mode 100644
index 3de48da7..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/JvmSyntheticTest.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class JvmSyntheticTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- classpath += jvmStdlibPath!!
- }
- }
- }
-
- @Test
- fun `should not include synthetic functions`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |@JvmSynthetic
- |fun synthetic(): String = ""
- |fun sample(): String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(1, functions.size)
- assertEquals("sample", functions[0].name)
- }
- }
- }
-
- @Test
- fun `should check synthetic on method fields, getters and setters`() {
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/sample.kt
- |package kotlinAsJavaPlugin
- |@get:JvmSynthetic
- |var synthetic: String = ""
- |
- |@set:JvmSynthetic
- |var synthetic2: String = ""
- |
- |@JvmSynthetic
- |var synthetic3: String = ""
- |
- |var sample: String = ""
- """.trimMargin(),
- configuration,
- ) {
- documentablesTransformationStage = { module ->
- val functions = module.packages.flatMap { it.classlikes }.flatMap { it.functions }
- assertEquals(4, functions.size)
- assertEquals("setSynthetic", functions[0].name)
- assertEquals("getSynthetic2", functions[1].name)
- assertEquals("getSample", functions[2].name)
- assertEquals("setSample", functions[3].name)
- }
- }
- }
-}
diff --git a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt b/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt
deleted file mode 100644
index 93d5c1b5..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import matchers.content.*
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.jdk
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.Annotations
-import org.jetbrains.dokka.model.GenericTypeConstructor
-import org.jetbrains.dokka.model.dfs
-import org.jetbrains.dokka.pages.*
-import signatures.Parameter
-import signatures.Parameters
-import signatures.firstSignature
-import signatures.renderedContent
-import utils.A
-import utils.TestOutputWriterPlugin
-import utils.match
-import kotlin.test.*
-
-class KotlinAsJavaPluginTest : BaseAbstractTest() {
-
- @Test
- fun `top-level functions should be generated`() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |object TestObj {}
- |
- |fun testFL(l: List<String>) = l
- |fun testF() {}
- |fun testF2(i: Int) = i
- |fun testF3(to: TestObj) = to
- |fun <T : Char> testF4(t: T) = listOf(t)
- |val testV = 1
- """.trimMargin(),
- configuration,
- cleanupOutput = true
- ) {
- pagesGenerationStage = { root ->
- val content = (root.children.single().children.first { it.name == "TestKt" } as ContentPage).content
-
- val functionRows = content.findTableWithKind(kind = ContentKind.Functions).children
- functionRows.assertCount(6)
-
- val propRows = content.findTableWithKind(kind = ContentKind.Properties).children
- propRows.assertCount(1)
- }
- }
- }
-
- private fun ContentNode.findTableWithKind(kind: ContentKind): ContentNode = dfs { node ->
- node is ContentTable && node.dci.kind === kind
- }.let { assertNotNull(it, "the table with kind $kind") }
-
- @Test
- fun topLevelWithClassTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |class Test {
- | fun testFC() {}
- | val testVC = 1
- |}
- |
- |fun testF(i: Int) = i
- |val testV = 1
- """.trimMargin(),
- configuration,
- cleanupOutput = true
- ) {
- pagesGenerationStage = { root ->
- val contentList = root.children
- .flatMap { it.children<ContentPage>() }
-
- contentList.find {it.name == "Test"}.apply {
- assertNotNull(this)
- content.findTableWithKind(ContentKind.Functions).children.assertCount(2)
- content.findTableWithKind(ContentKind.Properties).children.assertCount(1)
- }
- contentList.find {it.name == "TestKt"}.apply {
- assertNotNull(this)
- content.findTableWithKind(ContentKind.Functions).children.assertCount(2)
- content.findTableWithKind(ContentKind.Properties).children.assertCount(1)
- }
- }
- }
- }
-
- @Test
- fun kotlinAndJavaTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |fun testF(i: Int) = i
- |/src/main/kotlin/kotlinAsJavaPlugin/TestJ.java
- |package kotlinAsJavaPlugin;
- |
- |public class TestJ {
- | public int testF(int i) { return i; }
- |}
- """.trimMargin(),
- configuration,
- cleanupOutput = true
- ) {
- pagesGenerationStage = { root ->
- val classes = root.children.first().children.associateBy { it.name }
- classes.values.assertCount(2, "Class count: ")
-
- classes["TestKt"].let {
- it?.children.orEmpty().assertCount(1, "(Kotlin) TestKt members: ")
- it!!.children.first()
- .let { assertEquals("testF", it.name, "(Kotlin) Expected method name: testF, got: ${it.name}") }
- }
-
- classes["TestJ"].let {
- it?.children.orEmpty().assertCount(2, "(Java) TestJ members: ") // constructor + method
- it!!.children.map { it.name }
- .let {
- assertTrue(
- it.containsAll(
- setOf(
- "testF",
- "TestJ"
- )
- ),
- "(Java) Expected method name: testF, got: $it"
- )
- }
- }
- }
- }
- }
-
- @Test
- fun `public kotlin properties should have a getter with same visibilities`(){
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |class Test {
- | public val publicProperty: String = ""
- |}
- """.trimMargin(),
- configuration,
- cleanupOutput = true
- ) {
- pagesTransformationStage = { rootPageNode ->
- val propertyGetter = rootPageNode.dfs { it is MemberPageNode && it.name == "getPublicProperty" } as? MemberPageNode
- assertNotNull(propertyGetter)
- propertyGetter.content.assertNode {
- group {
- header(1) {
- +"getPublicProperty"
- }
- }
- divergentGroup {
- divergentInstance {
- divergent {
- group {
- +"public final "
- group {
- link {
- +"String"
- }
- }
- link {
- +"getPublicProperty"
- }
- +"()"
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `java properties should keep its modifiers`(){
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/TestJ.java
- |package kotlinAsJavaPlugin;
- |
- |public class TestJ {
- | public Int publicProperty = 1;
- |}
- """.trimMargin(),
- configuration,
- cleanupOutput = true
- ) {
- pagesGenerationStage = { root ->
- val testClass = root.dfs { it.name == "TestJ" } as? ClasslikePageNode
- assertNotNull(testClass)
- (testClass.content as ContentGroup).children.last().children.last().assertNode {
- group {
- header(2){
- +"Properties"
- }
- table {
- group {
- link {
- +"publicProperty"
- }
- divergentGroup {
- divergentInstance {
- divergent {
- group {
- group {
- +"public Int"
- link {
- +"publicProperty"
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- @Test
- fun `koltin interfaces and classes should be split to extends and implements`(){
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |open class A { }
- |interface B
- |class C : A(), B
- """.trimMargin(),
- configuration,
- cleanupOutput = true
- ) {
- pagesGenerationStage = { root ->
- val testClass = root.dfs { it.name == "C" } as? ClasslikePageNode
- assertNotNull(testClass)
- testClass.content.assertNode {
- group {
- header(expectedLevel = 1) {
- +"C"
- }
- platformHinted {
- group {
- +"public final class "
- link {
- +"C"
- }
- +" extends "
- group {
- link {
- +"A"
- }
- }
- +" implements "
- group {
- link {
- +"B"
- }
- }
- }
- }
- }
- skipAllNotMatching()
- }
- }
- }
- }
-
- private fun <T> Collection<T>.assertCount(n: Int, prefix: String = "") =
- assertEquals(n, count(), "${prefix}Expected $n, got ${count()}")
-
- @Test
- fun `typealias`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(DokkaConfiguration.ExternalDocumentationLink.jdk(8))
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |typealias XD = Int
- |class ABC {
- | fun someFun(xd: XD): Int = 1
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-a-b-c/some-fun.html").firstSignature().match(
- "public final ", A("Integer"), A("someFun"), "(", Parameters(
- Parameter(A("Integer"), "xd")
- ), ")", ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `typealias with generic`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- stdlibExternalDocumentationLink
- )
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |typealias XD<B, A> = Map<A, B>
- |
- |class ABC {
- | fun someFun(xd: XD<Int, String>) = 1
- |}
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-a-b-c/some-fun.html").firstSignature().match(
- "public final ", A("Integer"), A("someFun"), "(", Parameters(
- Parameter(A("Map"), "<", A("String"), ", ", A("Integer"), "> xd"),
- ), ")", ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `const in top level`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- stdlibExternalDocumentationLink
- )
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |const val FIRST = "String"
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- renderingStage = { _, _ ->
- assertNull(writerPlugin.writer.contents["root/kotlinAsJavaPlugin/-test-kt/get-f-i-r-s-t.html"])
- }
- }
- }
-
- @Test
- fun `function in top level`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- stdlibExternalDocumentationLink
- )
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |fun sample(a: Int) = ""
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-test-kt/sample.html").firstSignature().match(
- "public final static ", A("String"), A("sample"), "(", Parameters(
- Parameter(A("Integer"), "a"),
- ), ")", ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `should render primary kotlin constructor as a java constructor`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- stdlibExternalDocumentationLink
- )
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |class Test(val xd: Int)
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- pagesGenerationStage = { root ->
- val content = root.children
- .flatMap { it.children<ContentPage>() }
- .map { it.content }.single().mainContents
-
- val text = content.single { it is ContentHeader }.children
- .single() as ContentText
-
- assertEquals("Constructors", text.text)
- }
- renderingStage = { _, _ ->
- writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-test/-test.html").firstSignature().match(
- A("Test"), A("Test"), "(", Parameters(
- Parameter(A("Integer"), "xd")
- ), ")", ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- /**
- * Kotlin Int becomes java int. Java int cannot be annotated in source, but Kotlin Int can be.
- * This is paired with DefaultDescriptorToDocumentableTranslatorTest.`Java primitive annotations work`()
- *
- * This test currently does not do anything because Kotlin.Int currently becomes java.lang.Integer not primitive int
- */
- @Test
- fun `Java primitive annotations work`() {
- val writerPlugin = TestOutputWriterPlugin()
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- stdlibExternalDocumentationLink
- )
- }
- }
- }
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |@MustBeDocumented
- |@Target(AnnotationTarget.TYPE)
- |annotation class Hello()
- |fun bar(): @Hello() Int
- """.trimMargin(),
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- documentablesTransformationStage = { module ->
- val type = module.packages.single()
- .classlikes.first { it.name == "TestKt" }
- .functions.single()
- .type as GenericTypeConstructor
- assertEquals(
- Annotations.Annotation(DRI("kotlinAsJavaPlugin", "Hello"), emptyMap()),
- type.extra[Annotations]?.directAnnotations?.values?.single()?.single()
- )
- // A bug; the GenericTypeConstructor cast should fail and this should be a PrimitiveJavaType
- assertEquals("java.lang/Integer///PointingToDeclaration/", type.dri.toString())
- }
- }
- }
-
- @Test
- fun `Java function should keep its access modifier`(){
- val className = "Test"
- val accessModifier = "public"
- val methodName = "method"
-
- val testClassQuery = """
- |/src/main/kotlin/kotlinAsJavaPlugin/${className}.java
- |package kotlinAsJavaPlugin;
- |
- |public class $className {
- | $accessModifier void ${methodName}() {
- |
- | }
- |}
- """.trimMargin()
-
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- }
- }
- }
-
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- testClassQuery,
- configuration,
- pluginOverrides = listOf(writerPlugin),
- cleanupOutput = true
- ) {
- renderingStage = { _, _ ->
- val methodDocumentation = "root/kotlinAsJavaPlugin/-${className.toLowerCase()}/${methodName}.html"
-
- writerPlugin.writer.renderedContent(methodDocumentation)
- .firstSignature()
- .match(
- "$accessModifier void ", A(methodName), "()",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-}
-
-private val ContentNode.mainContents: List<ContentNode>
- get() = (this as ContentGroup).children
- .filterIsInstance<ContentGroup>()
- .single { it.dci.kind == ContentKind.Main }.children[0].let { it.children[0] }.children
diff --git a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt b/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt
deleted file mode 100644
index 25312810..00000000
--- a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaSignatureTest.kt
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinAsJavaPlugin
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.jdk
-import signatures.firstSignature
-import signatures.renderedContent
-import signatures.signature
-import utils.*
-import kotlin.test.Test
-
-class KotlinAsJavaSignatureTest : BaseAbstractTest() {
-
- private val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- stdlibExternalDocumentationLink
- )
- classpath = listOfNotNull(jvmStdlibPath)
- }
- }
- }
-
- @Suppress("SameParameterValue")
- private fun source(signature: String) =
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- | $signature
- """.trimIndent()
-
- @Test
- fun `fun with definitely non-nullable types as java`() {
- val source = source("fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y")
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signature = writerPlugin.writer.renderedContent("root/kotlinAsJavaPlugin/-test-kt/elvis-like.html").firstSignature()
- signature.match(
- "public final static ", Span("T"), A("elvisLike"),
- "<T extends ", A("Any"), ">(",
- Span(
- Span(Span(), " x, "),
- Span(Span(), " y")
- ),
- ")",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-
- @Test
- fun `should display annotations`() {
- val writerPlugin = TestOutputWriterPlugin()
-
- testInline(
- """
- |/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
- |package kotlinAsJavaPlugin
- |
- |@MustBeDocumented
- |annotation class OnClass
- |
- |@MustBeDocumented
- |annotation class OnMethod
- |
- |@MustBeDocumented
- |annotation class OnParameter
- |
- |@Target(AnnotationTarget.TYPE)
- |@MustBeDocumented
- |annotation class OnType
- |
- |@Target(AnnotationTarget.TYPE_PARAMETER)
- |@MustBeDocumented
- |annotation class OnTypeParameter
- |
- |@OnClass
- |class Clazz<@OnTypeParameter T : @OnType Any> {
- | @OnMethod
- | fun <@OnTypeParameter T : @OnType Any> withParams(@OnParameter str1: String, str2: String): Boolean {
- | return str1 == str2
- | }
- |}
- """.trimIndent(),
- configuration,
- pluginOverrides = listOf(writerPlugin)
- ) {
- renderingStage = { _, _ ->
- val signatures = writerPlugin.writer
- .renderedContent("root/kotlinAsJavaPlugin/-clazz/index.html")
- .signature()
-
- val classSignature = signatures[0]
- classSignature.match(
- Div(Div("@", A("OnClass"), "()")),
- "public final class ", A("Clazz"),
- // <@OnTypeParameter() T extends @OnType() Object>
- "<", Span("@", A("OnTypeParameter"), "() "), "T extends ", Span("@", A("OnType"), "() "), A("Object"), ">",
- ignoreSpanWithTokenStyle = true
- )
-
- val functionSignature = signatures[2]
- functionSignature.match(
- Div(Div("@", A("OnMethod"), "()")),
- "public final ", A("Boolean"), A("withParams"),
- // <@OnTypeParameter() T extends @OnType() Object>
- "<", Span("@", A("OnTypeParameter"), "() "), "T extends ", Span("@", A("OnType"), "() "), A("Any"), ">(",
- Span(
- Span(
- Span("@", A("OnParameter"), "() "),
- A("String"), "str1, "
- ),
- Span(
- A("String"), "str2"
- )
- ), ")",
- ignoreSpanWithTokenStyle = true
- )
- }
- }
- }
-}
diff --git a/plugins/mathjax/README.md b/plugins/mathjax/README.md
deleted file mode 100644
index a12095ee..00000000
--- a/plugins/mathjax/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# MathJax plugin
-
-[MathJax](https://docs.mathjax.org/) allows you to include mathematics in your web pages. The `mathjax` Dokka plugin
-adds the ability to render mathematics found in source code comments.
-
-If MathJax plugin encounters the `@usesMathJax` KDoc tag, it adds `MathJax.js` (ver. 2) with `config=TeX-AMS_SVG`
-to the generated HTML pages.
-
-Usage example:
-
-```kotlin
-/**
- * Some math \(\sqrt{3x-1}+(1+x)^2\)
- *
- * @usesMathJax
- */
-class Foo {}
-```
-
-Note that the `@usesMathJax` tag is case-sensitive.
-
-The MathJax plugin is published to Maven Central as a
-[separate artifact](https://mvnrepository.com/artifact/org.jetbrains.dokka/mathjax-plugin):
-
-```text
-org.jetbrains.dokka:mathjax-plugin:1.9.10
-```
diff --git a/plugins/mathjax/api/mathjax.api b/plugins/mathjax/api/mathjax.api
deleted file mode 100644
index da5caeb2..00000000
--- a/plugins/mathjax/api/mathjax.api
+++ /dev/null
@@ -1,18 +0,0 @@
-public final class org/jetbrains/dokka/mathjax/MathjaxPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getMathjaxTagContentProvider ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getTransformer ()Lorg/jetbrains/dokka/plugability/Extension;
-}
-
-public final class org/jetbrains/dokka/mathjax/MathjaxTagContentProvider : org/jetbrains/dokka/base/transformers/pages/tags/CustomTagContentProvider {
- public static final field INSTANCE Lorg/jetbrains/dokka/mathjax/MathjaxTagContentProvider;
- public fun contentForBrief (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public fun contentForDescription (Lorg/jetbrains/dokka/base/translators/documentables/PageContentBuilder$DocumentableContentBuilder;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)V
- public fun isApplicable (Lorg/jetbrains/dokka/model/doc/CustomTagWrapper;)Z
-}
-
-public final class org/jetbrains/dokka/mathjax/MathjaxTransformer : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public static final field INSTANCE Lorg/jetbrains/dokka/mathjax/MathjaxTransformer;
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
diff --git a/plugins/mathjax/build.gradle.kts b/plugins/mathjax/build.gradle.kts
deleted file mode 100644
index fba465aa..00000000
--- a/plugins/mathjax/build.gradle.kts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
- id("org.jetbrains.conventions.base-unit-test")
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
-
- implementation(kotlin("reflect"))
-
- testImplementation(kotlin("test"))
- testImplementation(libs.jsoup)
- testImplementation(projects.core.contentMatcherTestUtils)
- testImplementation(projects.core.testApi)
-
- symbolsTestConfiguration(project(path = ":subprojects:analysis-kotlin-symbols", configuration = "shadow"))
- descriptorsTestConfiguration(project(path = ":subprojects:analysis-kotlin-descriptors", configuration = "shadow"))
- testImplementation(projects.plugins.base.baseTestUtils) {
- exclude(module = "analysis-kotlin-descriptors")
- }
-}
-
-registerDokkaArtifactPublication("mathjaxPlugin") {
- artifactId = "mathjax-plugin"
-}
diff --git a/plugins/mathjax/src/main/kotlin/MathjaxPlugin.kt b/plugins/mathjax/src/main/kotlin/MathjaxPlugin.kt
deleted file mode 100644
index 2a7ed6a4..00000000
--- a/plugins/mathjax/src/main/kotlin/MathjaxPlugin.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.mathjax
-
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.transformers.pages.tags.CustomTagContentProvider
-import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder.DocumentableContentBuilder
-import org.jetbrains.dokka.model.doc.CustomTagWrapper
-import org.jetbrains.dokka.pages.ContentPage
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.pages.WithDocumentables
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.Extension
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class MathjaxPlugin : DokkaPlugin() {
-
- public val transformer: Extension<PageTransformer, *, *> by extending {
- CoreExtensions.pageTransformer with MathjaxTransformer
- }
-
- public val mathjaxTagContentProvider: Extension<CustomTagContentProvider, *, *> by extending {
- plugin<DokkaBase>().customTagContentProvider with MathjaxTagContentProvider order {
- before(plugin<DokkaBase>().sinceKotlinTagContentProvider)
- }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
-
-private const val ANNOTATION = "usesMathJax"
-internal const val LIB_PATH = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js?config=TeX-AMS_SVG&latest"
-
-public object MathjaxTransformer : PageTransformer {
-
- override fun invoke(input: RootPageNode): RootPageNode = input.transformContentPagesTree {
- it.modified(
- embeddedResources = it.embeddedResources + if (it.isNeedingMathjax) listOf(LIB_PATH) else emptyList()
- )
- }
-
- private val ContentPage.isNeedingMathjax
- get() = (this as WithDocumentables).documentables.any { it.documentation.values
- .flatMap { it.children }
- .any { (it as? CustomTagWrapper)?.name == ANNOTATION } }
-}
-
-public object MathjaxTagContentProvider : CustomTagContentProvider {
-
- override fun isApplicable(customTag: CustomTagWrapper): Boolean = customTag.name == ANNOTATION
-
- override fun DocumentableContentBuilder.contentForDescription(
- sourceSet: DokkaConfiguration.DokkaSourceSet,
- customTag: CustomTagWrapper
- ) {
- comment(customTag.root, sourceSets = setOf(sourceSet))
- }
-}
diff --git a/plugins/mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index 4a9d7a9e..00000000
--- a/plugins/mathjax/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.mathjax.MathjaxPlugin
diff --git a/plugins/mathjax/src/test/kotlin/MathjaxPluginTest.kt b/plugins/mathjax/src/test/kotlin/MathjaxPluginTest.kt
deleted file mode 100644
index 905684d2..00000000
--- a/plugins/mathjax/src/test/kotlin/MathjaxPluginTest.kt
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package mathjaxTest
-
-import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
-import org.jetbrains.dokka.mathjax.LIB_PATH
-import org.jetbrains.dokka.mathjax.MathjaxPlugin
-import org.jsoup.Jsoup
-import utils.TestOutputWriterPlugin
-import kotlin.test.Test
-import kotlin.test.assertTrue
-
-class MathjaxPluginTest : BaseAbstractTest() {
- @Test
- fun noMathjaxTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/test/Test.kt")
- }
- }
- }
- val source =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- | /**
- | * Just a regular kdoc
- | */
- | fun test(): String = ""
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin, MathjaxPlugin())
- ) {
- renderingStage = {
- _, _ -> Jsoup
- .parse(writerPlugin.writer.contents.getValue("root/example/test.html"))
- .head()
- .select("link, script")
- .let {
- assertTrue(!it.`is`("[href=$LIB_PATH], [src=$LIB_PATH]"))
- }
- }
- }
- }
-
- @Test
- fun usingMathjaxTest() {
- val configuration = dokkaConfiguration {
- sourceSets {
- sourceSet {
- sourceRoots = listOf("src/main/kotlin/test/Test.kt")
- }
- }
- }
- val math = "a^2 = b^2 + c^2"
- val source =
- """
- |/src/main/kotlin/test/Test.kt
- |package example
- | /**
- | * @usesMathJax
- | *
- | * \($math\)
- | */
- | fun test(): String = ""
- """.trimIndent()
- val writerPlugin = TestOutputWriterPlugin()
- testInline(
- source,
- configuration,
- pluginOverrides = listOf(writerPlugin, MathjaxPlugin())
- ) {
- renderingStage = { _, _ ->
- val parsed = Jsoup.parse(writerPlugin.writer.contents.getValue("root/example/test.html"))
-
- // Ensure the MathJax CDN is loaded
- assertTrue(parsed.select("link, script").`is`("[href=$LIB_PATH], [src=$LIB_PATH]"))
-
- // Ensure the contents are displayed
- assertTrue(parsed.select("p").any {
- it.text().contains(math)
- })
- }
- }
- }
-}
diff --git a/plugins/templating/README.md b/plugins/templating/README.md
deleted file mode 100644
index 92eee3e2..00000000
--- a/plugins/templating/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Templating plugin
-
-Templating plugin is used internally by Dokka and HTML format in particular to help handle substitution
-commands, resolve relative links and process templates.
diff --git a/plugins/templating/api/templating.api b/plugins/templating/api/templating.api
deleted file mode 100644
index aedd8ef3..00000000
--- a/plugins/templating/api/templating.api
+++ /dev/null
@@ -1,185 +0,0 @@
-public abstract class org/jetbrains/dokka/allModulesPage/templates/BaseJsonNavigationTemplateProcessingStrategy : org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canProcess (Ljava/io/File;)Z
- public fun finish (Ljava/io/File;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public abstract fun getNavigationFileNameWithoutExtension ()Ljava/lang/String;
- public abstract fun getPath ()Ljava/lang/String;
- public fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
-public final class org/jetbrains/dokka/allModulesPage/templates/PackageListProcessingStrategy : org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun finish (Ljava/io/File;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
-public final class org/jetbrains/dokka/allModulesPage/templates/PagesSearchTemplateStrategy : org/jetbrains/dokka/allModulesPage/templates/BaseJsonNavigationTemplateProcessingStrategy {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun getNavigationFileNameWithoutExtension ()Ljava/lang/String;
- public fun getPath ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/templates/AddToNavigationCommandHandler : org/jetbrains/dokka/templates/CommandHandler {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canHandle (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun finish (Ljava/io/File;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun handleCommand (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsTag (Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
-public abstract interface class org/jetbrains/dokka/templates/CommandHandler {
- public abstract fun canHandle (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public abstract fun finish (Ljava/io/File;)V
- public abstract fun handleCommand (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public abstract fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public abstract fun handleCommandAsTag (Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
-public final class org/jetbrains/dokka/templates/CommandHandler$DefaultImpls {
- public static fun finish (Lorg/jetbrains/dokka/templates/CommandHandler;Ljava/io/File;)V
- public static fun handleCommand (Lorg/jetbrains/dokka/templates/CommandHandler;Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public static fun handleCommandAsComment (Lorg/jetbrains/dokka/templates/CommandHandler;Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public static fun handleCommandAsTag (Lorg/jetbrains/dokka/templates/CommandHandler;Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
-public final class org/jetbrains/dokka/templates/DefaultMultiModuleTemplateProcessor : org/jetbrains/dokka/templates/MultiModuleTemplateProcessor {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun process (Lorg/jetbrains/dokka/pages/RootPageNode;)V
-}
-
-public final class org/jetbrains/dokka/templates/DefaultSubmoduleTemplateProcessor : org/jetbrains/dokka/templates/SubmoduleTemplateProcessor {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun process (Ljava/util/List;)Lorg/jetbrains/dokka/templates/TemplatingResult;
-}
-
-public final class org/jetbrains/dokka/templates/DirectiveBasedHtmlTemplateProcessingStrategy : org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun finish (Ljava/io/File;)V
- public final fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public final fun handleCommandAsTag (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
-public final class org/jetbrains/dokka/templates/FallbackTemplateProcessingStrategy : org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public fun <init> ()V
- public fun finish (Ljava/io/File;)V
- public fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
-public abstract interface class org/jetbrains/dokka/templates/MultiModuleTemplateProcessor : org/jetbrains/dokka/templates/TemplateProcessor {
- public abstract fun process (Lorg/jetbrains/dokka/pages/RootPageNode;)V
-}
-
-public final class org/jetbrains/dokka/templates/PathToRootSubstitutor : org/jetbrains/dokka/templates/Substitutor {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun trySubstitute (Lorg/jetbrains/dokka/templates/TemplatingContext;Lkotlin/text/MatchResult;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/templates/SubmoduleTemplateProcessor : org/jetbrains/dokka/templates/TemplateProcessor {
- public abstract fun process (Ljava/util/List;)Lorg/jetbrains/dokka/templates/TemplatingResult;
-}
-
-public final class org/jetbrains/dokka/templates/SubstitutionCommandHandler : org/jetbrains/dokka/templates/CommandHandler {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canHandle (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun finish (Ljava/io/File;)V
- public fun handleCommand (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsTag (Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
-public abstract interface class org/jetbrains/dokka/templates/Substitutor {
- public abstract fun trySubstitute (Lorg/jetbrains/dokka/templates/TemplatingContext;Lkotlin/text/MatchResult;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public abstract fun finish (Ljava/io/File;)V
- public abstract fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
-public final class org/jetbrains/dokka/templates/TemplateProcessingStrategy$DefaultImpls {
- public static fun finish (Lorg/jetbrains/dokka/templates/TemplateProcessingStrategy;Ljava/io/File;)V
-}
-
-public abstract interface class org/jetbrains/dokka/templates/TemplateProcessor {
-}
-
-public final class org/jetbrains/dokka/templates/TemplatingContext {
- public fun <init> (Ljava/io/File;Ljava/io/File;Ljava/util/List;Lorg/jetbrains/dokka/base/templating/Command;)V
- public final fun component1 ()Ljava/io/File;
- public final fun component2 ()Ljava/io/File;
- public final fun component3 ()Ljava/util/List;
- public final fun component4 ()Lorg/jetbrains/dokka/base/templating/Command;
- public final fun copy (Ljava/io/File;Ljava/io/File;Ljava/util/List;Lorg/jetbrains/dokka/base/templating/Command;)Lorg/jetbrains/dokka/templates/TemplatingContext;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/templates/TemplatingContext;Ljava/io/File;Ljava/io/File;Ljava/util/List;Lorg/jetbrains/dokka/base/templating/Command;ILjava/lang/Object;)Lorg/jetbrains/dokka/templates/TemplatingContext;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getBody ()Ljava/util/List;
- public final fun getCommand ()Lorg/jetbrains/dokka/base/templating/Command;
- public final fun getInput ()Ljava/io/File;
- public final fun getOutput ()Ljava/io/File;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/templates/TemplatingPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getAddToNavigationCommandHandler ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultMultiModuleTemplateProcessor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultSubmoduleTemplateProcessor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDirectiveBasedCommandHandlers ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getDirectiveBasedHtmlTemplateProcessingStrategy ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getFallbackProcessingStrategy ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getMultimoduleTemplateProcessor ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getPackageListProcessingStrategy ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPagesSearchTemplateStrategy ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPathToRootSubstitutor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getProjectNameSubstitutor ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getReplaceVersionCommandHandler ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSourcesetDependencyProcessingStrategy ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSubmoduleTemplateProcessor ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getSubstitutionCommandHandler ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getSubstitutor ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getTemplateProcessingStrategy ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
-}
-
-public final class org/jetbrains/dokka/templates/TemplatingResult {
- public fun <init> ()V
- public fun <init> (Ljava/util/List;)V
- public synthetic fun <init> (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/util/List;
- public final fun copy (Ljava/util/List;)Lorg/jetbrains/dokka/templates/TemplatingResult;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/templates/TemplatingResult;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/dokka/templates/TemplatingResult;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getModules ()Ljava/util/List;
- public fun hashCode ()I
- public final fun plus (Lorg/jetbrains/dokka/templates/TemplatingResult;)Lorg/jetbrains/dokka/templates/TemplatingResult;
- public fun toString ()Ljava/lang/String;
-}
-
-public final class templates/ProjectNameSubstitutor : org/jetbrains/dokka/templates/Substitutor {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun trySubstitute (Lorg/jetbrains/dokka/templates/TemplatingContext;Lkotlin/text/MatchResult;)Ljava/lang/String;
-}
-
-public final class templates/ReplaceVersionCommandHandler : org/jetbrains/dokka/templates/CommandHandler {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canHandle (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun finish (Ljava/io/File;)V
- public fun handleCommand (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsTag (Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
-public final class templates/SourcesetDependencyProcessingStrategy : org/jetbrains/dokka/templates/TemplateProcessingStrategy {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun finish (Ljava/io/File;)V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun process (Ljava/io/File;Ljava/io/File;Lorg/jetbrains/dokka/DokkaConfiguration$DokkaModuleDescription;)Z
-}
-
diff --git a/plugins/templating/build.gradle.kts b/plugins/templating/build.gradle.kts
deleted file mode 100644
index da0dadcd..00000000
--- a/plugins/templating/build.gradle.kts
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-registerDokkaArtifactPublication("templating-plugin") {
- artifactId = "templating-plugin"
-}
-
-dependencies {
- compileOnly(projects.core)
-
- api(libs.jsoup)
-
- implementation(projects.plugins.base)
-
- implementation(kotlin("reflect"))
- implementation(libs.kotlinx.coroutines.core)
-
- testImplementation(kotlin("test"))
- testImplementation(libs.junit.jupiterParams)
-
- testImplementation(projects.plugins.base.baseTestUtils)
- testImplementation(projects.core.testApi)
- testImplementation(libs.kotlinx.html)
-}
diff --git a/plugins/templating/src/main/kotlin/templates/AddToNavigationCommandHandler.kt b/plugins/templating/src/main/kotlin/templates/AddToNavigationCommandHandler.kt
deleted file mode 100644
index 78c6c684..00000000
--- a/plugins/templating/src/main/kotlin/templates/AddToNavigationCommandHandler.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.base.templating.AddToNavigationCommand
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jsoup.nodes.Attributes
-import org.jsoup.nodes.Element
-import org.jsoup.parser.Tag
-import java.io.File
-import java.nio.file.Files
-import java.util.concurrent.ConcurrentHashMap
-
-public class AddToNavigationCommandHandler(
- public val context: DokkaContext
-) : CommandHandler {
- private val navigationFragments = ConcurrentHashMap<String, Element>()
-
- override fun handleCommandAsTag(command: Command, body: Element, input: File, output: File) {
- command as AddToNavigationCommand
- context.configuration.modules.find { it.name == command.moduleName }
- ?.relativePathToOutputDirectory
- ?.relativeToOrSelf(context.configuration.outputDir)
- ?.let { key -> navigationFragments[key.toString()] = body }
- }
-
- override fun canHandle(command: Command): Boolean = command is AddToNavigationCommand
-
- override fun finish(output: File) {
- if (navigationFragments.isNotEmpty()) {
- val attributes = Attributes().apply {
- put("class", "sideMenu")
- }
- val node = Element(Tag.valueOf("div"), "", attributes)
- navigationFragments.entries.sortedBy { it.key }.forEach { (moduleName, command) ->
- command.select("a").forEach { a ->
- a.attr("href").also { a.attr("href", "${moduleName}/${it}") }
- }
- command.childNodes().toList().forEachIndexed { index, child ->
- if (index == 0) {
- child.attr("id", "$moduleName-nav-submenu")
- }
- node.appendChild(child)
- }
- }
-
- Files.write(output.resolve("navigation.html").toPath(), listOf(node.outerHtml()))
- node.select("a").forEach { a ->
- a.attr("href").also { a.attr("href", "../${it}") }
- }
- navigationFragments.keys.forEach {
- Files.write(
- output.resolve(it).resolve("navigation.html").toPath(),
- listOf(node.outerHtml())
- )
- }
- }
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/CommandHandler.kt b/plugins/templating/src/main/kotlin/templates/CommandHandler.kt
deleted file mode 100644
index c06d52c3..00000000
--- a/plugins/templating/src/main/kotlin/templates/CommandHandler.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.base.templating.Command
-import org.jsoup.nodes.Element
-import org.jsoup.nodes.Node
-import java.io.File
-
-
-public interface CommandHandler {
- @Deprecated("This was renamed to handleCommandAsTag", ReplaceWith("handleCommandAsTag(command, element, input, output)"))
- public fun handleCommand(element: Element, command: Command, input: File, output: File) { }
-
- @Suppress("DEPRECATION")
- public fun handleCommandAsTag(command: Command, body: Element, input: File, output: File) {
- handleCommand(body, command, input, output)
- }
- public fun handleCommandAsComment(command: Command, body: List<Node>, input: File, output: File) { }
- public fun canHandle(command: Command): Boolean
- public fun finish(output: File) {}
-}
-
diff --git a/plugins/templating/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt b/plugins/templating/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt
deleted file mode 100644
index c36f2834..00000000
--- a/plugins/templating/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.renderers.html.TEMPLATE_COMMAND_BEGIN_BORDER
-import org.jetbrains.dokka.base.renderers.html.TEMPLATE_COMMAND_END_BORDER
-import org.jetbrains.dokka.base.renderers.html.TEMPLATE_COMMAND_SEPARATOR
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.parseJson
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Comment
-import org.jsoup.nodes.Element
-import org.jsoup.nodes.Node
-import org.jsoup.nodes.TextNode
-import java.io.File
-import java.nio.file.Files
-
-public class DirectiveBasedHtmlTemplateProcessingStrategy(private val context: DokkaContext) : TemplateProcessingStrategy {
-
- private val directiveBasedCommandHandlers =
- context.plugin<TemplatingPlugin>().query { directiveBasedCommandHandlers }
-
- override fun process(input: File, output: File, moduleContext: DokkaConfiguration.DokkaModuleDescription?): Boolean =
- if (input.isFile && input.extension == "html") {
- val document = Jsoup.parse(input, "UTF-8")
- document.outputSettings().indentAmount(0).prettyPrint(false)
-
- document.select("dokka-template-command").forEach {
- handleCommandAsTag(it, parseJson(it.attr("data")), input, output)
- }
- extractCommandsFromComments(document) { command, body ->
- val bodyTrimed =
- body.dropWhile { node -> (node is TextNode && node.isBlank).also { if (it) node.remove() } }
- .dropLastWhile { node -> (node is TextNode && node.isBlank).also { if (it) node.remove() } }
- handleCommandAsComment(command, bodyTrimed, input, output)
- }
-
- Files.write(output.toPath(), listOf(document.outerHtml()))
- true
- } else false
-
- public fun handleCommandAsTag(element: Element, command: Command, input: File, output: File) {
- traverseHandlers(command) { handleCommandAsTag(command, element, input, output) }
- }
-
- public fun handleCommandAsComment(command: Command, body: List<Node>, input: File, output: File) {
- traverseHandlers(command) { handleCommandAsComment(command, body, input, output) }
- }
-
- private fun traverseHandlers(command: Command, action: CommandHandler.() -> Unit) {
- val handlers = directiveBasedCommandHandlers.filter { it.canHandle(command) }
- if (handlers.isEmpty())
- context.logger.warn("Unknown templating command $command")
- else
- handlers.forEach(action)
- }
-
- private fun extractCommandsFromComments(
- node: Node,
- startFrom: Int = 0,
- handler: (command: Command, body: List<Node>) -> Unit
- ) {
- val nodes: MutableList<Node> = mutableListOf()
- var lastStartBorder: Comment? = null
- var firstStartBorder: Comment? = null
- for (index in startFrom until node.childNodeSize()) {
- when (val currentChild = node.childNode(index)) {
- is Comment -> if (currentChild.data.startsWith(TEMPLATE_COMMAND_BEGIN_BORDER)) {
- lastStartBorder = currentChild
- firstStartBorder = firstStartBorder ?: currentChild
- nodes.clear()
- } else if (lastStartBorder != null && currentChild.data.startsWith(TEMPLATE_COMMAND_END_BORDER)) {
- lastStartBorder.remove()
- val cmd = lastStartBorder.data
- .removePrefix("$TEMPLATE_COMMAND_BEGIN_BORDER$TEMPLATE_COMMAND_SEPARATOR")
- .let { parseJson<Command>(it) }
-
- handler(cmd, nodes)
- currentChild.remove()
- extractCommandsFromComments(node, firstStartBorder?.siblingIndex() ?: 0, handler)
- return
- } else {
- if (lastStartBorder != null) nodes.add(currentChild)
- }
- else -> {
- extractCommandsFromComments(currentChild, handler = handler)
- if (lastStartBorder != null) nodes.add(currentChild)
- }
- }
- }
- }
-
- override fun finish(output: File) {
- directiveBasedCommandHandlers.forEach { it.finish(output) }
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt b/plugins/templating/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt
deleted file mode 100644
index a76d8eae..00000000
--- a/plugins/templating/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.DokkaConfiguration
-import java.io.File
-
-public class FallbackTemplateProcessingStrategy : TemplateProcessingStrategy {
-
- override fun process(input: File, output: File, moduleContext: DokkaConfiguration.DokkaModuleDescription?): Boolean {
- if (input != output) input.copyTo(output, overwrite = true)
- return true
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/JsonElementBasedTemplateProcessingStrategy.kt b/plugins/templating/src/main/kotlin/templates/JsonElementBasedTemplateProcessingStrategy.kt
deleted file mode 100644
index 8c6cee03..00000000
--- a/plugins/templating/src/main/kotlin/templates/JsonElementBasedTemplateProcessingStrategy.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage.templates
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaModuleDescription
-import org.jetbrains.dokka.base.renderers.html.SearchRecord
-import org.jetbrains.dokka.base.templating.AddToSearch
-import org.jetbrains.dokka.base.templating.parseJson
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.templates.TemplateProcessingStrategy
-import java.io.File
-import java.util.concurrent.ConcurrentHashMap
-
-public abstract class BaseJsonNavigationTemplateProcessingStrategy(
- public val context: DokkaContext
-) : TemplateProcessingStrategy {
- public abstract val navigationFileNameWithoutExtension: String
- public abstract val path: String
-
- private val fragments = ConcurrentHashMap<String, List<SearchRecord>>()
-
- public open fun canProcess(file: File): Boolean =
- file.extension == "json" && file.nameWithoutExtension == navigationFileNameWithoutExtension
-
- override fun process(input: File, output: File, moduleContext: DokkaModuleDescription?): Boolean {
- val canProcess = canProcess(input)
- if (canProcess) {
- runCatching { parseJson<AddToSearch>(input.readText()) }.getOrNull()?.let { command ->
- moduleContext?.relativePathToOutputDirectory
- ?.relativeToOrSelf(context.configuration.outputDir)
- ?.let { key ->
- fragments[key.toString()] = command.elements
- }
- } ?: fallbackToCopy(input, output)
- }
- return canProcess
- }
-
- override fun finish(output: File) {
- if (fragments.isNotEmpty()) {
- val content = toJsonString(fragments.entries.flatMap { (moduleName, navigation) ->
- navigation.map { it.withResolvedLocation(moduleName) }
- })
- output.resolve(path).mkdirs()
- output.resolve("$path/$navigationFileNameWithoutExtension.json").writeText(content)
- }
- }
-
- private fun fallbackToCopy(input: File, output: File) {
- context.logger.warn("Falling back to just copying ${input.name} file even though it should have been processed")
- input.copyTo(output)
- }
-
- private fun SearchRecord.withResolvedLocation(moduleName: String): SearchRecord =
- copy(location = "$moduleName/$location")
-
-}
-
-public class PagesSearchTemplateStrategy(
- public val dokkaContext: DokkaContext
-) : BaseJsonNavigationTemplateProcessingStrategy(dokkaContext) {
- override val navigationFileNameWithoutExtension: String = "pages"
- override val path: String = "scripts"
-}
diff --git a/plugins/templating/src/main/kotlin/templates/PackageListProcessingStrategy.kt b/plugins/templating/src/main/kotlin/templates/PackageListProcessingStrategy.kt
deleted file mode 100644
index 4da45e3f..00000000
--- a/plugins/templating/src/main/kotlin/templates/PackageListProcessingStrategy.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.allModulesPage.templates
-
-import org.jetbrains.dokka.DokkaConfiguration.DokkaModuleDescription
-import org.jetbrains.dokka.base.renderers.PackageListService
-import org.jetbrains.dokka.base.resolvers.shared.PackageList
-import org.jetbrains.dokka.base.resolvers.shared.PackageList.Companion.PACKAGE_LIST_NAME
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.templates.TemplateProcessingStrategy
-import java.io.File
-
-public class PackageListProcessingStrategy(
- public val context: DokkaContext
-) : TemplateProcessingStrategy {
- private val fragments = mutableSetOf<PackageList>()
-
- private fun canProcess(file: File, moduleContext: DokkaModuleDescription?): Boolean =
- file.extension.isBlank() && file.nameWithoutExtension == PACKAGE_LIST_NAME && moduleContext != null
-
- override fun process(input: File, output: File, moduleContext: DokkaModuleDescription?): Boolean {
- val canProcess = canProcess(input, moduleContext)
- if (canProcess) {
- val packageList = PackageList.load(input.toURI().toURL(), 8, true)
- val moduleFilename = moduleContext?.name?.let { "$it/" }
- packageList?.copy(
- modules = mapOf(moduleContext?.name.orEmpty() to packageList.modules.getOrDefault(PackageList.SINGLE_MODULE_NAME, emptySet())),
- locations = packageList.locations.entries.associate { it.key to "$moduleFilename${it.value}" }
- )?.let { fragments.add(it) } ?: fallbackToCopy(input, output)
- }
- return canProcess
- }
-
- override fun finish(output: File) {
- if (fragments.isNotEmpty()) {
- val linkFormat = fragments.first().linkFormat
-
- if (!fragments.all { it.linkFormat == linkFormat }) {
- context.logger.error("Link format is inconsistent between modules: " + fragments.joinToString { it.linkFormat.formatName } )
- }
-
- val locations: Map<String, String> = fragments.map { it.locations }.fold(emptyMap()) { acc, el -> acc + el }
- val modules: Map<String, Set<String>> = fragments.map { it.modules }.fold(emptyMap()) { acc, el -> acc + el }
- val mergedPackageList = PackageListService.renderPackageList(locations, modules, linkFormat.formatName, linkFormat.linkExtension)
- output.mkdirs()
- output.resolve(PACKAGE_LIST_NAME).writeText(mergedPackageList)
- }
- }
-
- private fun fallbackToCopy(input: File, output: File) {
- context.logger.warn("Falling back to just copying ${input.name} file even though it should have been processed")
- input.copyTo(output)
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/PathToRootSubstitutor.kt b/plugins/templating/src/main/kotlin/templates/PathToRootSubstitutor.kt
deleted file mode 100644
index 2ba290cf..00000000
--- a/plugins/templating/src/main/kotlin/templates/PathToRootSubstitutor.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.base.templating.PathToRootSubstitutionCommand
-import org.jetbrains.dokka.base.templating.SubstitutionCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.io.File
-
-public class PathToRootSubstitutor(
- private val dokkaContext: DokkaContext
-) : Substitutor {
-
- override fun trySubstitute(context: TemplatingContext<SubstitutionCommand>, match: MatchResult): String? =
- if (context.command is PathToRootSubstitutionCommand) {
- context.output.toPath().parent.relativize(dokkaContext.configuration.outputDir.toPath()).toString().split(File.separator).joinToString(separator = "/", postfix = "/") { it }
- } else null
-}
diff --git a/plugins/templating/src/main/kotlin/templates/ProjectNameSubstitutor.kt b/plugins/templating/src/main/kotlin/templates/ProjectNameSubstitutor.kt
deleted file mode 100644
index 9b22f31b..00000000
--- a/plugins/templating/src/main/kotlin/templates/ProjectNameSubstitutor.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package templates
-
-import org.jetbrains.dokka.base.templating.ProjectNameSubstitutionCommand
-import org.jetbrains.dokka.base.templating.SubstitutionCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.templates.Substitutor
-import org.jetbrains.dokka.templates.TemplatingContext
-
-public class ProjectNameSubstitutor(
- private val dokkaContext: DokkaContext
-) : Substitutor {
-
- override fun trySubstitute(context: TemplatingContext<SubstitutionCommand>, match: MatchResult): String? =
- dokkaContext.configuration.moduleName.takeIf { context.command is ProjectNameSubstitutionCommand }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/ReplaceVersionCommandHandler.kt b/plugins/templating/src/main/kotlin/templates/ReplaceVersionCommandHandler.kt
deleted file mode 100644
index 28820278..00000000
--- a/plugins/templating/src/main/kotlin/templates/ReplaceVersionCommandHandler.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package templates
-
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ReplaceVersionsCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.templates.CommandHandler
-import org.jsoup.nodes.Element
-import org.jsoup.nodes.TextNode
-import java.io.File
-
-public class ReplaceVersionCommandHandler(
- private val context: DokkaContext
-) : CommandHandler {
-
- override fun canHandle(command: Command): Boolean = command is ReplaceVersionsCommand
-
- override fun handleCommandAsTag(command: Command, body: Element, input: File, output: File) {
- val parent = body.parent()
- if (parent != null) {
- val position = body.elementSiblingIndex()
- body.remove()
-
- context.configuration.moduleVersion?.takeIf { it.isNotEmpty() }
- ?.let { parent.insertChildren(position, TextNode(it)) }
- }
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/SourcesetDependencyProcessingStrategy.kt b/plugins/templating/src/main/kotlin/templates/SourcesetDependencyProcessingStrategy.kt
deleted file mode 100644
index 38a08eea..00000000
--- a/plugins/templating/src/main/kotlin/templates/SourcesetDependencyProcessingStrategy.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package templates
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.templating.AddToSourcesetDependencies
-import org.jetbrains.dokka.base.templating.parseJson
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.templates.TemplateProcessingStrategy
-import java.io.File
-import java.util.concurrent.ConcurrentHashMap
-
-private typealias Entry = Map<String, List<String>>
-
-public class SourcesetDependencyProcessingStrategy(
- public val context: DokkaContext
-) : TemplateProcessingStrategy {
- private val fileName = "sourceset_dependencies.js"
- private val fragments = ConcurrentHashMap<String, Entry>()
-
- override fun finish(output: File) {
- if (fragments.isNotEmpty()) {
- val content = fragments.values.fold(emptyMap<String, List<String>>()) { acc, e -> acc + e }
- .let { "sourceset_dependencies = '${toJsonString(it)}'" }
- output.resolve("scripts").mkdirs()
- output.resolve("scripts/$fileName").writeText(content)
- }
- }
-
- override fun process(input: File, output: File, moduleContext: DokkaConfiguration.DokkaModuleDescription?): Boolean =
- input.takeIf { it.name == fileName }
- ?.runCatching { parseJson<AddToSourcesetDependencies>(input.readText()) }
- ?.getOrNull()
- ?.also { (moduleName, content) ->
- fragments += (moduleName to content)
- } != null
-}
diff --git a/plugins/templating/src/main/kotlin/templates/SubstitutionCommandHandler.kt b/plugins/templating/src/main/kotlin/templates/SubstitutionCommandHandler.kt
deleted file mode 100644
index 0c030439..00000000
--- a/plugins/templating/src/main/kotlin/templates/SubstitutionCommandHandler.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.SubstitutionCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jsoup.nodes.DataNode
-import org.jsoup.nodes.Element
-import org.jsoup.nodes.Node
-import org.jsoup.nodes.TextNode
-import java.io.File
-
-public class SubstitutionCommandHandler(context: DokkaContext) : CommandHandler {
-
- override fun handleCommandAsTag(command: Command, body: Element, input: File, output: File) {
- command as SubstitutionCommand
- val childrenCopy = body.children().toList()
- substitute(childrenCopy, TemplatingContext(input, output, childrenCopy, command))
-
- val position = body.elementSiblingIndex()
- val parent = body.parent()
- body.remove()
-
- parent?.insertChildren(position, childrenCopy)
- }
-
- override fun handleCommandAsComment(command: Command, body: List<Node>, input: File, output: File) {
- command as SubstitutionCommand
- substitute(body, TemplatingContext(input, output, body, command))
- }
-
- override fun canHandle(command: Command): Boolean = command is SubstitutionCommand
-
- override fun finish(output: File) { }
-
- private val substitutors = context.plugin<TemplatingPlugin>().query { substitutor }
-
- private fun findSubstitution(commandContext: TemplatingContext<SubstitutionCommand>, match: MatchResult): String =
- substitutors.asSequence().mapNotNull { it.trySubstitute(commandContext, match) }.firstOrNull() ?: match.value
-
- private fun substitute(elements: List<Node>, commandContext: TemplatingContext<SubstitutionCommand>) {
- val regex = commandContext.command.pattern.toRegex()
- elements.forEach { it.traverseToSubstitute(regex, commandContext) }
- }
-
- private fun Node.traverseToSubstitute(regex: Regex, commandContext: TemplatingContext<SubstitutionCommand>) {
- when (this) {
- is TextNode -> replaceWith(TextNode(wholeText.substitute(regex, commandContext)))
- is DataNode -> replaceWith(DataNode(wholeData.substitute(regex, commandContext)))
- is Element -> {
- attributes().forEach { attr(it.key, it.value.substitute(regex, commandContext)) }
- childNodes().forEach { it.traverseToSubstitute(regex, commandContext) }
- }
- }
- }
-
- private fun String.substitute(regex: Regex, commandContext: TemplatingContext<SubstitutionCommand>) = buildString {
- var lastOffset = 0
- regex.findAll(this@substitute).forEach { match ->
- append(this@substitute, lastOffset, match.range.first)
- append(findSubstitution(commandContext, match))
- lastOffset = match.range.last + 1
- }
- append(this@substitute, lastOffset, this@substitute.length)
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/Substitutor.kt b/plugins/templating/src/main/kotlin/templates/Substitutor.kt
deleted file mode 100644
index 4dc4d353..00000000
--- a/plugins/templating/src/main/kotlin/templates/Substitutor.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.base.templating.SubstitutionCommand
-
-public fun interface Substitutor {
- public fun trySubstitute(context: TemplatingContext<SubstitutionCommand>, match: MatchResult): String?
-}
diff --git a/plugins/templating/src/main/kotlin/templates/TemplateProcessor.kt b/plugins/templating/src/main/kotlin/templates/TemplateProcessor.kt
deleted file mode 100644
index 762e3c8b..00000000
--- a/plugins/templating/src/main/kotlin/templates/TemplateProcessor.kt
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.runBlocking
-import org.jetbrains.dokka.DokkaConfiguration.DokkaModuleDescription
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.model.withDescendants
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.plugability.querySingle
-import org.jsoup.nodes.Node
-import java.io.File
-
-public interface TemplateProcessor
-
-public interface SubmoduleTemplateProcessor : TemplateProcessor {
- public fun process(modules: List<DokkaModuleDescription>): TemplatingResult
-}
-
-public interface MultiModuleTemplateProcessor : TemplateProcessor {
- public fun process(generatedPagesTree: RootPageNode)
-}
-
-public interface TemplateProcessingStrategy {
- public fun process(input: File, output: File, moduleContext: DokkaModuleDescription?): Boolean
- public fun finish(output: File) {}
-}
-
-public class DefaultSubmoduleTemplateProcessor(
- private val context: DokkaContext,
-) : SubmoduleTemplateProcessor {
-
- private val strategies: List<TemplateProcessingStrategy> =
- context.plugin<TemplatingPlugin>().query { templateProcessingStrategy }
-
- private val configuredModulesPaths =
- context.configuration.modules.associate { it.sourceOutputDirectory.absolutePath to it.name }
-
- override fun process(modules: List<DokkaModuleDescription>): TemplatingResult {
- return runBlocking(Dispatchers.Default) {
- coroutineScope {
- modules.fold(TemplatingResult()) { acc, module ->
- acc + module.sourceOutputDirectory.visit(context.configuration.outputDir.resolve(module.relativePathToOutputDirectory), module)
- }
- }
- }
- }
-
- private suspend fun File.visit(target: File, module: DokkaModuleDescription, acc: TemplatingResult = TemplatingResult()): TemplatingResult =
- coroutineScope {
- val source = this@visit
- if (source.isDirectory) {
- target.mkdirs()
- val files = source.list().orEmpty()
- val accWithSelf = configuredModulesPaths[source.absolutePath]
- ?.takeIf { files.firstOrNull { !it.startsWith(".") } != null }
- ?.let { acc.copy(modules = acc.modules + it) }
- ?: acc
-
- files.fold(accWithSelf) { acc, path ->
- source.resolve(path).visit(target.resolve(path), module, acc)
- }
- } else {
- strategies.first { it.process(source, target, module) }
- acc
- }
- }
-}
-
-public class DefaultMultiModuleTemplateProcessor(
- public val context: DokkaContext,
-) : MultiModuleTemplateProcessor {
- private val strategies: List<TemplateProcessingStrategy> =
- context.plugin<TemplatingPlugin>().query { templateProcessingStrategy }
-
- private val locationProviderFactory = context.plugin<DokkaBase>().querySingle { locationProviderFactory }
-
- override fun process(generatedPagesTree: RootPageNode) {
- val locationProvider = locationProviderFactory.getLocationProvider(generatedPagesTree)
- generatedPagesTree.withDescendants().mapNotNull { pageNode -> locationProvider.resolve(pageNode)?.let { File(it) } }
- .forEach { location -> strategies.first { it.process(location, location, null) } }
- }
-}
-
-public data class TemplatingContext<out T : Command>(
- val input: File,
- val output: File,
- val body: List<Node>,
- val command: T,
-)
-
-public data class TemplatingResult(val modules: List<String> = emptyList()) {
- public operator fun plus(rhs: TemplatingResult): TemplatingResult {
- return TemplatingResult((modules + rhs.modules).distinct())
- }
-}
diff --git a/plugins/templating/src/main/kotlin/templates/TemplatingPlugin.kt b/plugins/templating/src/main/kotlin/templates/TemplatingPlugin.kt
deleted file mode 100644
index 8a2e5a2a..00000000
--- a/plugins/templating/src/main/kotlin/templates/TemplatingPlugin.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.allModulesPage.templates.PackageListProcessingStrategy
-import org.jetbrains.dokka.allModulesPage.templates.PagesSearchTemplateStrategy
-import org.jetbrains.dokka.plugability.*
-import templates.ProjectNameSubstitutor
-import templates.ReplaceVersionCommandHandler
-import templates.SourcesetDependencyProcessingStrategy
-
-@Suppress("unused")
-public class TemplatingPlugin : DokkaPlugin() {
-
- public val submoduleTemplateProcessor: ExtensionPoint<SubmoduleTemplateProcessor> by extensionPoint()
- public val multimoduleTemplateProcessor: ExtensionPoint<MultiModuleTemplateProcessor> by extensionPoint()
- public val templateProcessingStrategy: ExtensionPoint<TemplateProcessingStrategy> by extensionPoint()
- public val directiveBasedCommandHandlers: ExtensionPoint<CommandHandler> by extensionPoint()
- public val substitutor: ExtensionPoint<Substitutor> by extensionPoint()
-
- public val defaultSubmoduleTemplateProcessor: Extension<SubmoduleTemplateProcessor, *, *> by extending {
- submoduleTemplateProcessor providing ::DefaultSubmoduleTemplateProcessor
- }
-
- public val defaultMultiModuleTemplateProcessor: Extension<MultiModuleTemplateProcessor, *, *> by extending {
- multimoduleTemplateProcessor providing ::DefaultMultiModuleTemplateProcessor
- }
-
- public val directiveBasedHtmlTemplateProcessingStrategy: Extension<TemplateProcessingStrategy, *, *> by extending {
- templateProcessingStrategy providing ::DirectiveBasedHtmlTemplateProcessingStrategy order {
- before(fallbackProcessingStrategy)
- }
- }
-
- public val sourcesetDependencyProcessingStrategy: Extension<TemplateProcessingStrategy, *, *> by extending {
- templateProcessingStrategy providing ::SourcesetDependencyProcessingStrategy order {
- before(fallbackProcessingStrategy)
- }
- }
-
- public val pagesSearchTemplateStrategy: Extension<TemplateProcessingStrategy, *, *> by extending {
- templateProcessingStrategy providing ::PagesSearchTemplateStrategy order {
- before(fallbackProcessingStrategy)
- }
- }
-
- public val packageListProcessingStrategy: Extension<TemplateProcessingStrategy, *, *> by extending {
- templateProcessingStrategy providing ::PackageListProcessingStrategy order {
- before(fallbackProcessingStrategy)
- }
- }
-
- public val fallbackProcessingStrategy: Extension<TemplateProcessingStrategy, *, *> by extending {
- templateProcessingStrategy with FallbackTemplateProcessingStrategy()
- }
-
- public val pathToRootSubstitutor: Extension<Substitutor, *, *> by extending {
- substitutor providing ::PathToRootSubstitutor
- }
-
- public val projectNameSubstitutor: Extension<Substitutor, *, *> by extending {
- substitutor providing ::ProjectNameSubstitutor
- }
-
- public val addToNavigationCommandHandler: Extension<CommandHandler, *, *> by extending {
- directiveBasedCommandHandlers providing ::AddToNavigationCommandHandler
- }
- public val substitutionCommandHandler: Extension<CommandHandler, *, *> by extending {
- directiveBasedCommandHandlers providing ::SubstitutionCommandHandler
- }
- public val replaceVersionCommandHandler: Extension<CommandHandler, *, *> by extending {
- directiveBasedCommandHandlers providing ::ReplaceVersionCommandHandler
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/templating/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/templating/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index e6771ac5..00000000
--- a/plugins/templating/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.templates.TemplatingPlugin
diff --git a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToNavigationCommandResolutionTest.kt b/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToNavigationCommandResolutionTest.kt
deleted file mode 100644
index 8492fba1..00000000
--- a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToNavigationCommandResolutionTest.kt
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import kotlinx.html.a
-import kotlinx.html.div
-import kotlinx.html.id
-import kotlinx.html.span
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.DokkaModuleDescriptionImpl
-import org.jetbrains.dokka.base.renderers.html.templateCommand
-import org.jetbrains.dokka.base.templating.AddToNavigationCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.junit.jupiter.api.io.TempDir
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.ValueSource
-import utils.assertHtmlEqualsIgnoringWhitespace
-import java.io.File
-import kotlin.test.Test
-
-class AddToNavigationCommandResolutionTest : TemplatingAbstractTest() {
-
- @Test
- fun `should substitute AddToNavigationCommand in root directory`(@TempDir outputDirectory: File) {
- addToNavigationTest(outputDirectory) {
- val output = outputDirectory.resolve("navigation.html").readText()
- val expected = expectedOutput(
- ModuleWithPrefix("module1"),
- ModuleWithPrefix("module2")
- )
- assertHtmlEqualsIgnoringWhitespace(expected, output)
- }
- }
-
- @ParameterizedTest
- @ValueSource(strings = ["module1", "module2"])
- fun `should substitute AddToNavigationCommand in modules directory`(
- moduleName: String,
- @TempDir outputDirectory: File
- ) {
- addToNavigationTest(outputDirectory) {
- val output = outputDirectory.resolve(moduleName).resolve("navigation.html").readText()
- val expected = expectedOutput(
- ModuleWithPrefix("module1", ".."),
- ModuleWithPrefix("module2", "..")
- )
- assertHtmlEqualsIgnoringWhitespace(expected, output)
- }
- }
-
- private fun expectedOutput(vararg modulesWithPrefix: ModuleWithPrefix) = createHTML(prettyPrint = true)
- .div("sideMenu") {
- modulesWithPrefix.forEach { (moduleName, prefix) ->
- val relativePrefix = prefix?.let { "$it/" } ?: ""
- div("sideMenuPart") {
- id = "$moduleName-nav-submenu"
- div("overview") {
- a {
- href = "$relativePrefix$moduleName/module-page.html"
- span {
- +"module-$moduleName"
- }
- }
- }
- div("sideMenuPart") {
- id = "$moduleName-nav-submenu-0"
- div("overview") {
- a {
- href = "$relativePrefix$moduleName/$moduleName/package-page.html"
- span {
- +"package-$moduleName"
- }
- }
- }
- }
- }
- }
- }
-
- private fun inputForModule(moduleName: String) = createHTML()
- .templateCommand(AddToNavigationCommand(moduleName)) {
- div("sideMenuPart") {
- id = "$moduleName-nav-submenu"
- div("overview") {
- a {
- href = "module-page.html"
- span {
- +"module-$moduleName"
- }
- }
- }
- div("sideMenuPart") {
- id = "$moduleName-nav-submenu-0"
- div("overview") {
- a {
- href = "$moduleName/package-page.html"
- span {
- +"package-$moduleName"
- }
- }
- }
- }
- }
- }
-
- private fun addToNavigationTest(outputDirectory: File, test: (DokkaContext) -> Unit) {
- val module1 = outputDirectory.resolve("module1").also { it.mkdirs() }
- val module2 = outputDirectory.resolve("module2").also { it.mkdirs() }
-
- val configuration = dokkaConfiguration {
- modules = listOf(
- DokkaModuleDescriptionImpl(
- name = "module1",
- relativePathToOutputDirectory = module1,
- includes = emptySet(),
- sourceOutputDirectory = module1,
- ),
- DokkaModuleDescriptionImpl(
- name = "module2",
- relativePathToOutputDirectory = module2,
- includes = emptySet(),
- sourceOutputDirectory = module2,
- ),
- )
- this.outputDir = outputDirectory
- }
-
- val module1Navigation = module1.resolve("navigation.html")
- module1Navigation.writeText(inputForModule("module1"))
- val module2Navigation = module2.resolve("navigation.html")
- module2Navigation.writeText(inputForModule("module2"))
-
- testFromData(configuration, useOutputLocationFromConfig = true) {
- finishProcessingSubmodules = { ctx ->
- test(ctx)
- }
- }
- }
-
- private data class ModuleWithPrefix(val moduleName: String, val prefix: String? = null)
-}
diff --git a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToSearchCommandResolutionTest.kt b/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToSearchCommandResolutionTest.kt
deleted file mode 100644
index ae8ab941..00000000
--- a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/AddToSearchCommandResolutionTest.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.DokkaModuleDescriptionImpl
-import org.jetbrains.dokka.base.renderers.html.SearchRecord
-import org.jetbrains.dokka.base.templating.AddToSearch
-import org.jetbrains.dokka.base.templating.parseJson
-import org.jetbrains.dokka.base.templating.toJsonString
-import org.junit.jupiter.api.io.TempDir
-import org.junit.jupiter.params.ParameterizedTest
-import org.junit.jupiter.params.provider.ValueSource
-import java.io.File
-import kotlin.test.assertEquals
-
-class AddToSearchCommandResolutionTest : TemplatingAbstractTest() {
-
- @ParameterizedTest
- @ValueSource(strings = ["pages.json"])
- fun `should merge navigation templates`(fileName: String, @TempDir outputDirectory: File) {
- setupTestDirectoriesWithContent(outputDirectory, fileName)
-
- val configuration = dokkaConfiguration {
- modules = listOf(
- DokkaModuleDescriptionImpl(
- name = "module1",
- relativePathToOutputDirectory = outputDirectory.resolve("module1"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module1"),
- ),
- DokkaModuleDescriptionImpl(
- name = "module2",
- relativePathToOutputDirectory = outputDirectory.resolve("module2"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module2"),
- ),
- )
- this.outputDir = outputDirectory
- }
-
- testFromData(configuration, useOutputLocationFromConfig = true) {
- finishProcessingSubmodules = { _ ->
- val expected = elements.map { it.copy(location = "module1/${it.location}") } +
- elements.map { it.copy(location = "module2/${it.location}") }
-
- val output =
- parseJson<List<SearchRecord>>(outputDirectory.resolve("scripts/${fileName}").readText())
- assertEquals(expected, output.sortedBy { it.location })
- }
- }
- }
-
- private fun setupTestDirectoriesWithContent(outputDirectory: File, fileName: String): List<File> {
- val scriptsForModule1 = outputDirectory.resolve("module1/scripts").also { it.mkdirs() }
- val scriptsForModule2 = outputDirectory.resolve("module2/scripts").also { it.mkdirs() }
- outputDirectory.resolve("scripts").also { it.mkdirs() }
-
- val module1Navigation = scriptsForModule1.resolve(fileName)
- module1Navigation.writeText(toJsonString(fromModule1))
- val module2Navigation = scriptsForModule2.resolve(fileName)
- module2Navigation.writeText(toJsonString(fromModule2))
-
- return listOf(module1Navigation, module2Navigation)
- }
-
- companion object {
- val elements = listOf(
- SearchRecord(name = "name1", location = "location1"),
- SearchRecord(name = "name2", location = "location2")
- )
- val fromModule1 = AddToSearch(
- moduleName = "module1",
- elements = elements
- )
- val fromModule2 = AddToSearch(
- moduleName = "module2",
- elements = elements
- )
- }
-}
diff --git a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/SubstitutionCommandResolutionTest.kt b/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/SubstitutionCommandResolutionTest.kt
deleted file mode 100644
index b619afbb..00000000
--- a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/SubstitutionCommandResolutionTest.kt
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import kotlinx.html.a
-import kotlinx.html.div
-import kotlinx.html.id
-import kotlinx.html.span
-import kotlinx.html.stream.createHTML
-import org.jetbrains.dokka.DokkaModuleDescriptionImpl
-import org.jetbrains.dokka.base.renderers.html.templateCommand
-import org.jetbrains.dokka.base.renderers.html.templateCommandAsHtmlComment
-import org.jetbrains.dokka.base.templating.PathToRootSubstitutionCommand
-import org.junit.jupiter.api.io.TempDir
-import utils.assertHtmlEqualsIgnoringWhitespace
-import java.io.File
-import kotlin.test.Test
-
-class SubstitutionCommandResolutionTest : TemplatingAbstractTest() {
-
- @Test
- fun `should handle PathToRootCommand`(@TempDir outputDirectory: File) {
- val template = createHTML()
- .templateCommand(PathToRootSubstitutionCommand(pattern = "###", default = "default")) {
- a {
- href = "###index.html"
- div {
- id = "logo"
- }
- }
- }
-
- val expected = createHTML().a {
- href = "../index.html"
- div {
- id = "logo"
- }
- }
- checkSubstitutedResult(outputDirectory, template, expected)
- }
-
- @Test
- fun `should handle PathToRootCommand as HTML comment`(@TempDir outputDirectory: File) {
- val template = createHTML().span {
- templateCommandAsHtmlComment(PathToRootSubstitutionCommand(pattern = "###", default = "default")) {
- this@span.a {
- href = "###index.html"
- div {
- id = "logo"
- }
- }
- templateCommandAsHtmlComment(PathToRootSubstitutionCommand(pattern = "####", default = "default")) {
- this@span.a {
- href = "####index.html"
- div {
- id = "logo"
- }
- }
- }
- }
- }
-
- val expected = createHTML().span {
- a {
- href = "../index.html"
- div {
- id = "logo"
- }
- }
- a {
- href = "../index.html"
- div {
- id = "logo"
- }
- }
- }
- checkSubstitutedResult(outputDirectory, template, expected)
- }
-
- private fun checkSubstitutedResult(outputDirectory: File, template: String, expected:String) {
- val testedFile = createDirectoriesAndWriteContent(outputDirectory, template)
-
- val configuration = dokkaConfiguration {
- modules = listOf(
- DokkaModuleDescriptionImpl(
- name = "module1",
- relativePathToOutputDirectory = outputDirectory.resolve("module1"),
- includes = emptySet(),
- sourceOutputDirectory = outputDirectory.resolve("module1"),
- )
- )
- this.outputDir = outputDirectory
- }
-
- testFromData(configuration, useOutputLocationFromConfig = true){
- finishProcessingSubmodules = {
- assertHtmlEqualsIgnoringWhitespace(expected, testedFile.readText())
- }
- }
- }
-
- private fun createDirectoriesAndWriteContent(outputDirectory: File, content: String): File {
- val module1 = outputDirectory.resolve("module1").also { it.mkdirs() }
- val module1Content = module1.resolve("index.html")
- module1Content.writeText(content)
- return module1Content
- }
-}
diff --git a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TemplatingDokkaTestGenerator.kt b/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TemplatingDokkaTestGenerator.kt
deleted file mode 100644
index 53f0d279..00000000
--- a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TemplatingDokkaTestGenerator.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.DokkaGenerator
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.testApi.logger.TestLogger
-import org.jetbrains.dokka.testApi.testRunner.AbstractTest
-import org.jetbrains.dokka.testApi.testRunner.DokkaTestGenerator
-import org.jetbrains.dokka.testApi.testRunner.TestBuilder
-import org.jetbrains.dokka.testApi.testRunner.TestMethods
-import org.jetbrains.dokka.utilities.DokkaConsoleLogger
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.jetbrains.dokka.utilities.LoggingLevel
-
-class TemplatingDokkaTestGenerator(
- configuration: DokkaConfiguration,
- logger: DokkaLogger,
- testMethods: TemplatingTestMethods,
- additionalPlugins: List<DokkaPlugin> = emptyList()
-) : DokkaTestGenerator<TemplatingTestMethods>(
- configuration,
- logger,
- testMethods,
- additionalPlugins + TemplatingPlugin() + TestTemplatingPlugin()
-) {
- override fun generate() = with(testMethods) {
- val dokkaGenerator = DokkaGenerator(configuration, logger)
-
- val context =
- dokkaGenerator.initializePlugins(configuration, logger, additionalPlugins)
-
- pluginsSetupStage(context)
-
- val generation = context.single(CoreExtensions.generation) as TestTemplatingGeneration
-
- generation.processSubmodules()
- submoduleProcessingStage(context)
-
- generation.finishProcessing()
- finishProcessingSubmodules(context)
- }
-
-}
-
-open class TemplatingTestMethods(
- open val pluginsSetupStage: (DokkaContext) -> Unit,
- open val submoduleProcessingStage: (DokkaContext) -> Unit,
- open val finishProcessingSubmodules: (DokkaContext) -> Unit,
-) : TestMethods
-
-class TemplatingTestBuilder : TestBuilder<TemplatingTestMethods>() {
- var pluginsSetupStage: (DokkaContext) -> Unit = {}
- var submoduleProcessingStage: (DokkaContext) -> Unit = {}
- var finishProcessingSubmodules: (DokkaContext) -> Unit = {}
-
- override fun build() = TemplatingTestMethods(
- pluginsSetupStage,
- submoduleProcessingStage,
- finishProcessingSubmodules,
- )
-}
-
-abstract class TemplatingAbstractTest(logger: TestLogger = TestLogger(DokkaConsoleLogger(LoggingLevel.DEBUG))) :
- AbstractTest<TemplatingTestMethods, TemplatingTestBuilder, TemplatingDokkaTestGenerator>(
- ::TemplatingTestBuilder,
- ::TemplatingDokkaTestGenerator,
- logger,
- )
diff --git a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingGeneration.kt b/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingGeneration.kt
deleted file mode 100644
index 0180b2ab..00000000
--- a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingGeneration.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.Timer
-import org.jetbrains.dokka.generation.Generation
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.plugability.querySingle
-
-class TestTemplatingGeneration(private val context: DokkaContext) : Generation {
-
- val templatingPlugin by lazy { context.plugin<TemplatingPlugin>() }
-
- override fun Timer.generate() {
- report("Processing submodules")
- processSubmodules()
-
- report("Finishing processing")
- finishProcessing()
- }
-
- fun processSubmodules() =
- templatingPlugin.querySingle { submoduleTemplateProcessor }.process(context.configuration.modules)
-
- fun finishProcessing() =
- templatingPlugin.query { templateProcessingStrategy }.forEach { it.finish(context.configuration.outputDir) }
-
-
- override val generationName = "test template generation"
-}
diff --git a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingPlugin.kt b/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingPlugin.kt
deleted file mode 100644
index f1d5d919..00000000
--- a/plugins/templating/src/test/kotlin/org/jetbrains/dokka/templates/TestTemplatingPlugin.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.templates
-
-import org.jetbrains.dokka.CoreExtensions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.plugability.DokkaPluginApiPreview
-import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement
-
-class TestTemplatingPlugin: DokkaPlugin() {
-
- val dokkaBase by lazy { plugin<DokkaBase>() }
-
- val allModulesPageGeneration by extending {
- (CoreExtensions.generation
- providing ::TestTemplatingGeneration
- override dokkaBase.singleGeneration)
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/versioning/README.md b/plugins/versioning/README.md
deleted file mode 100644
index d501a58f..00000000
--- a/plugins/versioning/README.md
+++ /dev/null
@@ -1,332 +0,0 @@
-# Versioning plugin
-
-The versioning plugin provides the ability to host documentation for multiple versions of your library/application
-with seamless switching between them. This, in turn, provides a better experience for your users.
-
-![Screenshot of documentation version dropdown](versioning-plugin-example.png)
-
-**Note:** The versioning plugin only works with Dokka's HTML format.
-
-Visit the [versioning plugin example project](../../examples/gradle/dokka-versioning-multimodule-example)
-to see an example of it in action and how it can be configured.
-
-## Applying the plugin
-
-You can apply the versioning plugin the same way as other Dokka plugins:
-
-<details open>
-<summary>Kotlin</summary>
-
-```kotlin
-dependencies {
- dokkaHtmlPlugin("org.jetbrains.dokka:versioning-plugin:1.9.10")
-}
-```
-
-**Note:** When documenting multi-project builds, you need to apply the versioning
-plugin within subprojects as well as in their parent project.
-
-</details>
-
-<details>
-<summary>Groovy</summary>
-
-```groovy
-dependencies {
- dokkaHtmlPlugin 'org.jetbrains.dokka:versioning-plugin:1.9.10'
-}
-```
-
-**Note:** When documenting multi-project builds, you need to apply the versioning
-plugin within subprojects as well as in their parent project.
-
-</details>
-
-<details>
-<summary>Maven</summary>
-
-```xml
-<plugin>
- <groupId>org.jetbrains.dokka</groupId>
- <artifactId>dokka-maven-plugin</artifactId>
- ...
- <configuration>
- <dokkaPlugins>
- <plugin>
- <groupId>org.jetbrains.dokka</groupId>
- <artifactId>versioning-plugin</artifactId>
- <version>1.9.10</version>
- </plugin>
- </dokkaPlugins>
- </configuration>
-</plugin>
-```
-
-</details>
-
-<details>
-<summary>CLI</summary>
-
-You can find the versioning plugin's artifact on
-[mvnrepository](https://mvnrepository.com/artifact/org.jetbrains.dokka/versioning-plugin/1.9.10) or by browsing
-[maven central repository](https://repo1.maven.org/maven2/org/jetbrains/dokka/versioning-plugin/1.9.10)
-directly, and pass it to `pluginsClasspath`.
-
-Via command line arguments:
-
-```Bash
-java -jar dokka-cli-1.9.10.jar \
- -pluginsClasspath "./dokka-base-1.9.10.jar;...;./versioning-plugin-1.9.10.jar" \
- ...
-```
-
-Via JSON configuration:
-
-```json
-{
- ...
- "pluginsClasspath": [
- "./dokka-base-1.9.10.jar",
- "...",
- "./versioning-plugin-1.9.10.jar"
- ],
- ...
-}
-```
-
-</details>
-
-## Configuration
-
-### Configuration options
-
-The table below contains all the possible configuration options for the versioning plugin and their purpose.
-
-| **Option** | **Description** |
-|--------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `version` | The version of your application/library that documentation is going to be generated for. This will be the version shown in the dropdown menu. |
-| `versionsOrdering` | An optional list of strings that represents the order that versions should appear in the dropdown menu. Must match `version` string exactly. The first item in the list is at the top of the dropdown. |
-| `olderVersionsDir` | An optional path to a parent folder that contains other documentation versions. It requires a specific directory structure. For more information, see [Directory structure](#directory-structure). |
-| `olderVersions` | An optional list of paths to other documentation versions. It must point to Dokka's outputs directly. This is useful if different versions can't all be in the same directory. |
-| `renderVersionsNavigationOnAllPages` | An optional boolean value indicating whether to render the navigation dropdown on all pages. Set to true by default. |
-
-#### Directory structure
-
-Note that the directory passed to `olderVersionsDir` needs to follow a specific structure:
-
-```text
-.
-└── olderVersionsDir
- └── 1.7.10
- ├── <dokka output>
- └── 1.7.20
- ├── <dokka output>
-...
-```
-
-### Configuration example
-
-<details open>
-<summary>Kotlin</summary>
-
-```kotlin
-import org.jetbrains.dokka.versioning.VersioningPlugin
-import org.jetbrains.dokka.versioning.VersioningConfiguration
-
-buildscript {
- dependencies {
- classpath("org.jetbrains.dokka:versioning-plugin:1.9.10")
- }
-}
-
-tasks.dokkaHtml {
- pluginConfiguration<VersioningPlugin, VersioningConfiguration> {
- version = "1.5"
- versionsOrdering = listOf("1.5", "1.4", "1.3", "1.2", "1.1", "alpha-2", "alpha-1")
- olderVersionsDir = file("documentation/version")
- olderVersions = listOf(file("documentation/alpha/alpha-2"), file("documentation/alpha/alpha-1"))
- renderVersionsNavigationOnAllPages = true
- }
-}
-```
-
-Alternatively, you can configure it via JSON:
-
-```kotlin
- val versioningConfiguration = """
- {
- "version": "1.5",
- "versionsOrdering": ["1.5", "1.4", "1.3", "1.2", "1.1", "alpha-2", "alpha-1"],
- "olderVersionsDir": "documentation/version",
- "olderVersions": ["documentation/alpha/alpha-2", "documentation/alpha/alpha-1"],
- "renderVersionsNavigationOnAllPages": true
- }
- """
- pluginsMapConfiguration.set(
- mapOf(
- "org.jetbrains.dokka.versioning.VersioningPlugin" to versioningConfiguration
- )
- )
-```
-
-</details>
-
-<details>
-<summary>Groovy</summary>
-
-```groovy
-dokkaHtml {
- String versioningConfiguration = """
- {
- "version": "1.5",
- "versionsOrdering": ["1.5", "1.4", "1.3", "1.2", "1.1", "alpha-2", "alpha-1"],
- "olderVersionsDir": "documentation/version",
- "olderVersions": ["documentation/alpha/alpha-2", "documentation/alpha/alpha-1"],
- "renderVersionsNavigationOnAllPages": true
- }
- """
- pluginsMapConfiguration.set(
- ["org.jetbrains.dokka.versioning.VersioningPlugin": versioningConfiguration]
- )
-}
-```
-
-</details>
-
-<details>
-<summary>Maven</summary>
-
-```xml
-<plugin>
- <groupId>org.jetbrains.dokka</groupId>
- <artifactId>dokka-maven-plugin</artifactId>
- ...
- <configuration>
- <pluginsConfiguration>
- <org.jetbrains.dokka.versioning.VersioningPlugin>
- <version>1.5</version>
- <versionsOrdering>
- <version>1.5</version>
- <version>1.4</version>
- <version>1.3</version>
- <version>1.2</version>
- <version>1.1</version>
- <version>alpha-2</version>
- <version>alpha-1</version>
- </versionsOrdering>
- <olderVersionsDir>${project.basedir}/documentation/version</olderVersionsDir>
- <olderVersions>
- <version>${project.basedir}/documentation/alpha/alpha-2</version>
- <version>${project.basedir}/documentation/alpha/alpha-1</version>
- </olderVersions>
- <renderVersionsNavigationOnAllPages>true</renderVersionsNavigationOnAllPages>
- </org.jetbrains.dokka.versioning.VersioningPlugin>
- </pluginsConfiguration>
- </configuration>
-</plugin>
-```
-
-</details>
-
-<details>
-<summary>CLI</summary>
-
-```Bash
-java -jar dokka-cli-1.9.10.jar \
- ...
- -pluginsConfiguration "org.jetbrains.dokka.versioning.VersioningPlugin={\"version\": \"1.5\", \"versionsOrdering\": [\"1.5\", \"1.4\", \"1.3\", \"1.2\", \"1.1\", \"alpha-2\", \"alpha-1\"], \"olderVersionsDir\": \"documentation/version\", \"olderVersions\": [\"documentation/alpha/alpha-2\", \"documentation/alpha/alpha-1\"], \"renderVersionsNavigationOnAllPages\": true}"
-
-```
-
-Alternatively, via JSON configuration:
-```json
-{
- "moduleName": "Dokka Example",
- ...
- "pluginsConfiguration": [
- {
- "fqPluginName": "org.jetbrains.dokka.versioning.VersioningPlugin",
- "serializationFormat": "JSON",
- "values": "{\"version\": \"1.5\", \"versionsOrdering\": [\"1.5\", \"1.4\", \"1.3\", \"1.2\", \"1.1\", \"alpha-2\", \"alpha-1\"], \"olderVersionsDir\": \"documentation/version\", \"olderVersions\": [\"documentation/alpha/alpha-2\", \"documentation/alpha/alpha-1\"], \"renderVersionsNavigationOnAllPages\": true}"
- }
- ]
-}
-```
-
-</details>
-
-## Generating versioned documentation
-
-With the versioning plugin applied and configured, no other steps are needed. Documentation can be built in the usual way.
-
-Among other things, the versioning plugin adds a `version.json` file to the output folder. This file is used by the
-plugin to match versions and generate version navigation. If your previously generated documentation does not have that
-file, you will need to re-generate documentation for such versions. Just adding the file will not work.
-
-The versioning plugin also bundles all other documentation versions that have been passed through `olderVersionsDir`
-and `olderVersions` configuration options by putting them inside the `older` directory.
-
-## Usage example
-
-There is no single correct way to configure the plugin, it can be tailored to your needs. However,
-it can be a bit overwhelming when starting out. Below you will find one of the ways it can be configured so that you
-can begin publishing versioned documentation straight away.
-
-The main idea behind it is the following:
-
-1. One directory contains all versions of your documentation. For example, `documentation/version/{doc_version}`.
- This is your archive which is needed for future builds.
-2. The output directory of all new builds is set to that directory as well, under `documentation/version/{new_version}`.
-3. When new builds are executed, the plugin looks for previous versions of documentation in the archive directory.
-4. Once new documentation has been generated, it needs to be **copied** to somewhere accessible by the user.
- For example, GitHub pages or nginx static directories. It needs to be **copied**, not moved because Dokka will still
- need this version for future builds, otherwise there will be a gap in the archive.
-5. Once it has been safely copied, you can remove the `older` directory from the newly generated and archived version.
- This helps reduce the overhead of each version bundling all previous versions, as these files are effectively duplicates.
-
-```kotlin
-import org.jetbrains.dokka.versioning.VersioningPlugin
-import org.jetbrains.dokka.versioning.VersioningConfiguration
-
-buildscript {
- dependencies {
- classpath("org.jetbrains.dokka:versioning-plugin:1.9.10")
- }
-}
-
-dependencies {
- dokkaPlugin("org.jetbrains.dokka:versioning-plugin:1.9.10")
-}
-
-tasks.dokkaHtml {
- // This can be any persistent folder where
- // you store documentation by version
- val docVersionsDir = projectDir.resolve("documentation/version")
-
- // The version for which you are currently generating docs
- val currentVersion = "1.3"
-
- // Set the output to a folder with all other versions
- // as you'll need the current version for future builds
- val currentDocsDir = docVersionsDir.resolve(currentVersion)
- outputDirectory.set(currentDocsDir)
-
- pluginConfiguration<VersioningPlugin, VersioningConfiguration> {
- olderVersionsDir = docVersionsDir
- version = currentVersion
- }
-
- doLast {
- // This folder contains the latest documentation with all
- // previous versions included, so it's ready to be published.
- // Make sure it's copied and not moved - you'll still need this
- // version for future builds
- currentDocsDir.copyTo(file("/my/hosting"))
-
- // Only once current documentation has been safely moved,
- // remove previous versions bundled in it. They will not
- // be needed in future builds, it's just overhead.
- currentDocsDir.resolve("older").deleteRecursively()
- }
-}
-```
diff --git a/plugins/versioning/api/versioning.api b/plugins/versioning/api/versioning.api
deleted file mode 100644
index 6ba2c822..00000000
--- a/plugins/versioning/api/versioning.api
+++ /dev/null
@@ -1,149 +0,0 @@
-public final class org/jetbrains/dokka/versioning/ByConfigurationVersionOrdering : org/jetbrains/dokka/versioning/VersionsOrdering {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public final fun getDokkaContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun order (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/versioning/CurrentVersion {
- public fun <init> (Ljava/lang/String;Ljava/io/File;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2 ()Ljava/io/File;
- public final fun copy (Ljava/lang/String;Ljava/io/File;)Lorg/jetbrains/dokka/versioning/CurrentVersion;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/versioning/CurrentVersion;Ljava/lang/String;Ljava/io/File;ILjava/lang/Object;)Lorg/jetbrains/dokka/versioning/CurrentVersion;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDir ()Ljava/io/File;
- public final fun getName ()Ljava/lang/String;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/versioning/DefaultPreviousDocumentationCopyPostAction : org/jetbrains/dokka/renderers/PostAction {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public synthetic fun invoke ()Ljava/lang/Object;
- public fun invoke ()V
-}
-
-public final class org/jetbrains/dokka/versioning/DefaultVersioningStorage : org/jetbrains/dokka/versioning/VersioningStorage {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun createVersionFile ()V
- public final fun getContext ()Lorg/jetbrains/dokka/plugability/DokkaContext;
- public fun getCurrentVersion ()Lorg/jetbrains/dokka/versioning/CurrentVersion;
- public fun getPreviousVersions ()Ljava/util/Map;
-}
-
-public final class org/jetbrains/dokka/versioning/HtmlVersionsNavigationCreator : org/jetbrains/dokka/versioning/VersionsNavigationCreator {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Ljava/io/File;)Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/versioning/MultiModuleStylesInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/versioning/NotFoundPageInstaller : org/jetbrains/dokka/transformers/pages/PageTransformer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun invoke (Lorg/jetbrains/dokka/pages/RootPageNode;)Lorg/jetbrains/dokka/pages/RootPageNode;
-}
-
-public final class org/jetbrains/dokka/versioning/ReplaceVersionCommandConsumer : org/jetbrains/dokka/base/templating/ImmediateHtmlCommandConsumer {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canProcess (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun processCommand (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)V
- public fun processCommandAndFinalize (Lorg/jetbrains/dokka/base/templating/Command;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/dokka/base/renderers/html/command/consumers/ImmediateResolutionTagConsumer;)Ljava/lang/Object;
-}
-
-public final class org/jetbrains/dokka/versioning/ReplaceVersionCommandHandler : org/jetbrains/dokka/templates/CommandHandler {
- public fun <init> (Lorg/jetbrains/dokka/plugability/DokkaContext;)V
- public fun canHandle (Lorg/jetbrains/dokka/base/templating/Command;)Z
- public fun finish (Ljava/io/File;)V
- public final fun getVersionsNavigationCreator ()Lorg/jetbrains/dokka/versioning/VersionsNavigationCreator;
- public fun handleCommand (Lorg/jsoup/nodes/Element;Lorg/jetbrains/dokka/base/templating/Command;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsComment (Lorg/jetbrains/dokka/base/templating/Command;Ljava/util/List;Ljava/io/File;Ljava/io/File;)V
- public fun handleCommandAsTag (Lorg/jetbrains/dokka/base/templating/Command;Lorg/jsoup/nodes/Element;Ljava/io/File;Ljava/io/File;)V
-}
-
-public final class org/jetbrains/dokka/versioning/SemVerVersionOrdering : org/jetbrains/dokka/versioning/VersionsOrdering {
- public fun <init> ()V
- public fun order (Ljava/util/List;)Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/versioning/VersionDirs {
- public fun <init> (Ljava/io/File;Ljava/io/File;)V
- public final fun component1 ()Ljava/io/File;
- public final fun component2 ()Ljava/io/File;
- public final fun copy (Ljava/io/File;Ljava/io/File;)Lorg/jetbrains/dokka/versioning/VersionDirs;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/versioning/VersionDirs;Ljava/io/File;Ljava/io/File;ILjava/lang/Object;)Lorg/jetbrains/dokka/versioning/VersionDirs;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getDst ()Ljava/io/File;
- public final fun getSrc ()Ljava/io/File;
- public fun hashCode ()I
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/versioning/VersioningConfiguration : org/jetbrains/dokka/plugability/ConfigurableBlock {
- public static final field Companion Lorg/jetbrains/dokka/versioning/VersioningConfiguration$Companion;
- public static final field OLDER_VERSIONS_DIR Ljava/lang/String;
- public static final field VERSIONS_FILE Ljava/lang/String;
- public fun <init> ()V
- public fun <init> (Ljava/io/File;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Boolean;)V
- public synthetic fun <init> (Ljava/io/File;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/io/File;
- public final fun component2 ()Ljava/util/List;
- public final fun component3 ()Ljava/util/List;
- public final fun component4 ()Ljava/lang/String;
- public final fun component5 ()Ljava/lang/Boolean;
- public final fun copy (Ljava/io/File;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Boolean;)Lorg/jetbrains/dokka/versioning/VersioningConfiguration;
- public static synthetic fun copy$default (Lorg/jetbrains/dokka/versioning/VersioningConfiguration;Ljava/io/File;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Boolean;ILjava/lang/Object;)Lorg/jetbrains/dokka/versioning/VersioningConfiguration;
- public fun equals (Ljava/lang/Object;)Z
- public final fun getOlderVersions ()Ljava/util/List;
- public final fun getOlderVersionsDir ()Ljava/io/File;
- public final fun getRenderVersionsNavigationOnAllPages ()Ljava/lang/Boolean;
- public final fun getVersion ()Ljava/lang/String;
- public final fun getVersionsOrdering ()Ljava/util/List;
- public fun hashCode ()I
- public final fun setOlderVersions (Ljava/util/List;)V
- public final fun setOlderVersionsDir (Ljava/io/File;)V
- public final fun setRenderVersionsNavigationOnAllPages (Ljava/lang/Boolean;)V
- public final fun setVersion (Ljava/lang/String;)V
- public final fun setVersionsOrdering (Ljava/util/List;)V
- public fun toString ()Ljava/lang/String;
-}
-
-public final class org/jetbrains/dokka/versioning/VersioningConfiguration$Companion {
- public final fun getDefaultOlderVersions ()Ljava/util/List;
- public final fun getDefaultOlderVersionsDir ()Ljava/io/File;
- public final fun getDefaultRenderVersionsNavigationOnAllPages ()Z
- public final fun getDefaultVersion ()Ljava/lang/String;
- public final fun getDefaultVersionsOrdering ()Ljava/util/List;
-}
-
-public final class org/jetbrains/dokka/versioning/VersioningPlugin : org/jetbrains/dokka/plugability/DokkaPlugin {
- public fun <init> ()V
- public final fun getCssStyleInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultVersioningNavigationCreator ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getDefaultVersioningStorage ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getNotFoundPageInstaller ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getPreviousDocumentationCopyPostAction ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getReplaceVersionCommandHandler ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getResolveLinkConsumer ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getVersioningStorage ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getVersionsDefaultOrdering ()Lorg/jetbrains/dokka/plugability/Extension;
- public final fun getVersionsNavigationCreator ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
- public final fun getVersionsOrdering ()Lorg/jetbrains/dokka/plugability/ExtensionPoint;
-}
-
-public abstract interface class org/jetbrains/dokka/versioning/VersioningStorage {
- public abstract fun createVersionFile ()V
- public abstract fun getCurrentVersion ()Lorg/jetbrains/dokka/versioning/CurrentVersion;
- public abstract fun getPreviousVersions ()Ljava/util/Map;
-}
-
-public abstract interface class org/jetbrains/dokka/versioning/VersionsNavigationCreator {
- public abstract fun invoke (Ljava/io/File;)Ljava/lang/String;
-}
-
-public abstract interface class org/jetbrains/dokka/versioning/VersionsOrdering {
- public abstract fun order (Ljava/util/List;)Ljava/util/List;
-}
-
diff --git a/plugins/versioning/build.gradle.kts b/plugins/versioning/build.gradle.kts
deleted file mode 100644
index b993601b..00000000
--- a/plugins/versioning/build.gradle.kts
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-import org.jetbrains.registerDokkaArtifactPublication
-
-plugins {
- id("org.jetbrains.conventions.kotlin-jvm")
- id("org.jetbrains.conventions.maven-publish")
-}
-
-registerDokkaArtifactPublication("versioning-plugin") {
- artifactId = "versioning-plugin"
-}
-
-dependencies {
- compileOnly(projects.core)
-
- implementation(projects.plugins.base)
- implementation(projects.plugins.templating)
-
- implementation(kotlin("reflect"))
- implementation(libs.kotlinx.coroutines.core)
- implementation(libs.kotlinx.html)
- implementation(libs.apacheMaven.artifact)
- implementation(libs.jackson.kotlin)
- constraints {
- implementation(libs.jackson.databind) {
- because("CVE-2022-42003")
- }
- }
-
- testImplementation(kotlin("test"))
- testImplementation(projects.core.testApi)
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/DefaultPreviousDocumentationCopyPostAction.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/DefaultPreviousDocumentationCopyPostAction.kt
deleted file mode 100644
index 7e03f59c..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/DefaultPreviousDocumentationCopyPostAction.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.renderers.PostAction
-import org.jetbrains.dokka.templates.TemplateProcessingStrategy
-import org.jetbrains.dokka.templates.TemplatingPlugin
-import java.io.File
-
-public class DefaultPreviousDocumentationCopyPostAction(
- private val context: DokkaContext
-) : PostAction {
- private val versioningStorage by lazy { context.plugin<VersioningPlugin>().querySingle { versioningStorage } }
- private val processingStrategies: List<TemplateProcessingStrategy> =
- context.plugin<TemplatingPlugin>().query { templateProcessingStrategy }
-
- override fun invoke() {
- versioningStorage.createVersionFile()
- versioningStorage.previousVersions.forEach { (_, dirs) -> copyVersion(dirs.src, dirs.dst) }
- }
-
- private fun copyVersion(versionRoot: File, targetParent: File) {
- targetParent.apply { mkdirs() }
- val ignoreDir = versionRoot.resolve(VersioningConfiguration.OLDER_VERSIONS_DIR)
- runBlocking(Dispatchers.Default) {
- coroutineScope {
- versionRoot.listFiles().orEmpty()
- .filter { it.absolutePath != ignoreDir.absolutePath }
- .forEach { versionRootContent ->
- launch {
- processRecursively(versionRootContent, targetParent)
- }
- }
- }
- }
- }
-
- private fun processRecursively(versionRootContent: File, targetParent: File) {
- if (versionRootContent.isDirectory) {
- val target = targetParent.resolve(versionRootContent.name).also { it.mkdir() }
- versionRootContent.listFiles()?.forEach {
- processRecursively(it, target)
- }
- } else if (versionRootContent.extension == "html") processingStrategies.first {
- it.process(versionRootContent, targetParent.resolve(versionRootContent.name), null)
- } else {
- versionRootContent.copyTo(targetParent.resolve(versionRootContent.name), overwrite = true)
- }
- }
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionCommandConsumer.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionCommandConsumer.kt
deleted file mode 100644
index b31afb9a..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionCommandConsumer.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import kotlinx.html.unsafe
-import kotlinx.html.visit
-import kotlinx.html.visitAndFinalize
-import org.jetbrains.dokka.base.renderers.html.TemplateBlock
-import org.jetbrains.dokka.base.renderers.html.command.consumers.ImmediateResolutionTagConsumer
-import org.jetbrains.dokka.base.renderers.html.templateCommandFor
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer
-import org.jetbrains.dokka.base.templating.ReplaceVersionsCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-
-public class ReplaceVersionCommandConsumer(context: DokkaContext) : ImmediateHtmlCommandConsumer {
-
- private val versionsNavigationCreator =
- context.plugin<VersioningPlugin>().querySingle { versionsNavigationCreator }
- private val versioningStorage =
- context.plugin<VersioningPlugin>().querySingle { versioningStorage }
-
- override fun canProcess(command: Command): Boolean = command is ReplaceVersionsCommand
-
- override fun <R> processCommand(
- command: Command,
- block: TemplateBlock,
- tagConsumer: ImmediateResolutionTagConsumer<R>
- ) {
- command as ReplaceVersionsCommand
- templateCommandFor(command, tagConsumer).visit {
- unsafe {
- +versionsNavigationCreator(versioningStorage.currentVersion.dir.resolve(command.location))
- }
- }
- }
-
- override fun <R> processCommandAndFinalize(
- command: Command,
- block: TemplateBlock,
- tagConsumer: ImmediateResolutionTagConsumer<R>
- ): R {
- command as ReplaceVersionsCommand
- return templateCommandFor(command, tagConsumer).visitAndFinalize(tagConsumer) {
- unsafe {
- +versionsNavigationCreator(versioningStorage.currentVersion.dir.resolve(command.location))
- }
- }
- }
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionsCommand.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionsCommand.kt
deleted file mode 100644
index c9bc57b2..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/ReplaceVersionsCommand.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-
-import org.jetbrains.dokka.base.templating.Command
-import org.jetbrains.dokka.base.templating.ReplaceVersionsCommand
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.templates.CommandHandler
-import org.jsoup.nodes.Element
-import java.io.File
-
-public class ReplaceVersionCommandHandler(context: DokkaContext) : CommandHandler {
-
- public val versionsNavigationCreator: VersionsNavigationCreator by lazy {
- context.plugin<VersioningPlugin>().querySingle { versionsNavigationCreator }
- }
-
- override fun canHandle(command: Command): Boolean = command is ReplaceVersionsCommand
-
- override fun handleCommandAsTag(command: Command, body: Element, input: File, output: File) {
- body.empty()
- body.append(versionsNavigationCreator(output))
- }
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningConfiguration.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningConfiguration.kt
deleted file mode 100644
index 91b1117d..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningConfiguration.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import org.jetbrains.dokka.plugability.ConfigurableBlock
-import org.jetbrains.dokka.plugability.DokkaContext
-import java.io.File
-
-public data class VersioningConfiguration(
- var olderVersionsDir: File? = defaultOlderVersionsDir,
- var olderVersions: List<File>? = defaultOlderVersions,
- var versionsOrdering: List<String>? = defaultVersionsOrdering,
- var version: String? = defaultVersion,
- var renderVersionsNavigationOnAllPages: Boolean? = defaultRenderVersionsNavigationOnAllPages
-) : ConfigurableBlock {
- internal fun versionFromConfigurationOrModule(dokkaContext: DokkaContext): String =
- version ?: dokkaContext.configuration.moduleVersion ?: "1.0"
-
- internal fun allOlderVersions(): List<File> {
- if (olderVersionsDir != null)
- assert(olderVersionsDir!!.isDirectory) { "Supplied previous version $olderVersionsDir is not a directory!" }
-
- return olderVersionsDir?.listFiles()?.toList().orEmpty() + olderVersions.orEmpty()
- }
-
- public companion object {
- public val defaultOlderVersionsDir: File? = null
- public val defaultOlderVersions: List<File>? = null
- public val defaultVersionsOrdering: List<String>? = null
- public val defaultVersion: String? = null
- public val defaultRenderVersionsNavigationOnAllPages: Boolean = true
-
- public const val OLDER_VERSIONS_DIR: String = "older"
- public const val VERSIONS_FILE: String = "version.json"
- }
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningPlugin.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningPlugin.kt
deleted file mode 100644
index 2e1fde8d..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningPlugin.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import org.jetbrains.dokka.CoreExtensions.postActions
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.templating.ImmediateHtmlCommandConsumer
-import org.jetbrains.dokka.plugability.*
-import org.jetbrains.dokka.renderers.PostAction
-import org.jetbrains.dokka.templates.CommandHandler
-import org.jetbrains.dokka.templates.TemplatingPlugin
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class VersioningPlugin : DokkaPlugin() {
-
- public val versioningStorage: ExtensionPoint<VersioningStorage> by extensionPoint()
- public val versionsNavigationCreator: ExtensionPoint<VersionsNavigationCreator> by extensionPoint()
- public val versionsOrdering: ExtensionPoint<VersionsOrdering> by extensionPoint()
-
- private val dokkaBase by lazy { plugin<DokkaBase>() }
- private val templatingPlugin by lazy { plugin<TemplatingPlugin>() }
-
- public val defaultVersioningStorage: Extension<VersioningStorage, *, *> by extending {
- versioningStorage providing ::DefaultVersioningStorage
- }
-
- public val defaultVersioningNavigationCreator: Extension<VersionsNavigationCreator, *, *> by extending {
- versionsNavigationCreator providing ::HtmlVersionsNavigationCreator
- }
-
- public val replaceVersionCommandHandler: Extension<CommandHandler, *, *> by extending {
- templatingPlugin.directiveBasedCommandHandlers providing ::ReplaceVersionCommandHandler override templatingPlugin.replaceVersionCommandHandler
- }
-
- public val resolveLinkConsumer: Extension<ImmediateHtmlCommandConsumer, *, *> by extending {
- dokkaBase.immediateHtmlCommandConsumer providing ::ReplaceVersionCommandConsumer override dokkaBase.replaceVersionConsumer
- }
-
- public val cssStyleInstaller: Extension<PageTransformer, *, *> by extending {
- dokkaBase.htmlPreprocessors providing ::MultiModuleStylesInstaller order {
- after(dokkaBase.assetsInstaller)
- before(dokkaBase.customResourceInstaller)
- }
- }
-
- public val notFoundPageInstaller: Extension<PageTransformer, *, *> by extending {
- dokkaBase.htmlPreprocessors providing ::NotFoundPageInstaller order {
- after(dokkaBase.assetsInstaller)
- before(dokkaBase.customResourceInstaller)
- } applyIf { !delayTemplateSubstitution }
- }
-
- public val versionsDefaultOrdering: Extension<VersionsOrdering, *, *> by extending {
- versionsOrdering providing { ctx ->
- configuration<VersioningPlugin, VersioningConfiguration>(ctx)?.versionsOrdering?.let {
- ByConfigurationVersionOrdering(ctx)
- } ?: SemVerVersionOrdering()
- }
- }
-
- public val previousDocumentationCopyPostAction: Extension<PostAction, *, *> by extending {
- postActions providing ::DefaultPreviousDocumentationCopyPostAction applyIf { !delayTemplateSubstitution }
- }
-
- @OptIn(DokkaPluginApiPreview::class)
- override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement =
- PluginApiPreviewAcknowledgement
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningStorage.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningStorage.kt
deleted file mode 100644
index 7c9d1da0..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersioningStorage.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import com.fasterxml.jackson.annotation.JsonProperty
-import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.module.kotlin.readValue
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.configuration
-import java.io.File
-
-public data class VersionDirs(val src: File, val dst: File)
-public data class CurrentVersion(val name: String, val dir: File)
-
-public interface VersioningStorage {
- public val previousVersions: Map<VersionId, VersionDirs>
- public val currentVersion: CurrentVersion
-
- public fun createVersionFile()
-}
-
-public typealias VersionId = String
-
-public class DefaultVersioningStorage(
- public val context: DokkaContext
-) : VersioningStorage {
-
- private val mapper = ObjectMapper()
- private val configuration = configuration<VersioningPlugin, VersioningConfiguration>(context)
-
- override val previousVersions: Map<VersionId, VersionDirs> by lazy {
- configuration?.let { versionsConfiguration ->
- getPreviousVersions(versionsConfiguration.allOlderVersions(), context.configuration.outputDir)
- } ?: emptyMap()
- }
-
- override val currentVersion: CurrentVersion by lazy {
- configuration?.let { versionsConfiguration ->
- CurrentVersion(versionsConfiguration.versionFromConfigurationOrModule(context),
- context.configuration.outputDir)
- }?: CurrentVersion(context.configuration.moduleVersion.orEmpty(), context.configuration.outputDir)
- }
-
- override fun createVersionFile() {
- mapper.writeValue(
- currentVersion.dir.resolve(VersioningConfiguration.VERSIONS_FILE),
- Version(currentVersion.name)
- )
- }
-
- private fun getPreviousVersions(olderVersions: List<File>, output: File): Map<String, VersionDirs> =
- versionsFrom(olderVersions).associate { (key, srcDir) ->
- key to VersionDirs(srcDir, output.resolve(VersioningConfiguration.OLDER_VERSIONS_DIR).resolve(key))
- }
-
- private fun versionsFrom(olderVersions: List<File>) =
- olderVersions.mapNotNull { versionDir ->
- versionDir.listFiles { _, name -> name == VersioningConfiguration.VERSIONS_FILE }?.firstOrNull()
- ?.let { file ->
- val versionsContent = mapper.readValue<Version>(file)
- Pair(versionsContent.version, versionDir)
- }.also {
- if (it == null) context.logger.warn("Failed to find versions file named ${VersioningConfiguration.VERSIONS_FILE} in $versionDir")
- }
- }
-
- private data class Version(
- @JsonProperty("version") val version: String,
- )
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsNavigationCreator.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsNavigationCreator.kt
deleted file mode 100644
index 59ce93e2..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsNavigationCreator.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import kotlinx.html.a
-import kotlinx.html.div
-import kotlinx.html.stream.appendHTML
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.configuration
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.querySingle
-import org.jetbrains.dokka.utilities.urlEncoded
-import java.io.File
-
-public fun interface VersionsNavigationCreator {
- public operator fun invoke(output: File): String
-}
-
-public class HtmlVersionsNavigationCreator(
- private val context: DokkaContext
-) : VersionsNavigationCreator {
-
- private val versioningStorage by lazy { context.plugin<VersioningPlugin>().querySingle { versioningStorage } }
-
- private val versionsOrdering by lazy { context.plugin<VersioningPlugin>().querySingle { versionsOrdering } }
-
- private val isOnlyOnRootPage =
- configuration<VersioningPlugin, VersioningConfiguration>(context)?.renderVersionsNavigationOnAllPages == false
-
- private val versions: Map<VersionId, File> by lazy {
- versioningStorage.previousVersions.map { (k, v) -> k to v.dst }.toMap() +
- (versioningStorage.currentVersion.name to versioningStorage.currentVersion.dir)
- }
-
- override fun invoke(output: File): String {
- if (versions.size == 1) {
- return versioningStorage.currentVersion.name
- }
- val position = output.takeIf { it.isDirectory } ?: output.parentFile
- if (isOnlyOnRootPage) {
- getActiveVersion(position)?.takeIf {
- it.value == versioningStorage.currentVersion.dir
- && it.value != position
- }?.also { return@invoke it.key }
- }
- return versions
- .let { versions -> versionsOrdering.order(versions.keys.toList()).map { it to versions[it] } }
- .takeIf { it.isNotEmpty() }
- ?.let { orderedVersions ->
- StringBuilder().appendHTML().div(classes = "versions-dropdown") {
- val activeVersion = getActiveVersion(position)
- val relativePosition: String = activeVersion?.value?.let { output.toRelativeString(it) } ?: "index.html"
- div(classes = "versions-dropdown-button") {
- activeVersion?.key?.let { text(it) }
- }
- div(classes = "versions-dropdown-data") {
- orderedVersions.forEach { (version, path) ->
- if (version == activeVersion?.key) {
- a(href = output.name) { text(version) }
- } else {
- val isExistsFile =
- if (version == versioningStorage.currentVersion.name)
- path?.resolve(relativePosition)?.exists() == true
- else
- versioningStorage.previousVersions[version]?.src?.resolve(relativePosition)
- ?.exists() == true
-
- val absolutePath =
- if (isExistsFile)
- path?.resolve(relativePosition)
- else
- versioningStorage.currentVersion.dir.resolve("not-found-version.html")
-
- a(href = absolutePath?.toRelativeString(position) +
- if (!isExistsFile) "?v=" + version.urlEncoded() else "") {
- text(version)
- }
- }
- }
- }
- }.toString()
- }.orEmpty()
- }
-
- private fun getActiveVersion(position: File) =
- versions.minByOrNull { (_, versionLocation) ->
- versionLocation.let { position.toRelativeString(it).length }
- }
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsOrdering.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsOrdering.kt
deleted file mode 100644
index 3d1fbe3d..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/VersionsOrdering.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import org.apache.maven.artifact.versioning.ComparableVersion
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.configuration
-
-public fun interface VersionsOrdering {
- public fun order(records: List<VersionId>): List<VersionId>
-}
-
-public class ByConfigurationVersionOrdering(
- public val dokkaContext: DokkaContext
-) : VersionsOrdering {
- override fun order(records: List<VersionId>): List<VersionId> =
- configuration<VersioningPlugin, VersioningConfiguration>(dokkaContext)?.versionsOrdering
- ?: throw IllegalStateException("Attempted to use a configuration ordering without providing configuration")
-}
-
-public class SemVerVersionOrdering : VersionsOrdering {
- override fun order(records: List<VersionId>): List<VersionId> =
- records.map { it to ComparableVersion(it) }.sortedByDescending { it.second }.map { it.first }
-}
diff --git a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/htmlPreprocessors.kt b/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/htmlPreprocessors.kt
deleted file mode 100644
index 9bdaf7d5..00000000
--- a/plugins/versioning/src/main/kotlin/org/jetbrains/dokka/versioning/htmlPreprocessors.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package org.jetbrains.dokka.versioning
-
-import org.jetbrains.dokka.pages.RendererSpecificResourcePage
-import org.jetbrains.dokka.pages.RenderingStrategy
-import org.jetbrains.dokka.pages.RootPageNode
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.transformers.pages.PageTransformer
-
-public class MultiModuleStylesInstaller(
- private val dokkaContext: DokkaContext
-) : PageTransformer {
- private val stylesPages = listOf(
- "styles/multimodule.css",
- )
-
- override fun invoke(input: RootPageNode): RootPageNode =
- input.let { root ->
- if (dokkaContext.configuration.delayTemplateSubstitution) root
- else root.modified(children = input.children + stylesPages.toRenderSpecificResourcePage())
- }.transformContentPagesTree {
- it.modified(
- embeddedResources = it.embeddedResources + stylesPages
- )
- }
-}
-
-public class NotFoundPageInstaller(
- private val dokkaContext: DokkaContext
-) : PageTransformer {
- private val notFoundPage = listOf(
- "not-found-version.html",
- )
-
- override fun invoke(input: RootPageNode): RootPageNode =
- input.let { root ->
- if (dokkaContext.configuration.delayTemplateSubstitution) root
- else root.modified(children = input.children + notFoundPage.toRenderSpecificResourcePage())
- }
-}
-
-private fun List<String>.toRenderSpecificResourcePage(): List<RendererSpecificResourcePage> =
- map { RendererSpecificResourcePage(it, emptyList(), RenderingStrategy.Copy("/dokka/$it")) }
diff --git a/plugins/versioning/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/versioning/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
deleted file mode 100644
index 2afa663b..00000000
--- a/plugins/versioning/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
-#
-
-org.jetbrains.dokka.versioning.VersioningPlugin
diff --git a/plugins/versioning/src/main/resources/dokka/not-found-version.html b/plugins/versioning/src/main/resources/dokka/not-found-version.html
deleted file mode 100644
index 36cf343d..00000000
--- a/plugins/versioning/src/main/resources/dokka/not-found-version.html
+++ /dev/null
@@ -1,193 +0,0 @@
-<!--
- ~ Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- -->
-
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>Unavailable page</title>
- <style>
-.article-content h1._big {
- text-transform: uppercase;
- color: #161616;
- font-size: 54px;
- font-weight: 800;
- line-height: 45px;
-}
-.sub-title {
- margin-bottom: 40px;
- font-size: 20px;
- font-weight: 400;
- line-height: 30px;
-}
-.margin-top-vertical-unit-half {
- margin-top: 25px;
-}
-.wt-row_size_m {
- --wt-horizontal-layout-gutter: 16px;
-}
-.article-content {
- color: #343434;
- font-family: system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Droid Sans, Helvetica Neue, Arial, sans-serif;
- font-size: 14px;
- font-weight: 400;
- line-height: 25px;
-}
-.wt-container {
- width: 100%;
- margin-left: auto;
- margin-right: auto;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- padding-left: 22px;
- padding-right: 22px;
- max-width: 1276px;
-}
-.wt-col-5 {
- --wt-col-count: 5;
-}
-.wt-col-3 {
- --wt-col-count: 3;
-}
-.page-404__logo {
- position: relative;
- display: flex;
-}
-.wt-row, .wt-row_wide {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
-}
-[class*="wt-col"] {
- -ms-flex-preferred-size: calc(8.33333%*var(--wt-col-count) - var(--wt-horizontal-layout-gutter)*2);
- flex-basis: calc(8.33333%*var(--wt-col-count) - var(--wt-horizontal-layout-gutter)*2);
- max-width: calc(8.33333%*var(--wt-col-count) - var(--wt-horizontal-layout-gutter)*2);
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
-}
-.wt-row_size_m {
- --wt-horizontal-layout-gutter: 16px;
-}
-[class*="wt-col"], [class*="wt-col"].wt-row {
- margin-right: var(--wt-horizontal-layout-gutter);
- margin-left: var(--wt-horizontal-layout-gutter);
-}
-.wt-row_justify_center {
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
-}
-.page-404__logo .sprite-img._404 {
- position: absolute;
- width: 100%;
- height: 100%;
-}
-.page-404__logo::before {
- float: left;
- padding-bottom: 100%;
- content: "";
-}
-.page-404__beam {
- position: absolute;
- left: -50%;
- top: -50%;
- width: 587px;
- height: 636px;
- z-index: -1;
-}
-.heavy {
- font-size: 14px;
- font-weight: bold;
-}
- </style>
-</head>
-<body>
-<script type="text/javascript">
-function getUrlParams(url) {
-
- var queryString = url ? url.split('?')[1] : window.location.search.slice(1);
- var obj = {};
-
- if (queryString) {
- queryString = queryString.split('#')[0];
-
- var arr = queryString.split('&');
-
- for (var i = 0; i < arr.length; i++) {
- var a = arr[i].split('=');
-
- var paramName = a[0];
- var paramValue = typeof (a[1]) === 'undefined' ? true : a[1];
-
- paramName = paramName.toLowerCase();
- if (typeof paramValue === 'string') paramValue = paramValue.toLowerCase();
-
- if (!obj[paramName]) {
- obj[paramName] = paramValue;
- }
- }
- }
- return obj;
-}
-window.onload = function() {
- document.getElementById("version").textContent = getUrlParams()['v']
-}
-</script>
-
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
- style="position: absolute; width: 0; height: 0" id="__SVG_SPRITE_NODE__">
- <symbol xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 64 64" id="404">
- <g>
- <rect y="0" width="64" height="64"></rect>
- <rect x="5.9" y="52" fill="#fff" width="24" height="4"></rect>
- <text x="5" y="20" fill="#fff" class="heavy">NOT</text>
- <text x="5" y="35" fill="#fff" class="heavy">FOUND</text>
- </g>
- </symbol>
- <symbol xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="183 -134 978 1061"
- id="page-404-beam">
- <g style="opacity:0.49;">
- <path style="fill-opacity:0;stroke:#D9D9D9;stroke-dasharray:10,3;"
- d="M1117.5,424.5l-535-476l87,449L1117.5,424.5z"></path>
- <path style="fill-opacity:0;stroke:#E1E1E1;stroke-dasharray:10,3;"
- d="M1118.3,465.9c-23.3,0-42.2-18.9-42.2-42.2 s18.9-42.2,42.2-42.2c23.3,0,42.2,18.9,42.2,42.2S1141.6,465.9,1118.3,465.9z M583.6,34.4c-46.3,0-83.9-37.6-83.9-83.9 s37.6-83.9,83.9-83.9s83.9,37.6,83.9,83.9S630,34.4,583.6,34.4z M536.2,841.7c0,46.8-37.9,84.8-84.7,84.8s-84.7-37.9-84.7-84.8 s37.9-84.8,84.7-84.8S536.2,794.9,536.2,841.7z M273.9,263.1c-49.9,0-90.4-40.5-90.4-90.4s40.5-90.4,90.4-90.4s90.4,40.5,90.4,90.4 S323.8,263.1,273.9,263.1z"></path>
- <path style="fill:#FFFFFF;fill-opacity:0;stroke:#CCCCCC;stroke-linejoin:round;"
- d="M1138.3,460.8L494,916l-0.4-0.7 c-12.4,7.1-26.8,11.2-42.2,11.2c-46.8,0-84.8-37.9-84.8-84.8c0-34.5,20.6-64.1,50.2-77.4l638.2-348l-470.3-382L417,173.1 l222.9,172.2c13.4,5.4,22.8,18.5,22.8,33.8c0,20.2-16.3,36.5-36.5,36.5c-9.8,0-18.6-3.8-25.2-10.1L242.9,257.6 c-2.2-0.8-4.3-1.7-6.3-2.6l-2-0.8l0-0.1c-30.2-14.6-51.1-45.6-51.1-81.4c0-28.6,13.3-54.1,34.1-70.7l0-0.3l321.1-222.2l0.2,0 c13-8.2,28.3-13,44.8-13c25.1,0,47.7,11.1,63,28.6l497.7,495.4c9.8,7.7,16.2,19.7,16.2,33.2 C1160.5,439.7,1151.5,453.7,1138.3,460.8z"></path>
- <path style="fill-opacity:0;stroke:#D9D9D9;stroke-dasharray:10,3;"
- d="M451.5,849.5l219-452l-398-223L451.5,849.5z"></path>
- <g>
- <path style="fill:#CDCDCD;"
- d="M608.5,58.4l-5.7-5.1l-3.1,6.9l-0.7-0.6l3.1-6.9l-0.1-0.1l0.4-0.8l6.5,5.8L608.5,58.4z"></path>
- <path style="fill:#CDCDCD;"
- d="M353.8,220.4l3.1,6.9l-0.9,0.1l-3.1-6.9l-0.2,0l-0.4-0.8l8.6-1l0.4,0.8L353.8,220.4z"></path>
- <path style="fill:#CDCDCD;"
- d="M1041.4,418.5l-7.2,4.9l-0.7-0.5l6.3-4.3l-6-4.7l0.8-0.5l6,4.7l0.1-0.1L1041.4,418.5z"></path>
- <path style="fill:#CDCDCD;"
- d="M528.6,699.3l-6.9,3.1l0,0.2l-0.8,0.4l-1-8.6l0.8-0.4l0.8,7.6l6.9-3.1L528.6,699.3z"></path>
- </g>
- </g>
- </symbol>
-</svg>
-<div class="wt-container article-content">
- <div class="wt-row wt-row_size_m wt-row_justify_center">
- <div class="wt-col-3">
- <div class="page-404__logo">
- <svg class="sprite-img _404">
- <use xlink:href="#404"></use>
- </svg>
- <svg class="page-404__beam">
- <use xlink:href="#page-404-beam"></use>
- </svg>
- </div>
- </div>
- <div class="wt-col-5">
- <h1 class="_big">uh-oh!</h1>
- <div class="sub-title margin-top-vertical-unit-half">You are requesting a page that not
- available in documentation version <span id="version"></span>
- </div>
- </div>
- </div>
-</div>
-</body>
-</html>
diff --git a/plugins/versioning/src/main/resources/dokka/styles/multimodule.css b/plugins/versioning/src/main/resources/dokka/styles/multimodule.css
deleted file mode 100644
index 91798c1d..00000000
--- a/plugins/versioning/src/main/resources/dokka/styles/multimodule.css
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-.versions-dropdown {
- position: relative;
-}
-
-.versions-dropdown-button {
- display: flex;
- border: none;
- cursor: pointer;
- padding: 5px;
-}
-
-.versions-dropdown-button::after {
- content: '';
- -webkit-mask: url("../images/arrow_down.svg") no-repeat 50% 50%;
- mask: url("../images/arrow_down.svg") no-repeat 50% 50%;
- mask-size: auto;
- -webkit-mask-size: cover;
- mask-size: cover;
- background-color: #fff;
- display: inline-block;
- transform: rotate(90deg);
- width: 24px;
- height: 16px;
-}
-
-.versions-dropdown-data {
- display: none;
- position: absolute;
- background-color: #27282c;
- border: 1px solid hsla(0, 0%, 100%, .6);
- box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
- z-index: 1;
- overflow-y: auto;
- max-height: 200px;
- min-width: 50px;
-}
-
-.versions-dropdown-data > a {
- display: block;
- padding: 5px;
- color: #fff;
- text-decoration: none;
-}
-
-.versions-dropdown-data > a:hover {
- background-color: hsla(0,0%,100%,.1)
-}
-
-.versions-dropdown:hover .versions-dropdown-data {
- display: block;
-}
diff --git a/plugins/versioning/versioning-plugin-example.png b/plugins/versioning/versioning-plugin-example.png
deleted file mode 100644
index cd02c558..00000000
--- a/plugins/versioning/versioning-plugin-example.png
+++ /dev/null
Binary files differ