From 9d6bb360ba4ece0d0e5dea2d82addcd4cc497528 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 21:54:28 +0100 Subject: [PATCH 01/71] Delegate Documentation builds to MkDocs, keep the rest as is --- .gitignore | 3 + _config.yml | 2 + _docs/advanced/deploy-to-servlet-container.md | 1 - {images => _docs/images}/WireMockShots.png | Bin {images => _docs/images}/bio-photo.jpg | Bin {images => _docs/images}/blackGithubIcon.svg | 0 {images => _docs/images}/clients/em.jpg | Bin {images => _docs/images}/clients/ft.jpg | Bin {images => _docs/images}/clients/intuit.jpg | Bin {images => _docs/images}/clients/piksel.jpg | Bin {images => _docs/images}/clients/pivotal.jpg | Bin {images => _docs/images}/clients/sky.jpg | Bin {images => _docs/images}/clients/softwire.jpg | Bin .../images}/clients/theguardian.jpg | Bin {images => _docs/images}/clients/yenlo.jpg | Bin {images => _docs/images}/closeModalIcon.png | Bin .../images}/codeTabsFootergithubIcon.svg | 0 {images => _docs/images}/ctDownloadIcon.svg | 0 .../images}/ctGithubDownloadIcon.svg | 0 {images => _docs/images}/ctStarIcon.svg | 0 {images => _docs/images}/ctUserIcon.svg | 0 .../images}/firefox-proxy-screenshot.png | Bin .../images}/idea-comparison-failure.png | Bin {images => _docs/images}/idea-shots.png | Bin {images => _docs/images}/ivy.png | Bin .../images}/java-wiremock-idea-shot.png | Bin .../images}/java-wiremock-sample-idea.png | Bin .../images}/java-wiremock-sample.jpg | Bin .../images}/json-wiremock-sample.jpg | Bin {images => _docs/images}/leftHeaderHP.png | Bin {images => _docs/images}/logos/EW-logo.png | Bin {images => _docs/images}/logos/FT-Logo.jpg | Bin .../images}/logos/Piksel_master.png | Bin .../images}/logos/Pivotal_TealOnWhite.png | Bin .../images}/logos/Pivotal_WhiteOnTeal.png | Bin .../images}/logos/The_Guardian_logo.png | Bin .../images}/logos/Yenlo_logo_trans.png | Bin .../images}/logos/doc-sections/bug.svg | 0 .../logos/doc-sections/checkcircle.svg | 0 .../images}/logos/doc-sections/checklist.svg | 0 .../images}/logos/doc-sections/cloud.svg | 0 .../images}/logos/doc-sections/community.svg | 0 .../images}/logos/doc-sections/connect.svg | 0 .../images}/logos/doc-sections/document.svg | 0 .../logos/doc-sections/documentBar.svg | 0 .../images}/logos/doc-sections/download.svg | 0 .../images}/logos/doc-sections/edit.svg | 0 .../logos/doc-sections/extensibility.svg | 0 .../images}/logos/doc-sections/help-mono.svg | 0 .../images}/logos/doc-sections/help.svg | 0 .../images}/logos/doc-sections/helpsec.svg | 0 .../images}/logos/doc-sections/home.svg | 0 .../images}/logos/doc-sections/link.svg | 0 .../logos/doc-sections/loudspeaker.svg | 0 .../images}/logos/doc-sections/plus.svg | 0 .../images}/logos/doc-sections/plusnew.svg | 0 .../images}/logos/doc-sections/quickstart.svg | 0 .../images}/logos/doc-sections/slack.svg | 0 .../images}/logos/doc-sections/summary.svg | 0 .../images}/logos/doc-sections/team.svg | 0 .../images}/logos/doc-sections/template.svg | 0 .../images}/logos/intuit_blue.gif | Bin {images => _docs/images}/logos/sky-logo.png | Bin .../images}/logos/softwire-logo.jpg | Bin .../images}/logos/technology/android.svg | 0 .../images}/logos/technology/c.png | Bin .../images}/logos/technology/cpp.png | Bin .../images}/logos/technology/docker.svg | 0 .../images}/logos/technology/dotnet.svg | 0 .../images}/logos/technology/golang.svg | 0 .../images}/logos/technology/gradle.svg | 0 .../images}/logos/technology/graphql.svg | 0 .../images}/logos/technology/groovy.svg | 0 .../images}/logos/technology/grpc.png | Bin .../images}/logos/technology/helm.svg | 0 .../images}/logos/technology/http.svg | 0 .../images}/logos/technology/https.svg | 0 .../images}/logos/technology/jar.svg | 0 .../images}/logos/technology/java.svg | 0 .../images}/logos/technology/kotlin.svg | 0 .../images}/logos/technology/kubernetes.svg | 0 .../images}/logos/technology/maven.svg | 0 .../images}/logos/technology/micronaut.svg | 0 .../images}/logos/technology/nodejs.svg | 0 .../images}/logos/technology/npm.svg | 0 .../images}/logos/technology/openshift.svg | 0 .../images}/logos/technology/php.svg | 0 .../images}/logos/technology/prometheus.svg | 0 .../images}/logos/technology/python.svg | 0 .../images}/logos/technology/quarkus.svg | 0 .../images}/logos/technology/ruby.svg | 0 .../images}/logos/technology/rust.svg | 0 .../images}/logos/technology/spring.svg | 0 .../logos/technology/testcontainers.svg | 0 .../images}/logos/technology/webhooks.svg | 0 .../images}/logos/wiremock/logo_small.svg | 0 .../images}/logos/wiremock/logo_square.svg | 0 .../images}/logos/wiremock/logo_wide.svg | 0 .../images}/mm-browser-mockups.png | Bin .../images}/mm-layout-examples.png | Bin .../images}/mocklab/Mocklab_Logo_4x.png | Bin .../mocklab/Mocklab_Logo_4x_greyscale.png | Bin .../mocklab/rest-example-stubs-screenshot.png | Bin .../mocklab/stub-form-screenshot-5.png | Bin .../images}/openSourceRightIcon.svg | 0 .../images}/opengraphs/default.png | Bin {images => _docs/images}/paypalIcon.png | Bin .../images}/polygon-texture-2.jpg | Bin .../images}/recorder-screenshot.png | Bin {images => _docs/images}/rightHeaderHP.png | Bin .../advanced-section-body-match.png | Bin .../images}/screenshots/base-url.png | Bin .../images}/screenshots/basic-new-stub.png | Bin .../images}/screenshots/basic-response.png | Bin .../screenshots/body-template-screenshot.png | Bin .../screenshots/chunked-dribble-delay.png | Bin .../images}/screenshots/clone-stub-button.png | Bin .../screenshots/default-equal-to-json.png | Bin .../default-response-example-request.png | Bin .../default-response-example-response.png | Bin .../enable-response-templating-screenshot.png | Bin .../screenshots/enable-xml-placeholders.png | Bin .../images}/screenshots/equal-to-json.png | Bin .../equal-to-xml-with-placeholders.png | Bin .../images}/screenshots/equal-to-xml.png | Bin .../screenshots/export-button-on-toolbar.png | Bin .../images}/screenshots/export-stubs.png | Bin .../images}/screenshots/fault-response.png | Bin .../images}/screenshots/fixed-delay.png | Bin .../header-template-screenshot.png | Bin .../screenshots/ignore-array-order.png | Bin .../screenshots/ignore-extra-elements.png | Bin .../screenshots/import-button-on-toolbar.png | Bin .../images}/screenshots/import-file.png | Bin .../images}/screenshots/import-text.png | Bin .../images}/screenshots/json-placeholders.png | Bin .../screenshots/jsonpath-no-submatch.png | Bin .../screenshots/jsonpath-with-submatch.png | Bin .../images}/screenshots/matches-json-path.png | Bin .../mock-api-browser-screenshot.png | Bin .../mock-rest-api/503-error-test-request.png | Bin .../mock-rest-api/503-response.png | Bin .../mock-rest-api/companies-list-1.png | Bin .../mock-rest-api/companies-list-2.png | Bin .../mock-rest-api/companies-scenario-1.png | Bin .../mock-rest-api/companies-scenario-2.png | Bin .../companies-scenario-state-change.png | Bin .../mock-rest-api/contact-list-request.png | Bin .../mock-rest-api/contact-list-response.png | Bin .../contact-list-test-request.png | Bin .../filtered-contacts-response.png | Bin .../mock-rest-api/matches-json-path.png | Bin .../mock-rest-api/new-company-post.png | Bin .../new-contact-body-pattern.png | Bin .../mock-rest-api/new-contact-post-stub.png | Bin .../new-contact-postman-mismatch.png | Bin .../mock-rest-api/query-parameter-match.png | Bin .../mock-rest-api/raised-priority.png | Bin .../mock-rest-api/rest-api-template.png | Bin .../mock-rest-api/single-contact-request.png | Bin .../mock-rest-api/single-contact-response.png | Bin .../templated-contact-request.png | Bin .../templated-contact-response.png | Bin .../templated-contact-test-request.png | Bin .../screenshots/multiple-xpath-soap-match.png | Bin .../screenshots/new-body-pattern-button.png | Bin .../images}/screenshots/new-header-button.png | Bin .../screenshots/new-mock-api-button.png | Bin .../images}/screenshots/new-stub-button.png | Bin .../screenshots/new-to-do-item-field.png | Bin .../screenshots/plain-proxy-response.png | Bin .../images}/screenshots/postman-empty-api.png | Bin .../images}/screenshots/postman.png | Bin .../screenshots/proxy-all-by-default-stub.png | Bin .../screenshots/random-lognormal-delay.png | Bin .../screenshots/random-uniform-delay.png | Bin .../screenshots/record-button-screenshot.png | Bin .../record-dialog-screenshot-3.png | Bin .../screenshots/request-parameters.png | Bin .../images}/screenshots/response-headers.png | Bin .../screenshots/scenario-reset-button.png | Bin .../scenario-single-item-stub-request.png | Bin .../scenario-single-item-stub-response.png | Bin .../scenarios-empty-list-stub-request.png | Bin .../scenarios-empty-list-stub-response.png | Bin .../screenshots/scenarios-post-item-stub.png | Bin .../screenshots/soap-action-header.png | Bin .../images}/screenshots/soap-placeholders.png | Bin .../images}/screenshots/soap-request.png | Bin .../images}/screenshots/soap-response.png | Bin .../screenshots/start-button-screenshot.png | Bin .../screenshots/stop-button-screenshot.png | Bin .../screenshots/templated-proxy-response.png | Bin .../to-do-bad-post-stub-request.png | Bin .../to-do-bad-post-stub-response.png | Bin .../images}/screenshots/to-do-error-page.png | Bin .../images}/screenshots/to-do-list-app.png | Bin .../to-do-list-success-message.png | Bin .../screenshots/to-do-post-stub-request.png | Bin .../screenshots/to-do-post-stub-response.png | Bin .../images}/screenshots/to-do-post-stub.png | Bin .../images}/screenshots/to-do-request-log.png | Bin .../images}/screenshots/to-do-stub-old.png | Bin .../screenshots/to-do-stub-request.png | Bin .../screenshots/to-do-stub-response.png | Bin .../images}/screenshots/to-do-stub.png | Bin .../images}/screenshots/url-match-type.png | Bin .../screenshots/url-path-and-query.png | Bin .../images}/screenshots/url-path-matching.png | Bin .../screenshots/wiremock-folder-drop.png | Bin .../images}/screenshots/xpath-body-match.png | Bin .../images}/screenshots/xpath-soap-match.png | Bin {images => _docs/images}/separatorLine.png | Bin {images => _docs/images}/signupModalRobot.png | Bin .../images}/slack-logo-medium.png | Bin {images => _docs/images}/slackIcon.svg | 0 .../images}/small-json-idea-shot.png | Bin .../graphql/wiremock_graphql_opengraph.png | Bin .../images}/solutions/grpc/header.png | Bin .../images}/solutions/grpc/intro_schema.png | Bin .../grpc/wiremock-grpc-opengraph.png | Bin .../testcontainers_c_logo_square.png | Bin .../testcontainers_c_logo_wide.png | Bin .../testcontainers_c_opengraph.png | Bin {images => _docs/images}/studioRightIcon.svg | 0 {images => _docs/images}/twitterIcon.svg | 0 .../images}/ui-bg_glass_20_555555_1x400.png | Bin .../images}/ui-bg_glass_40_7E8AA2_1x400.png | Bin .../images}/ui-bg_glass_40_ffc73d_1x400.png | Bin .../ui-bg_gloss-wave_25_333333_500x100.png | Bin .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin .../ui-bg_inset-soft_25_000000_1x100.png | Bin .../ui-bg_inset-soft_30_FF9800_1x100.png | Bin .../images}/ui-icons_222222_256x240.png | Bin .../images}/ui-icons_4b8e0b_256x240.png | Bin .../images}/ui-icons_a83300_256x240.png | Bin .../images}/ui-icons_cccccc_256x240.png | Bin .../images}/ui-icons_ffffff_256x240.png | Bin .../images}/verification-exception.png | Bin .../wiremock-cloud/wiremock_cloud_favicon.svg | 0 .../wiremock-cloud/wiremock_cloud_logo.png | Bin .../wiremock-cloud/wiremock_cloud_logo.svg | 0 .../images}/wiremock-idea-shots.png | Bin {images => _docs/images}/wiremockBYUP9.png | Bin .../images}/wiremockDashboard.png | Bin {images => _docs/images}/wiremockRobot.png | Bin {images => _docs/images}/wiremockRobotBG.png | Bin .../images}/wiremockStudioLeft.png | Bin .../images}/wiremockStudioRight.png | Bin .../images}/wiremockTypeExample.svg | 0 {images => _docs/images}/wm-concept-01.svg | 116 ++++----- _docs/index.html | 68 +++--- _docs/overview.md | 1 - images/navigation/loudspeaker.svg | 2 + .../{ => studio}/wiremockStudioDashboard.png | Bin index.html | 2 +- mkdocs.yml | 224 ++++++++++++++++++ requirements.txt | 23 ++ 258 files changed, 347 insertions(+), 95 deletions(-) rename {images => _docs/images}/WireMockShots.png (100%) rename {images => _docs/images}/bio-photo.jpg (100%) rename {images => _docs/images}/blackGithubIcon.svg (100%) rename {images => _docs/images}/clients/em.jpg (100%) rename {images => _docs/images}/clients/ft.jpg (100%) rename {images => _docs/images}/clients/intuit.jpg (100%) rename {images => _docs/images}/clients/piksel.jpg (100%) rename {images => _docs/images}/clients/pivotal.jpg (100%) rename {images => _docs/images}/clients/sky.jpg (100%) rename {images => _docs/images}/clients/softwire.jpg (100%) rename {images => _docs/images}/clients/theguardian.jpg (100%) rename {images => _docs/images}/clients/yenlo.jpg (100%) rename {images => _docs/images}/closeModalIcon.png (100%) rename {images => _docs/images}/codeTabsFootergithubIcon.svg (100%) rename {images => _docs/images}/ctDownloadIcon.svg (100%) rename {images => _docs/images}/ctGithubDownloadIcon.svg (100%) rename {images => _docs/images}/ctStarIcon.svg (100%) rename {images => _docs/images}/ctUserIcon.svg (100%) rename {images => _docs/images}/firefox-proxy-screenshot.png (100%) rename {images => _docs/images}/idea-comparison-failure.png (100%) rename {images => _docs/images}/idea-shots.png (100%) rename {images => _docs/images}/ivy.png (100%) rename {images => _docs/images}/java-wiremock-idea-shot.png (100%) rename {images => _docs/images}/java-wiremock-sample-idea.png (100%) rename {images => _docs/images}/java-wiremock-sample.jpg (100%) rename {images => _docs/images}/json-wiremock-sample.jpg (100%) rename {images => _docs/images}/leftHeaderHP.png (100%) rename {images => _docs/images}/logos/EW-logo.png (100%) rename {images => _docs/images}/logos/FT-Logo.jpg (100%) rename {images => _docs/images}/logos/Piksel_master.png (100%) rename {images => _docs/images}/logos/Pivotal_TealOnWhite.png (100%) rename {images => _docs/images}/logos/Pivotal_WhiteOnTeal.png (100%) rename {images => _docs/images}/logos/The_Guardian_logo.png (100%) rename {images => _docs/images}/logos/Yenlo_logo_trans.png (100%) rename {images => _docs/images}/logos/doc-sections/bug.svg (100%) rename {images => _docs/images}/logos/doc-sections/checkcircle.svg (100%) rename {images => _docs/images}/logos/doc-sections/checklist.svg (100%) rename {images => _docs/images}/logos/doc-sections/cloud.svg (100%) rename {images => _docs/images}/logos/doc-sections/community.svg (100%) rename {images => _docs/images}/logos/doc-sections/connect.svg (100%) rename {images => _docs/images}/logos/doc-sections/document.svg (100%) rename {images => _docs/images}/logos/doc-sections/documentBar.svg (100%) rename {images => _docs/images}/logos/doc-sections/download.svg (100%) rename {images => _docs/images}/logos/doc-sections/edit.svg (100%) rename {images => _docs/images}/logos/doc-sections/extensibility.svg (100%) rename {images => _docs/images}/logos/doc-sections/help-mono.svg (100%) rename {images => _docs/images}/logos/doc-sections/help.svg (100%) rename {images => _docs/images}/logos/doc-sections/helpsec.svg (100%) rename {images => _docs/images}/logos/doc-sections/home.svg (100%) rename {images => _docs/images}/logos/doc-sections/link.svg (100%) rename {images => _docs/images}/logos/doc-sections/loudspeaker.svg (100%) rename {images => _docs/images}/logos/doc-sections/plus.svg (100%) rename {images => _docs/images}/logos/doc-sections/plusnew.svg (100%) rename {images => _docs/images}/logos/doc-sections/quickstart.svg (100%) rename {images => _docs/images}/logos/doc-sections/slack.svg (100%) rename {images => _docs/images}/logos/doc-sections/summary.svg (100%) rename {images => _docs/images}/logos/doc-sections/team.svg (100%) rename {images => _docs/images}/logos/doc-sections/template.svg (100%) rename {images => _docs/images}/logos/intuit_blue.gif (100%) rename {images => _docs/images}/logos/sky-logo.png (100%) rename {images => _docs/images}/logos/softwire-logo.jpg (100%) rename {images => _docs/images}/logos/technology/android.svg (100%) rename {images => _docs/images}/logos/technology/c.png (100%) rename {images => _docs/images}/logos/technology/cpp.png (100%) rename {images => _docs/images}/logos/technology/docker.svg (100%) rename {images => _docs/images}/logos/technology/dotnet.svg (100%) rename {images => _docs/images}/logos/technology/golang.svg (100%) rename {images => _docs/images}/logos/technology/gradle.svg (100%) rename {images => _docs/images}/logos/technology/graphql.svg (100%) rename {images => _docs/images}/logos/technology/groovy.svg (100%) rename {images => _docs/images}/logos/technology/grpc.png (100%) rename {images => _docs/images}/logos/technology/helm.svg (100%) rename {images => _docs/images}/logos/technology/http.svg (100%) rename {images => _docs/images}/logos/technology/https.svg (100%) rename {images => _docs/images}/logos/technology/jar.svg (100%) rename {images => _docs/images}/logos/technology/java.svg (100%) rename {images => _docs/images}/logos/technology/kotlin.svg (100%) rename {images => _docs/images}/logos/technology/kubernetes.svg (100%) rename {images => _docs/images}/logos/technology/maven.svg (100%) rename {images => _docs/images}/logos/technology/micronaut.svg (100%) rename {images => _docs/images}/logos/technology/nodejs.svg (100%) rename {images => _docs/images}/logos/technology/npm.svg (100%) rename {images => _docs/images}/logos/technology/openshift.svg (100%) rename {images => _docs/images}/logos/technology/php.svg (100%) rename {images => _docs/images}/logos/technology/prometheus.svg (100%) rename {images => _docs/images}/logos/technology/python.svg (100%) rename {images => _docs/images}/logos/technology/quarkus.svg (100%) rename {images => _docs/images}/logos/technology/ruby.svg (100%) rename {images => _docs/images}/logos/technology/rust.svg (100%) rename {images => _docs/images}/logos/technology/spring.svg (100%) rename {images => _docs/images}/logos/technology/testcontainers.svg (100%) rename {images => _docs/images}/logos/technology/webhooks.svg (100%) rename {images => _docs/images}/logos/wiremock/logo_small.svg (100%) rename {images => _docs/images}/logos/wiremock/logo_square.svg (100%) rename {images => _docs/images}/logos/wiremock/logo_wide.svg (100%) rename {images => _docs/images}/mm-browser-mockups.png (100%) rename {images => _docs/images}/mm-layout-examples.png (100%) rename {images => _docs/images}/mocklab/Mocklab_Logo_4x.png (100%) rename {images => _docs/images}/mocklab/Mocklab_Logo_4x_greyscale.png (100%) rename {images => _docs/images}/mocklab/rest-example-stubs-screenshot.png (100%) rename {images => _docs/images}/mocklab/stub-form-screenshot-5.png (100%) rename {images => _docs/images}/openSourceRightIcon.svg (100%) rename {images => _docs/images}/opengraphs/default.png (100%) rename {images => _docs/images}/paypalIcon.png (100%) rename {images => _docs/images}/polygon-texture-2.jpg (100%) mode change 100755 => 100644 rename {images => _docs/images}/recorder-screenshot.png (100%) rename {images => _docs/images}/rightHeaderHP.png (100%) rename {images => _docs/images}/screenshots/advanced-section-body-match.png (100%) rename {images => _docs/images}/screenshots/base-url.png (100%) rename {images => _docs/images}/screenshots/basic-new-stub.png (100%) rename {images => _docs/images}/screenshots/basic-response.png (100%) rename {images => _docs/images}/screenshots/body-template-screenshot.png (100%) rename {images => _docs/images}/screenshots/chunked-dribble-delay.png (100%) rename {images => _docs/images}/screenshots/clone-stub-button.png (100%) rename {images => _docs/images}/screenshots/default-equal-to-json.png (100%) rename {images => _docs/images}/screenshots/default-response-example-request.png (100%) rename {images => _docs/images}/screenshots/default-response-example-response.png (100%) rename {images => _docs/images}/screenshots/enable-response-templating-screenshot.png (100%) rename {images => _docs/images}/screenshots/enable-xml-placeholders.png (100%) rename {images => _docs/images}/screenshots/equal-to-json.png (100%) rename {images => _docs/images}/screenshots/equal-to-xml-with-placeholders.png (100%) rename {images => _docs/images}/screenshots/equal-to-xml.png (100%) rename {images => _docs/images}/screenshots/export-button-on-toolbar.png (100%) rename {images => _docs/images}/screenshots/export-stubs.png (100%) rename {images => _docs/images}/screenshots/fault-response.png (100%) rename {images => _docs/images}/screenshots/fixed-delay.png (100%) rename {images => _docs/images}/screenshots/header-template-screenshot.png (100%) rename {images => _docs/images}/screenshots/ignore-array-order.png (100%) rename {images => _docs/images}/screenshots/ignore-extra-elements.png (100%) rename {images => _docs/images}/screenshots/import-button-on-toolbar.png (100%) rename {images => _docs/images}/screenshots/import-file.png (100%) rename {images => _docs/images}/screenshots/import-text.png (100%) rename {images => _docs/images}/screenshots/json-placeholders.png (100%) rename {images => _docs/images}/screenshots/jsonpath-no-submatch.png (100%) rename {images => _docs/images}/screenshots/jsonpath-with-submatch.png (100%) rename {images => _docs/images}/screenshots/matches-json-path.png (100%) rename {images => _docs/images}/screenshots/mock-api-browser-screenshot.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/503-error-test-request.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/503-response.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/companies-list-1.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/companies-list-2.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/companies-scenario-1.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/companies-scenario-2.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/companies-scenario-state-change.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/contact-list-request.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/contact-list-response.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/contact-list-test-request.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/filtered-contacts-response.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/matches-json-path.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/new-company-post.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/new-contact-body-pattern.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/new-contact-post-stub.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/new-contact-postman-mismatch.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/query-parameter-match.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/raised-priority.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/rest-api-template.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/single-contact-request.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/single-contact-response.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/templated-contact-request.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/templated-contact-response.png (100%) rename {images => _docs/images}/screenshots/mock-rest-api/templated-contact-test-request.png (100%) rename {images => _docs/images}/screenshots/multiple-xpath-soap-match.png (100%) rename {images => _docs/images}/screenshots/new-body-pattern-button.png (100%) rename {images => _docs/images}/screenshots/new-header-button.png (100%) rename {images => _docs/images}/screenshots/new-mock-api-button.png (100%) rename {images => _docs/images}/screenshots/new-stub-button.png (100%) rename {images => _docs/images}/screenshots/new-to-do-item-field.png (100%) rename {images => _docs/images}/screenshots/plain-proxy-response.png (100%) rename {images => _docs/images}/screenshots/postman-empty-api.png (100%) rename {images => _docs/images}/screenshots/postman.png (100%) rename {images => _docs/images}/screenshots/proxy-all-by-default-stub.png (100%) rename {images => _docs/images}/screenshots/random-lognormal-delay.png (100%) rename {images => _docs/images}/screenshots/random-uniform-delay.png (100%) rename {images => _docs/images}/screenshots/record-button-screenshot.png (100%) rename {images => _docs/images}/screenshots/record-dialog-screenshot-3.png (100%) rename {images => _docs/images}/screenshots/request-parameters.png (100%) rename {images => _docs/images}/screenshots/response-headers.png (100%) rename {images => _docs/images}/screenshots/scenario-reset-button.png (100%) rename {images => _docs/images}/screenshots/scenario-single-item-stub-request.png (100%) rename {images => _docs/images}/screenshots/scenario-single-item-stub-response.png (100%) rename {images => _docs/images}/screenshots/scenarios-empty-list-stub-request.png (100%) rename {images => _docs/images}/screenshots/scenarios-empty-list-stub-response.png (100%) rename {images => _docs/images}/screenshots/scenarios-post-item-stub.png (100%) rename {images => _docs/images}/screenshots/soap-action-header.png (100%) rename {images => _docs/images}/screenshots/soap-placeholders.png (100%) rename {images => _docs/images}/screenshots/soap-request.png (100%) rename {images => _docs/images}/screenshots/soap-response.png (100%) rename {images => _docs/images}/screenshots/start-button-screenshot.png (100%) rename {images => _docs/images}/screenshots/stop-button-screenshot.png (100%) rename {images => _docs/images}/screenshots/templated-proxy-response.png (100%) rename {images => _docs/images}/screenshots/to-do-bad-post-stub-request.png (100%) rename {images => _docs/images}/screenshots/to-do-bad-post-stub-response.png (100%) rename {images => _docs/images}/screenshots/to-do-error-page.png (100%) rename {images => _docs/images}/screenshots/to-do-list-app.png (100%) rename {images => _docs/images}/screenshots/to-do-list-success-message.png (100%) rename {images => _docs/images}/screenshots/to-do-post-stub-request.png (100%) rename {images => _docs/images}/screenshots/to-do-post-stub-response.png (100%) rename {images => _docs/images}/screenshots/to-do-post-stub.png (100%) rename {images => _docs/images}/screenshots/to-do-request-log.png (100%) rename {images => _docs/images}/screenshots/to-do-stub-old.png (100%) rename {images => _docs/images}/screenshots/to-do-stub-request.png (100%) rename {images => _docs/images}/screenshots/to-do-stub-response.png (100%) rename {images => _docs/images}/screenshots/to-do-stub.png (100%) rename {images => _docs/images}/screenshots/url-match-type.png (100%) rename {images => _docs/images}/screenshots/url-path-and-query.png (100%) rename {images => _docs/images}/screenshots/url-path-matching.png (100%) rename {images => _docs/images}/screenshots/wiremock-folder-drop.png (100%) rename {images => _docs/images}/screenshots/xpath-body-match.png (100%) rename {images => _docs/images}/screenshots/xpath-soap-match.png (100%) rename {images => _docs/images}/separatorLine.png (100%) rename {images => _docs/images}/signupModalRobot.png (100%) rename {images => _docs/images}/slack-logo-medium.png (100%) rename {images => _docs/images}/slackIcon.svg (100%) rename {images => _docs/images}/small-json-idea-shot.png (100%) rename {images => _docs/images}/solutions/graphql/wiremock_graphql_opengraph.png (100%) rename {images => _docs/images}/solutions/grpc/header.png (100%) rename {images => _docs/images}/solutions/grpc/intro_schema.png (100%) rename {images => _docs/images}/solutions/grpc/wiremock-grpc-opengraph.png (100%) rename {images => _docs/images}/solutions/testcontainers/testcontainers_c_logo_square.png (100%) rename {images => _docs/images}/solutions/testcontainers/testcontainers_c_logo_wide.png (100%) rename {images => _docs/images}/solutions/testcontainers/testcontainers_c_opengraph.png (100%) rename {images => _docs/images}/studioRightIcon.svg (100%) rename {images => _docs/images}/twitterIcon.svg (100%) rename {images => _docs/images}/ui-bg_glass_20_555555_1x400.png (100%) rename {images => _docs/images}/ui-bg_glass_40_7E8AA2_1x400.png (100%) rename {images => _docs/images}/ui-bg_glass_40_ffc73d_1x400.png (100%) rename {images => _docs/images}/ui-bg_gloss-wave_25_333333_500x100.png (100%) rename {images => _docs/images}/ui-bg_highlight-soft_80_eeeeee_1x100.png (100%) rename {images => _docs/images}/ui-bg_inset-soft_25_000000_1x100.png (100%) rename {images => _docs/images}/ui-bg_inset-soft_30_FF9800_1x100.png (100%) rename {images => _docs/images}/ui-icons_222222_256x240.png (100%) rename {images => _docs/images}/ui-icons_4b8e0b_256x240.png (100%) rename {images => _docs/images}/ui-icons_a83300_256x240.png (100%) rename {images => _docs/images}/ui-icons_cccccc_256x240.png (100%) rename {images => _docs/images}/ui-icons_ffffff_256x240.png (100%) rename {images => _docs/images}/verification-exception.png (100%) rename {images => _docs/images}/wiremock-cloud/wiremock_cloud_favicon.svg (100%) rename {images => _docs/images}/wiremock-cloud/wiremock_cloud_logo.png (100%) rename {images => _docs/images}/wiremock-cloud/wiremock_cloud_logo.svg (100%) rename {images => _docs/images}/wiremock-idea-shots.png (100%) rename {images => _docs/images}/wiremockBYUP9.png (100%) rename {images => _docs/images}/wiremockDashboard.png (100%) rename {images => _docs/images}/wiremockRobot.png (100%) rename {images => _docs/images}/wiremockRobotBG.png (100%) rename {images => _docs/images}/wiremockStudioLeft.png (100%) rename {images => _docs/images}/wiremockStudioRight.png (100%) rename {images => _docs/images}/wiremockTypeExample.svg (100%) rename {images => _docs/images}/wm-concept-01.svg (98%) create mode 100644 images/navigation/loudspeaker.svg rename images/{ => studio}/wiremockStudioDashboard.png (100%) create mode 100644 mkdocs.yml create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index b7c045cb..32c353a9 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ main.css /tmp **/.DS_Store + +# MkDocs +/temp_dir/ diff --git a/_config.yml b/_config.yml index 0dc9f33e..b1242a67 100644 --- a/_config.yml +++ b/_config.yml @@ -130,6 +130,8 @@ exclude: - tmp # Served via symbolic links - .submodules + # Delegated to MkDocs + - _docs keep_files: - .git - .svn diff --git a/_docs/advanced/deploy-to-servlet-container.md b/_docs/advanced/deploy-to-servlet-container.md index 49963616..ef066a15 100644 --- a/_docs/advanced/deploy-to-servlet-container.md +++ b/_docs/advanced/deploy-to-servlet-container.md @@ -1,5 +1,4 @@ --- -layout: docs title: Deploying into a servlet container meta_title: Deploying into a servlet container | WireMock description: "WireMock can be packaged up as a WAR and deployed into a servlet diff --git a/images/WireMockShots.png b/_docs/images/WireMockShots.png similarity index 100% rename from images/WireMockShots.png rename to _docs/images/WireMockShots.png diff --git a/images/bio-photo.jpg b/_docs/images/bio-photo.jpg similarity index 100% rename from images/bio-photo.jpg rename to _docs/images/bio-photo.jpg diff --git a/images/blackGithubIcon.svg b/_docs/images/blackGithubIcon.svg similarity index 100% rename from images/blackGithubIcon.svg rename to _docs/images/blackGithubIcon.svg diff --git a/images/clients/em.jpg b/_docs/images/clients/em.jpg similarity index 100% rename from images/clients/em.jpg rename to _docs/images/clients/em.jpg diff --git a/images/clients/ft.jpg b/_docs/images/clients/ft.jpg similarity index 100% rename from images/clients/ft.jpg rename to _docs/images/clients/ft.jpg diff --git a/images/clients/intuit.jpg b/_docs/images/clients/intuit.jpg similarity index 100% rename from images/clients/intuit.jpg rename to _docs/images/clients/intuit.jpg diff --git a/images/clients/piksel.jpg b/_docs/images/clients/piksel.jpg similarity index 100% rename from images/clients/piksel.jpg rename to _docs/images/clients/piksel.jpg diff --git a/images/clients/pivotal.jpg b/_docs/images/clients/pivotal.jpg similarity index 100% rename from images/clients/pivotal.jpg rename to _docs/images/clients/pivotal.jpg diff --git a/images/clients/sky.jpg b/_docs/images/clients/sky.jpg similarity index 100% rename from images/clients/sky.jpg rename to _docs/images/clients/sky.jpg diff --git a/images/clients/softwire.jpg b/_docs/images/clients/softwire.jpg similarity index 100% rename from images/clients/softwire.jpg rename to _docs/images/clients/softwire.jpg diff --git a/images/clients/theguardian.jpg b/_docs/images/clients/theguardian.jpg similarity index 100% rename from images/clients/theguardian.jpg rename to _docs/images/clients/theguardian.jpg diff --git a/images/clients/yenlo.jpg b/_docs/images/clients/yenlo.jpg similarity index 100% rename from images/clients/yenlo.jpg rename to _docs/images/clients/yenlo.jpg diff --git a/images/closeModalIcon.png b/_docs/images/closeModalIcon.png similarity index 100% rename from images/closeModalIcon.png rename to _docs/images/closeModalIcon.png diff --git a/images/codeTabsFootergithubIcon.svg b/_docs/images/codeTabsFootergithubIcon.svg similarity index 100% rename from images/codeTabsFootergithubIcon.svg rename to _docs/images/codeTabsFootergithubIcon.svg diff --git a/images/ctDownloadIcon.svg b/_docs/images/ctDownloadIcon.svg similarity index 100% rename from images/ctDownloadIcon.svg rename to _docs/images/ctDownloadIcon.svg diff --git a/images/ctGithubDownloadIcon.svg b/_docs/images/ctGithubDownloadIcon.svg similarity index 100% rename from images/ctGithubDownloadIcon.svg rename to _docs/images/ctGithubDownloadIcon.svg diff --git a/images/ctStarIcon.svg b/_docs/images/ctStarIcon.svg similarity index 100% rename from images/ctStarIcon.svg rename to _docs/images/ctStarIcon.svg diff --git a/images/ctUserIcon.svg b/_docs/images/ctUserIcon.svg similarity index 100% rename from images/ctUserIcon.svg rename to _docs/images/ctUserIcon.svg diff --git a/images/firefox-proxy-screenshot.png b/_docs/images/firefox-proxy-screenshot.png similarity index 100% rename from images/firefox-proxy-screenshot.png rename to _docs/images/firefox-proxy-screenshot.png diff --git a/images/idea-comparison-failure.png b/_docs/images/idea-comparison-failure.png similarity index 100% rename from images/idea-comparison-failure.png rename to _docs/images/idea-comparison-failure.png diff --git a/images/idea-shots.png b/_docs/images/idea-shots.png similarity index 100% rename from images/idea-shots.png rename to _docs/images/idea-shots.png diff --git a/images/ivy.png b/_docs/images/ivy.png similarity index 100% rename from images/ivy.png rename to _docs/images/ivy.png diff --git a/images/java-wiremock-idea-shot.png b/_docs/images/java-wiremock-idea-shot.png similarity index 100% rename from images/java-wiremock-idea-shot.png rename to _docs/images/java-wiremock-idea-shot.png diff --git a/images/java-wiremock-sample-idea.png b/_docs/images/java-wiremock-sample-idea.png similarity index 100% rename from images/java-wiremock-sample-idea.png rename to _docs/images/java-wiremock-sample-idea.png diff --git a/images/java-wiremock-sample.jpg b/_docs/images/java-wiremock-sample.jpg similarity index 100% rename from images/java-wiremock-sample.jpg rename to _docs/images/java-wiremock-sample.jpg diff --git a/images/json-wiremock-sample.jpg b/_docs/images/json-wiremock-sample.jpg similarity index 100% rename from images/json-wiremock-sample.jpg rename to _docs/images/json-wiremock-sample.jpg diff --git a/images/leftHeaderHP.png b/_docs/images/leftHeaderHP.png similarity index 100% rename from images/leftHeaderHP.png rename to _docs/images/leftHeaderHP.png diff --git a/images/logos/EW-logo.png b/_docs/images/logos/EW-logo.png similarity index 100% rename from images/logos/EW-logo.png rename to _docs/images/logos/EW-logo.png diff --git a/images/logos/FT-Logo.jpg b/_docs/images/logos/FT-Logo.jpg similarity index 100% rename from images/logos/FT-Logo.jpg rename to _docs/images/logos/FT-Logo.jpg diff --git a/images/logos/Piksel_master.png b/_docs/images/logos/Piksel_master.png similarity index 100% rename from images/logos/Piksel_master.png rename to _docs/images/logos/Piksel_master.png diff --git a/images/logos/Pivotal_TealOnWhite.png b/_docs/images/logos/Pivotal_TealOnWhite.png similarity index 100% rename from images/logos/Pivotal_TealOnWhite.png rename to _docs/images/logos/Pivotal_TealOnWhite.png diff --git a/images/logos/Pivotal_WhiteOnTeal.png b/_docs/images/logos/Pivotal_WhiteOnTeal.png similarity index 100% rename from images/logos/Pivotal_WhiteOnTeal.png rename to _docs/images/logos/Pivotal_WhiteOnTeal.png diff --git a/images/logos/The_Guardian_logo.png b/_docs/images/logos/The_Guardian_logo.png similarity index 100% rename from images/logos/The_Guardian_logo.png rename to _docs/images/logos/The_Guardian_logo.png diff --git a/images/logos/Yenlo_logo_trans.png b/_docs/images/logos/Yenlo_logo_trans.png similarity index 100% rename from images/logos/Yenlo_logo_trans.png rename to _docs/images/logos/Yenlo_logo_trans.png diff --git a/images/logos/doc-sections/bug.svg b/_docs/images/logos/doc-sections/bug.svg similarity index 100% rename from images/logos/doc-sections/bug.svg rename to _docs/images/logos/doc-sections/bug.svg diff --git a/images/logos/doc-sections/checkcircle.svg b/_docs/images/logos/doc-sections/checkcircle.svg similarity index 100% rename from images/logos/doc-sections/checkcircle.svg rename to _docs/images/logos/doc-sections/checkcircle.svg diff --git a/images/logos/doc-sections/checklist.svg b/_docs/images/logos/doc-sections/checklist.svg similarity index 100% rename from images/logos/doc-sections/checklist.svg rename to _docs/images/logos/doc-sections/checklist.svg diff --git a/images/logos/doc-sections/cloud.svg b/_docs/images/logos/doc-sections/cloud.svg similarity index 100% rename from images/logos/doc-sections/cloud.svg rename to _docs/images/logos/doc-sections/cloud.svg diff --git a/images/logos/doc-sections/community.svg b/_docs/images/logos/doc-sections/community.svg similarity index 100% rename from images/logos/doc-sections/community.svg rename to _docs/images/logos/doc-sections/community.svg diff --git a/images/logos/doc-sections/connect.svg b/_docs/images/logos/doc-sections/connect.svg similarity index 100% rename from images/logos/doc-sections/connect.svg rename to _docs/images/logos/doc-sections/connect.svg diff --git a/images/logos/doc-sections/document.svg b/_docs/images/logos/doc-sections/document.svg similarity index 100% rename from images/logos/doc-sections/document.svg rename to _docs/images/logos/doc-sections/document.svg diff --git a/images/logos/doc-sections/documentBar.svg b/_docs/images/logos/doc-sections/documentBar.svg similarity index 100% rename from images/logos/doc-sections/documentBar.svg rename to _docs/images/logos/doc-sections/documentBar.svg diff --git a/images/logos/doc-sections/download.svg b/_docs/images/logos/doc-sections/download.svg similarity index 100% rename from images/logos/doc-sections/download.svg rename to _docs/images/logos/doc-sections/download.svg diff --git a/images/logos/doc-sections/edit.svg b/_docs/images/logos/doc-sections/edit.svg similarity index 100% rename from images/logos/doc-sections/edit.svg rename to _docs/images/logos/doc-sections/edit.svg diff --git a/images/logos/doc-sections/extensibility.svg b/_docs/images/logos/doc-sections/extensibility.svg similarity index 100% rename from images/logos/doc-sections/extensibility.svg rename to _docs/images/logos/doc-sections/extensibility.svg diff --git a/images/logos/doc-sections/help-mono.svg b/_docs/images/logos/doc-sections/help-mono.svg similarity index 100% rename from images/logos/doc-sections/help-mono.svg rename to _docs/images/logos/doc-sections/help-mono.svg diff --git a/images/logos/doc-sections/help.svg b/_docs/images/logos/doc-sections/help.svg similarity index 100% rename from images/logos/doc-sections/help.svg rename to _docs/images/logos/doc-sections/help.svg diff --git a/images/logos/doc-sections/helpsec.svg b/_docs/images/logos/doc-sections/helpsec.svg similarity index 100% rename from images/logos/doc-sections/helpsec.svg rename to _docs/images/logos/doc-sections/helpsec.svg diff --git a/images/logos/doc-sections/home.svg b/_docs/images/logos/doc-sections/home.svg similarity index 100% rename from images/logos/doc-sections/home.svg rename to _docs/images/logos/doc-sections/home.svg diff --git a/images/logos/doc-sections/link.svg b/_docs/images/logos/doc-sections/link.svg similarity index 100% rename from images/logos/doc-sections/link.svg rename to _docs/images/logos/doc-sections/link.svg diff --git a/images/logos/doc-sections/loudspeaker.svg b/_docs/images/logos/doc-sections/loudspeaker.svg similarity index 100% rename from images/logos/doc-sections/loudspeaker.svg rename to _docs/images/logos/doc-sections/loudspeaker.svg diff --git a/images/logos/doc-sections/plus.svg b/_docs/images/logos/doc-sections/plus.svg similarity index 100% rename from images/logos/doc-sections/plus.svg rename to _docs/images/logos/doc-sections/plus.svg diff --git a/images/logos/doc-sections/plusnew.svg b/_docs/images/logos/doc-sections/plusnew.svg similarity index 100% rename from images/logos/doc-sections/plusnew.svg rename to _docs/images/logos/doc-sections/plusnew.svg diff --git a/images/logos/doc-sections/quickstart.svg b/_docs/images/logos/doc-sections/quickstart.svg similarity index 100% rename from images/logos/doc-sections/quickstart.svg rename to _docs/images/logos/doc-sections/quickstart.svg diff --git a/images/logos/doc-sections/slack.svg b/_docs/images/logos/doc-sections/slack.svg similarity index 100% rename from images/logos/doc-sections/slack.svg rename to _docs/images/logos/doc-sections/slack.svg diff --git a/images/logos/doc-sections/summary.svg b/_docs/images/logos/doc-sections/summary.svg similarity index 100% rename from images/logos/doc-sections/summary.svg rename to _docs/images/logos/doc-sections/summary.svg diff --git a/images/logos/doc-sections/team.svg b/_docs/images/logos/doc-sections/team.svg similarity index 100% rename from images/logos/doc-sections/team.svg rename to _docs/images/logos/doc-sections/team.svg diff --git a/images/logos/doc-sections/template.svg b/_docs/images/logos/doc-sections/template.svg similarity index 100% rename from images/logos/doc-sections/template.svg rename to _docs/images/logos/doc-sections/template.svg diff --git a/images/logos/intuit_blue.gif b/_docs/images/logos/intuit_blue.gif similarity index 100% rename from images/logos/intuit_blue.gif rename to _docs/images/logos/intuit_blue.gif diff --git a/images/logos/sky-logo.png b/_docs/images/logos/sky-logo.png similarity index 100% rename from images/logos/sky-logo.png rename to _docs/images/logos/sky-logo.png diff --git a/images/logos/softwire-logo.jpg b/_docs/images/logos/softwire-logo.jpg similarity index 100% rename from images/logos/softwire-logo.jpg rename to _docs/images/logos/softwire-logo.jpg diff --git a/images/logos/technology/android.svg b/_docs/images/logos/technology/android.svg similarity index 100% rename from images/logos/technology/android.svg rename to _docs/images/logos/technology/android.svg diff --git a/images/logos/technology/c.png b/_docs/images/logos/technology/c.png similarity index 100% rename from images/logos/technology/c.png rename to _docs/images/logos/technology/c.png diff --git a/images/logos/technology/cpp.png b/_docs/images/logos/technology/cpp.png similarity index 100% rename from images/logos/technology/cpp.png rename to _docs/images/logos/technology/cpp.png diff --git a/images/logos/technology/docker.svg b/_docs/images/logos/technology/docker.svg similarity index 100% rename from images/logos/technology/docker.svg rename to _docs/images/logos/technology/docker.svg diff --git a/images/logos/technology/dotnet.svg b/_docs/images/logos/technology/dotnet.svg similarity index 100% rename from images/logos/technology/dotnet.svg rename to _docs/images/logos/technology/dotnet.svg diff --git a/images/logos/technology/golang.svg b/_docs/images/logos/technology/golang.svg similarity index 100% rename from images/logos/technology/golang.svg rename to _docs/images/logos/technology/golang.svg diff --git a/images/logos/technology/gradle.svg b/_docs/images/logos/technology/gradle.svg similarity index 100% rename from images/logos/technology/gradle.svg rename to _docs/images/logos/technology/gradle.svg diff --git a/images/logos/technology/graphql.svg b/_docs/images/logos/technology/graphql.svg similarity index 100% rename from images/logos/technology/graphql.svg rename to _docs/images/logos/technology/graphql.svg diff --git a/images/logos/technology/groovy.svg b/_docs/images/logos/technology/groovy.svg similarity index 100% rename from images/logos/technology/groovy.svg rename to _docs/images/logos/technology/groovy.svg diff --git a/images/logos/technology/grpc.png b/_docs/images/logos/technology/grpc.png similarity index 100% rename from images/logos/technology/grpc.png rename to _docs/images/logos/technology/grpc.png diff --git a/images/logos/technology/helm.svg b/_docs/images/logos/technology/helm.svg similarity index 100% rename from images/logos/technology/helm.svg rename to _docs/images/logos/technology/helm.svg diff --git a/images/logos/technology/http.svg b/_docs/images/logos/technology/http.svg similarity index 100% rename from images/logos/technology/http.svg rename to _docs/images/logos/technology/http.svg diff --git a/images/logos/technology/https.svg b/_docs/images/logos/technology/https.svg similarity index 100% rename from images/logos/technology/https.svg rename to _docs/images/logos/technology/https.svg diff --git a/images/logos/technology/jar.svg b/_docs/images/logos/technology/jar.svg similarity index 100% rename from images/logos/technology/jar.svg rename to _docs/images/logos/technology/jar.svg diff --git a/images/logos/technology/java.svg b/_docs/images/logos/technology/java.svg similarity index 100% rename from images/logos/technology/java.svg rename to _docs/images/logos/technology/java.svg diff --git a/images/logos/technology/kotlin.svg b/_docs/images/logos/technology/kotlin.svg similarity index 100% rename from images/logos/technology/kotlin.svg rename to _docs/images/logos/technology/kotlin.svg diff --git a/images/logos/technology/kubernetes.svg b/_docs/images/logos/technology/kubernetes.svg similarity index 100% rename from images/logos/technology/kubernetes.svg rename to _docs/images/logos/technology/kubernetes.svg diff --git a/images/logos/technology/maven.svg b/_docs/images/logos/technology/maven.svg similarity index 100% rename from images/logos/technology/maven.svg rename to _docs/images/logos/technology/maven.svg diff --git a/images/logos/technology/micronaut.svg b/_docs/images/logos/technology/micronaut.svg similarity index 100% rename from images/logos/technology/micronaut.svg rename to _docs/images/logos/technology/micronaut.svg diff --git a/images/logos/technology/nodejs.svg b/_docs/images/logos/technology/nodejs.svg similarity index 100% rename from images/logos/technology/nodejs.svg rename to _docs/images/logos/technology/nodejs.svg diff --git a/images/logos/technology/npm.svg b/_docs/images/logos/technology/npm.svg similarity index 100% rename from images/logos/technology/npm.svg rename to _docs/images/logos/technology/npm.svg diff --git a/images/logos/technology/openshift.svg b/_docs/images/logos/technology/openshift.svg similarity index 100% rename from images/logos/technology/openshift.svg rename to _docs/images/logos/technology/openshift.svg diff --git a/images/logos/technology/php.svg b/_docs/images/logos/technology/php.svg similarity index 100% rename from images/logos/technology/php.svg rename to _docs/images/logos/technology/php.svg diff --git a/images/logos/technology/prometheus.svg b/_docs/images/logos/technology/prometheus.svg similarity index 100% rename from images/logos/technology/prometheus.svg rename to _docs/images/logos/technology/prometheus.svg diff --git a/images/logos/technology/python.svg b/_docs/images/logos/technology/python.svg similarity index 100% rename from images/logos/technology/python.svg rename to _docs/images/logos/technology/python.svg diff --git a/images/logos/technology/quarkus.svg b/_docs/images/logos/technology/quarkus.svg similarity index 100% rename from images/logos/technology/quarkus.svg rename to _docs/images/logos/technology/quarkus.svg diff --git a/images/logos/technology/ruby.svg b/_docs/images/logos/technology/ruby.svg similarity index 100% rename from images/logos/technology/ruby.svg rename to _docs/images/logos/technology/ruby.svg diff --git a/images/logos/technology/rust.svg b/_docs/images/logos/technology/rust.svg similarity index 100% rename from images/logos/technology/rust.svg rename to _docs/images/logos/technology/rust.svg diff --git a/images/logos/technology/spring.svg b/_docs/images/logos/technology/spring.svg similarity index 100% rename from images/logos/technology/spring.svg rename to _docs/images/logos/technology/spring.svg diff --git a/images/logos/technology/testcontainers.svg b/_docs/images/logos/technology/testcontainers.svg similarity index 100% rename from images/logos/technology/testcontainers.svg rename to _docs/images/logos/technology/testcontainers.svg diff --git a/images/logos/technology/webhooks.svg b/_docs/images/logos/technology/webhooks.svg similarity index 100% rename from images/logos/technology/webhooks.svg rename to _docs/images/logos/technology/webhooks.svg diff --git a/images/logos/wiremock/logo_small.svg b/_docs/images/logos/wiremock/logo_small.svg similarity index 100% rename from images/logos/wiremock/logo_small.svg rename to _docs/images/logos/wiremock/logo_small.svg diff --git a/images/logos/wiremock/logo_square.svg b/_docs/images/logos/wiremock/logo_square.svg similarity index 100% rename from images/logos/wiremock/logo_square.svg rename to _docs/images/logos/wiremock/logo_square.svg diff --git a/images/logos/wiremock/logo_wide.svg b/_docs/images/logos/wiremock/logo_wide.svg similarity index 100% rename from images/logos/wiremock/logo_wide.svg rename to _docs/images/logos/wiremock/logo_wide.svg diff --git a/images/mm-browser-mockups.png b/_docs/images/mm-browser-mockups.png similarity index 100% rename from images/mm-browser-mockups.png rename to _docs/images/mm-browser-mockups.png diff --git a/images/mm-layout-examples.png b/_docs/images/mm-layout-examples.png similarity index 100% rename from images/mm-layout-examples.png rename to _docs/images/mm-layout-examples.png diff --git a/images/mocklab/Mocklab_Logo_4x.png b/_docs/images/mocklab/Mocklab_Logo_4x.png similarity index 100% rename from images/mocklab/Mocklab_Logo_4x.png rename to _docs/images/mocklab/Mocklab_Logo_4x.png diff --git a/images/mocklab/Mocklab_Logo_4x_greyscale.png b/_docs/images/mocklab/Mocklab_Logo_4x_greyscale.png similarity index 100% rename from images/mocklab/Mocklab_Logo_4x_greyscale.png rename to _docs/images/mocklab/Mocklab_Logo_4x_greyscale.png diff --git a/images/mocklab/rest-example-stubs-screenshot.png b/_docs/images/mocklab/rest-example-stubs-screenshot.png similarity index 100% rename from images/mocklab/rest-example-stubs-screenshot.png rename to _docs/images/mocklab/rest-example-stubs-screenshot.png diff --git a/images/mocklab/stub-form-screenshot-5.png b/_docs/images/mocklab/stub-form-screenshot-5.png similarity index 100% rename from images/mocklab/stub-form-screenshot-5.png rename to _docs/images/mocklab/stub-form-screenshot-5.png diff --git a/images/openSourceRightIcon.svg b/_docs/images/openSourceRightIcon.svg similarity index 100% rename from images/openSourceRightIcon.svg rename to _docs/images/openSourceRightIcon.svg diff --git a/images/opengraphs/default.png b/_docs/images/opengraphs/default.png similarity index 100% rename from images/opengraphs/default.png rename to _docs/images/opengraphs/default.png diff --git a/images/paypalIcon.png b/_docs/images/paypalIcon.png similarity index 100% rename from images/paypalIcon.png rename to _docs/images/paypalIcon.png diff --git a/images/polygon-texture-2.jpg b/_docs/images/polygon-texture-2.jpg old mode 100755 new mode 100644 similarity index 100% rename from images/polygon-texture-2.jpg rename to _docs/images/polygon-texture-2.jpg diff --git a/images/recorder-screenshot.png b/_docs/images/recorder-screenshot.png similarity index 100% rename from images/recorder-screenshot.png rename to _docs/images/recorder-screenshot.png diff --git a/images/rightHeaderHP.png b/_docs/images/rightHeaderHP.png similarity index 100% rename from images/rightHeaderHP.png rename to _docs/images/rightHeaderHP.png diff --git a/images/screenshots/advanced-section-body-match.png b/_docs/images/screenshots/advanced-section-body-match.png similarity index 100% rename from images/screenshots/advanced-section-body-match.png rename to _docs/images/screenshots/advanced-section-body-match.png diff --git a/images/screenshots/base-url.png b/_docs/images/screenshots/base-url.png similarity index 100% rename from images/screenshots/base-url.png rename to _docs/images/screenshots/base-url.png diff --git a/images/screenshots/basic-new-stub.png b/_docs/images/screenshots/basic-new-stub.png similarity index 100% rename from images/screenshots/basic-new-stub.png rename to _docs/images/screenshots/basic-new-stub.png diff --git a/images/screenshots/basic-response.png b/_docs/images/screenshots/basic-response.png similarity index 100% rename from images/screenshots/basic-response.png rename to _docs/images/screenshots/basic-response.png diff --git a/images/screenshots/body-template-screenshot.png b/_docs/images/screenshots/body-template-screenshot.png similarity index 100% rename from images/screenshots/body-template-screenshot.png rename to _docs/images/screenshots/body-template-screenshot.png diff --git a/images/screenshots/chunked-dribble-delay.png b/_docs/images/screenshots/chunked-dribble-delay.png similarity index 100% rename from images/screenshots/chunked-dribble-delay.png rename to _docs/images/screenshots/chunked-dribble-delay.png diff --git a/images/screenshots/clone-stub-button.png b/_docs/images/screenshots/clone-stub-button.png similarity index 100% rename from images/screenshots/clone-stub-button.png rename to _docs/images/screenshots/clone-stub-button.png diff --git a/images/screenshots/default-equal-to-json.png b/_docs/images/screenshots/default-equal-to-json.png similarity index 100% rename from images/screenshots/default-equal-to-json.png rename to _docs/images/screenshots/default-equal-to-json.png diff --git a/images/screenshots/default-response-example-request.png b/_docs/images/screenshots/default-response-example-request.png similarity index 100% rename from images/screenshots/default-response-example-request.png rename to _docs/images/screenshots/default-response-example-request.png diff --git a/images/screenshots/default-response-example-response.png b/_docs/images/screenshots/default-response-example-response.png similarity index 100% rename from images/screenshots/default-response-example-response.png rename to _docs/images/screenshots/default-response-example-response.png diff --git a/images/screenshots/enable-response-templating-screenshot.png b/_docs/images/screenshots/enable-response-templating-screenshot.png similarity index 100% rename from images/screenshots/enable-response-templating-screenshot.png rename to _docs/images/screenshots/enable-response-templating-screenshot.png diff --git a/images/screenshots/enable-xml-placeholders.png b/_docs/images/screenshots/enable-xml-placeholders.png similarity index 100% rename from images/screenshots/enable-xml-placeholders.png rename to _docs/images/screenshots/enable-xml-placeholders.png diff --git a/images/screenshots/equal-to-json.png b/_docs/images/screenshots/equal-to-json.png similarity index 100% rename from images/screenshots/equal-to-json.png rename to _docs/images/screenshots/equal-to-json.png diff --git a/images/screenshots/equal-to-xml-with-placeholders.png b/_docs/images/screenshots/equal-to-xml-with-placeholders.png similarity index 100% rename from images/screenshots/equal-to-xml-with-placeholders.png rename to _docs/images/screenshots/equal-to-xml-with-placeholders.png diff --git a/images/screenshots/equal-to-xml.png b/_docs/images/screenshots/equal-to-xml.png similarity index 100% rename from images/screenshots/equal-to-xml.png rename to _docs/images/screenshots/equal-to-xml.png diff --git a/images/screenshots/export-button-on-toolbar.png b/_docs/images/screenshots/export-button-on-toolbar.png similarity index 100% rename from images/screenshots/export-button-on-toolbar.png rename to _docs/images/screenshots/export-button-on-toolbar.png diff --git a/images/screenshots/export-stubs.png b/_docs/images/screenshots/export-stubs.png similarity index 100% rename from images/screenshots/export-stubs.png rename to _docs/images/screenshots/export-stubs.png diff --git a/images/screenshots/fault-response.png b/_docs/images/screenshots/fault-response.png similarity index 100% rename from images/screenshots/fault-response.png rename to _docs/images/screenshots/fault-response.png diff --git a/images/screenshots/fixed-delay.png b/_docs/images/screenshots/fixed-delay.png similarity index 100% rename from images/screenshots/fixed-delay.png rename to _docs/images/screenshots/fixed-delay.png diff --git a/images/screenshots/header-template-screenshot.png b/_docs/images/screenshots/header-template-screenshot.png similarity index 100% rename from images/screenshots/header-template-screenshot.png rename to _docs/images/screenshots/header-template-screenshot.png diff --git a/images/screenshots/ignore-array-order.png b/_docs/images/screenshots/ignore-array-order.png similarity index 100% rename from images/screenshots/ignore-array-order.png rename to _docs/images/screenshots/ignore-array-order.png diff --git a/images/screenshots/ignore-extra-elements.png b/_docs/images/screenshots/ignore-extra-elements.png similarity index 100% rename from images/screenshots/ignore-extra-elements.png rename to _docs/images/screenshots/ignore-extra-elements.png diff --git a/images/screenshots/import-button-on-toolbar.png b/_docs/images/screenshots/import-button-on-toolbar.png similarity index 100% rename from images/screenshots/import-button-on-toolbar.png rename to _docs/images/screenshots/import-button-on-toolbar.png diff --git a/images/screenshots/import-file.png b/_docs/images/screenshots/import-file.png similarity index 100% rename from images/screenshots/import-file.png rename to _docs/images/screenshots/import-file.png diff --git a/images/screenshots/import-text.png b/_docs/images/screenshots/import-text.png similarity index 100% rename from images/screenshots/import-text.png rename to _docs/images/screenshots/import-text.png diff --git a/images/screenshots/json-placeholders.png b/_docs/images/screenshots/json-placeholders.png similarity index 100% rename from images/screenshots/json-placeholders.png rename to _docs/images/screenshots/json-placeholders.png diff --git a/images/screenshots/jsonpath-no-submatch.png b/_docs/images/screenshots/jsonpath-no-submatch.png similarity index 100% rename from images/screenshots/jsonpath-no-submatch.png rename to _docs/images/screenshots/jsonpath-no-submatch.png diff --git a/images/screenshots/jsonpath-with-submatch.png b/_docs/images/screenshots/jsonpath-with-submatch.png similarity index 100% rename from images/screenshots/jsonpath-with-submatch.png rename to _docs/images/screenshots/jsonpath-with-submatch.png diff --git a/images/screenshots/matches-json-path.png b/_docs/images/screenshots/matches-json-path.png similarity index 100% rename from images/screenshots/matches-json-path.png rename to _docs/images/screenshots/matches-json-path.png diff --git a/images/screenshots/mock-api-browser-screenshot.png b/_docs/images/screenshots/mock-api-browser-screenshot.png similarity index 100% rename from images/screenshots/mock-api-browser-screenshot.png rename to _docs/images/screenshots/mock-api-browser-screenshot.png diff --git a/images/screenshots/mock-rest-api/503-error-test-request.png b/_docs/images/screenshots/mock-rest-api/503-error-test-request.png similarity index 100% rename from images/screenshots/mock-rest-api/503-error-test-request.png rename to _docs/images/screenshots/mock-rest-api/503-error-test-request.png diff --git a/images/screenshots/mock-rest-api/503-response.png b/_docs/images/screenshots/mock-rest-api/503-response.png similarity index 100% rename from images/screenshots/mock-rest-api/503-response.png rename to _docs/images/screenshots/mock-rest-api/503-response.png diff --git a/images/screenshots/mock-rest-api/companies-list-1.png b/_docs/images/screenshots/mock-rest-api/companies-list-1.png similarity index 100% rename from images/screenshots/mock-rest-api/companies-list-1.png rename to _docs/images/screenshots/mock-rest-api/companies-list-1.png diff --git a/images/screenshots/mock-rest-api/companies-list-2.png b/_docs/images/screenshots/mock-rest-api/companies-list-2.png similarity index 100% rename from images/screenshots/mock-rest-api/companies-list-2.png rename to _docs/images/screenshots/mock-rest-api/companies-list-2.png diff --git a/images/screenshots/mock-rest-api/companies-scenario-1.png b/_docs/images/screenshots/mock-rest-api/companies-scenario-1.png similarity index 100% rename from images/screenshots/mock-rest-api/companies-scenario-1.png rename to _docs/images/screenshots/mock-rest-api/companies-scenario-1.png diff --git a/images/screenshots/mock-rest-api/companies-scenario-2.png b/_docs/images/screenshots/mock-rest-api/companies-scenario-2.png similarity index 100% rename from images/screenshots/mock-rest-api/companies-scenario-2.png rename to _docs/images/screenshots/mock-rest-api/companies-scenario-2.png diff --git a/images/screenshots/mock-rest-api/companies-scenario-state-change.png b/_docs/images/screenshots/mock-rest-api/companies-scenario-state-change.png similarity index 100% rename from images/screenshots/mock-rest-api/companies-scenario-state-change.png rename to _docs/images/screenshots/mock-rest-api/companies-scenario-state-change.png diff --git a/images/screenshots/mock-rest-api/contact-list-request.png b/_docs/images/screenshots/mock-rest-api/contact-list-request.png similarity index 100% rename from images/screenshots/mock-rest-api/contact-list-request.png rename to _docs/images/screenshots/mock-rest-api/contact-list-request.png diff --git a/images/screenshots/mock-rest-api/contact-list-response.png b/_docs/images/screenshots/mock-rest-api/contact-list-response.png similarity index 100% rename from images/screenshots/mock-rest-api/contact-list-response.png rename to _docs/images/screenshots/mock-rest-api/contact-list-response.png diff --git a/images/screenshots/mock-rest-api/contact-list-test-request.png b/_docs/images/screenshots/mock-rest-api/contact-list-test-request.png similarity index 100% rename from images/screenshots/mock-rest-api/contact-list-test-request.png rename to _docs/images/screenshots/mock-rest-api/contact-list-test-request.png diff --git a/images/screenshots/mock-rest-api/filtered-contacts-response.png b/_docs/images/screenshots/mock-rest-api/filtered-contacts-response.png similarity index 100% rename from images/screenshots/mock-rest-api/filtered-contacts-response.png rename to _docs/images/screenshots/mock-rest-api/filtered-contacts-response.png diff --git a/images/screenshots/mock-rest-api/matches-json-path.png b/_docs/images/screenshots/mock-rest-api/matches-json-path.png similarity index 100% rename from images/screenshots/mock-rest-api/matches-json-path.png rename to _docs/images/screenshots/mock-rest-api/matches-json-path.png diff --git a/images/screenshots/mock-rest-api/new-company-post.png b/_docs/images/screenshots/mock-rest-api/new-company-post.png similarity index 100% rename from images/screenshots/mock-rest-api/new-company-post.png rename to _docs/images/screenshots/mock-rest-api/new-company-post.png diff --git a/images/screenshots/mock-rest-api/new-contact-body-pattern.png b/_docs/images/screenshots/mock-rest-api/new-contact-body-pattern.png similarity index 100% rename from images/screenshots/mock-rest-api/new-contact-body-pattern.png rename to _docs/images/screenshots/mock-rest-api/new-contact-body-pattern.png diff --git a/images/screenshots/mock-rest-api/new-contact-post-stub.png b/_docs/images/screenshots/mock-rest-api/new-contact-post-stub.png similarity index 100% rename from images/screenshots/mock-rest-api/new-contact-post-stub.png rename to _docs/images/screenshots/mock-rest-api/new-contact-post-stub.png diff --git a/images/screenshots/mock-rest-api/new-contact-postman-mismatch.png b/_docs/images/screenshots/mock-rest-api/new-contact-postman-mismatch.png similarity index 100% rename from images/screenshots/mock-rest-api/new-contact-postman-mismatch.png rename to _docs/images/screenshots/mock-rest-api/new-contact-postman-mismatch.png diff --git a/images/screenshots/mock-rest-api/query-parameter-match.png b/_docs/images/screenshots/mock-rest-api/query-parameter-match.png similarity index 100% rename from images/screenshots/mock-rest-api/query-parameter-match.png rename to _docs/images/screenshots/mock-rest-api/query-parameter-match.png diff --git a/images/screenshots/mock-rest-api/raised-priority.png b/_docs/images/screenshots/mock-rest-api/raised-priority.png similarity index 100% rename from images/screenshots/mock-rest-api/raised-priority.png rename to _docs/images/screenshots/mock-rest-api/raised-priority.png diff --git a/images/screenshots/mock-rest-api/rest-api-template.png b/_docs/images/screenshots/mock-rest-api/rest-api-template.png similarity index 100% rename from images/screenshots/mock-rest-api/rest-api-template.png rename to _docs/images/screenshots/mock-rest-api/rest-api-template.png diff --git a/images/screenshots/mock-rest-api/single-contact-request.png b/_docs/images/screenshots/mock-rest-api/single-contact-request.png similarity index 100% rename from images/screenshots/mock-rest-api/single-contact-request.png rename to _docs/images/screenshots/mock-rest-api/single-contact-request.png diff --git a/images/screenshots/mock-rest-api/single-contact-response.png b/_docs/images/screenshots/mock-rest-api/single-contact-response.png similarity index 100% rename from images/screenshots/mock-rest-api/single-contact-response.png rename to _docs/images/screenshots/mock-rest-api/single-contact-response.png diff --git a/images/screenshots/mock-rest-api/templated-contact-request.png b/_docs/images/screenshots/mock-rest-api/templated-contact-request.png similarity index 100% rename from images/screenshots/mock-rest-api/templated-contact-request.png rename to _docs/images/screenshots/mock-rest-api/templated-contact-request.png diff --git a/images/screenshots/mock-rest-api/templated-contact-response.png b/_docs/images/screenshots/mock-rest-api/templated-contact-response.png similarity index 100% rename from images/screenshots/mock-rest-api/templated-contact-response.png rename to _docs/images/screenshots/mock-rest-api/templated-contact-response.png diff --git a/images/screenshots/mock-rest-api/templated-contact-test-request.png b/_docs/images/screenshots/mock-rest-api/templated-contact-test-request.png similarity index 100% rename from images/screenshots/mock-rest-api/templated-contact-test-request.png rename to _docs/images/screenshots/mock-rest-api/templated-contact-test-request.png diff --git a/images/screenshots/multiple-xpath-soap-match.png b/_docs/images/screenshots/multiple-xpath-soap-match.png similarity index 100% rename from images/screenshots/multiple-xpath-soap-match.png rename to _docs/images/screenshots/multiple-xpath-soap-match.png diff --git a/images/screenshots/new-body-pattern-button.png b/_docs/images/screenshots/new-body-pattern-button.png similarity index 100% rename from images/screenshots/new-body-pattern-button.png rename to _docs/images/screenshots/new-body-pattern-button.png diff --git a/images/screenshots/new-header-button.png b/_docs/images/screenshots/new-header-button.png similarity index 100% rename from images/screenshots/new-header-button.png rename to _docs/images/screenshots/new-header-button.png diff --git a/images/screenshots/new-mock-api-button.png b/_docs/images/screenshots/new-mock-api-button.png similarity index 100% rename from images/screenshots/new-mock-api-button.png rename to _docs/images/screenshots/new-mock-api-button.png diff --git a/images/screenshots/new-stub-button.png b/_docs/images/screenshots/new-stub-button.png similarity index 100% rename from images/screenshots/new-stub-button.png rename to _docs/images/screenshots/new-stub-button.png diff --git a/images/screenshots/new-to-do-item-field.png b/_docs/images/screenshots/new-to-do-item-field.png similarity index 100% rename from images/screenshots/new-to-do-item-field.png rename to _docs/images/screenshots/new-to-do-item-field.png diff --git a/images/screenshots/plain-proxy-response.png b/_docs/images/screenshots/plain-proxy-response.png similarity index 100% rename from images/screenshots/plain-proxy-response.png rename to _docs/images/screenshots/plain-proxy-response.png diff --git a/images/screenshots/postman-empty-api.png b/_docs/images/screenshots/postman-empty-api.png similarity index 100% rename from images/screenshots/postman-empty-api.png rename to _docs/images/screenshots/postman-empty-api.png diff --git a/images/screenshots/postman.png b/_docs/images/screenshots/postman.png similarity index 100% rename from images/screenshots/postman.png rename to _docs/images/screenshots/postman.png diff --git a/images/screenshots/proxy-all-by-default-stub.png b/_docs/images/screenshots/proxy-all-by-default-stub.png similarity index 100% rename from images/screenshots/proxy-all-by-default-stub.png rename to _docs/images/screenshots/proxy-all-by-default-stub.png diff --git a/images/screenshots/random-lognormal-delay.png b/_docs/images/screenshots/random-lognormal-delay.png similarity index 100% rename from images/screenshots/random-lognormal-delay.png rename to _docs/images/screenshots/random-lognormal-delay.png diff --git a/images/screenshots/random-uniform-delay.png b/_docs/images/screenshots/random-uniform-delay.png similarity index 100% rename from images/screenshots/random-uniform-delay.png rename to _docs/images/screenshots/random-uniform-delay.png diff --git a/images/screenshots/record-button-screenshot.png b/_docs/images/screenshots/record-button-screenshot.png similarity index 100% rename from images/screenshots/record-button-screenshot.png rename to _docs/images/screenshots/record-button-screenshot.png diff --git a/images/screenshots/record-dialog-screenshot-3.png b/_docs/images/screenshots/record-dialog-screenshot-3.png similarity index 100% rename from images/screenshots/record-dialog-screenshot-3.png rename to _docs/images/screenshots/record-dialog-screenshot-3.png diff --git a/images/screenshots/request-parameters.png b/_docs/images/screenshots/request-parameters.png similarity index 100% rename from images/screenshots/request-parameters.png rename to _docs/images/screenshots/request-parameters.png diff --git a/images/screenshots/response-headers.png b/_docs/images/screenshots/response-headers.png similarity index 100% rename from images/screenshots/response-headers.png rename to _docs/images/screenshots/response-headers.png diff --git a/images/screenshots/scenario-reset-button.png b/_docs/images/screenshots/scenario-reset-button.png similarity index 100% rename from images/screenshots/scenario-reset-button.png rename to _docs/images/screenshots/scenario-reset-button.png diff --git a/images/screenshots/scenario-single-item-stub-request.png b/_docs/images/screenshots/scenario-single-item-stub-request.png similarity index 100% rename from images/screenshots/scenario-single-item-stub-request.png rename to _docs/images/screenshots/scenario-single-item-stub-request.png diff --git a/images/screenshots/scenario-single-item-stub-response.png b/_docs/images/screenshots/scenario-single-item-stub-response.png similarity index 100% rename from images/screenshots/scenario-single-item-stub-response.png rename to _docs/images/screenshots/scenario-single-item-stub-response.png diff --git a/images/screenshots/scenarios-empty-list-stub-request.png b/_docs/images/screenshots/scenarios-empty-list-stub-request.png similarity index 100% rename from images/screenshots/scenarios-empty-list-stub-request.png rename to _docs/images/screenshots/scenarios-empty-list-stub-request.png diff --git a/images/screenshots/scenarios-empty-list-stub-response.png b/_docs/images/screenshots/scenarios-empty-list-stub-response.png similarity index 100% rename from images/screenshots/scenarios-empty-list-stub-response.png rename to _docs/images/screenshots/scenarios-empty-list-stub-response.png diff --git a/images/screenshots/scenarios-post-item-stub.png b/_docs/images/screenshots/scenarios-post-item-stub.png similarity index 100% rename from images/screenshots/scenarios-post-item-stub.png rename to _docs/images/screenshots/scenarios-post-item-stub.png diff --git a/images/screenshots/soap-action-header.png b/_docs/images/screenshots/soap-action-header.png similarity index 100% rename from images/screenshots/soap-action-header.png rename to _docs/images/screenshots/soap-action-header.png diff --git a/images/screenshots/soap-placeholders.png b/_docs/images/screenshots/soap-placeholders.png similarity index 100% rename from images/screenshots/soap-placeholders.png rename to _docs/images/screenshots/soap-placeholders.png diff --git a/images/screenshots/soap-request.png b/_docs/images/screenshots/soap-request.png similarity index 100% rename from images/screenshots/soap-request.png rename to _docs/images/screenshots/soap-request.png diff --git a/images/screenshots/soap-response.png b/_docs/images/screenshots/soap-response.png similarity index 100% rename from images/screenshots/soap-response.png rename to _docs/images/screenshots/soap-response.png diff --git a/images/screenshots/start-button-screenshot.png b/_docs/images/screenshots/start-button-screenshot.png similarity index 100% rename from images/screenshots/start-button-screenshot.png rename to _docs/images/screenshots/start-button-screenshot.png diff --git a/images/screenshots/stop-button-screenshot.png b/_docs/images/screenshots/stop-button-screenshot.png similarity index 100% rename from images/screenshots/stop-button-screenshot.png rename to _docs/images/screenshots/stop-button-screenshot.png diff --git a/images/screenshots/templated-proxy-response.png b/_docs/images/screenshots/templated-proxy-response.png similarity index 100% rename from images/screenshots/templated-proxy-response.png rename to _docs/images/screenshots/templated-proxy-response.png diff --git a/images/screenshots/to-do-bad-post-stub-request.png b/_docs/images/screenshots/to-do-bad-post-stub-request.png similarity index 100% rename from images/screenshots/to-do-bad-post-stub-request.png rename to _docs/images/screenshots/to-do-bad-post-stub-request.png diff --git a/images/screenshots/to-do-bad-post-stub-response.png b/_docs/images/screenshots/to-do-bad-post-stub-response.png similarity index 100% rename from images/screenshots/to-do-bad-post-stub-response.png rename to _docs/images/screenshots/to-do-bad-post-stub-response.png diff --git a/images/screenshots/to-do-error-page.png b/_docs/images/screenshots/to-do-error-page.png similarity index 100% rename from images/screenshots/to-do-error-page.png rename to _docs/images/screenshots/to-do-error-page.png diff --git a/images/screenshots/to-do-list-app.png b/_docs/images/screenshots/to-do-list-app.png similarity index 100% rename from images/screenshots/to-do-list-app.png rename to _docs/images/screenshots/to-do-list-app.png diff --git a/images/screenshots/to-do-list-success-message.png b/_docs/images/screenshots/to-do-list-success-message.png similarity index 100% rename from images/screenshots/to-do-list-success-message.png rename to _docs/images/screenshots/to-do-list-success-message.png diff --git a/images/screenshots/to-do-post-stub-request.png b/_docs/images/screenshots/to-do-post-stub-request.png similarity index 100% rename from images/screenshots/to-do-post-stub-request.png rename to _docs/images/screenshots/to-do-post-stub-request.png diff --git a/images/screenshots/to-do-post-stub-response.png b/_docs/images/screenshots/to-do-post-stub-response.png similarity index 100% rename from images/screenshots/to-do-post-stub-response.png rename to _docs/images/screenshots/to-do-post-stub-response.png diff --git a/images/screenshots/to-do-post-stub.png b/_docs/images/screenshots/to-do-post-stub.png similarity index 100% rename from images/screenshots/to-do-post-stub.png rename to _docs/images/screenshots/to-do-post-stub.png diff --git a/images/screenshots/to-do-request-log.png b/_docs/images/screenshots/to-do-request-log.png similarity index 100% rename from images/screenshots/to-do-request-log.png rename to _docs/images/screenshots/to-do-request-log.png diff --git a/images/screenshots/to-do-stub-old.png b/_docs/images/screenshots/to-do-stub-old.png similarity index 100% rename from images/screenshots/to-do-stub-old.png rename to _docs/images/screenshots/to-do-stub-old.png diff --git a/images/screenshots/to-do-stub-request.png b/_docs/images/screenshots/to-do-stub-request.png similarity index 100% rename from images/screenshots/to-do-stub-request.png rename to _docs/images/screenshots/to-do-stub-request.png diff --git a/images/screenshots/to-do-stub-response.png b/_docs/images/screenshots/to-do-stub-response.png similarity index 100% rename from images/screenshots/to-do-stub-response.png rename to _docs/images/screenshots/to-do-stub-response.png diff --git a/images/screenshots/to-do-stub.png b/_docs/images/screenshots/to-do-stub.png similarity index 100% rename from images/screenshots/to-do-stub.png rename to _docs/images/screenshots/to-do-stub.png diff --git a/images/screenshots/url-match-type.png b/_docs/images/screenshots/url-match-type.png similarity index 100% rename from images/screenshots/url-match-type.png rename to _docs/images/screenshots/url-match-type.png diff --git a/images/screenshots/url-path-and-query.png b/_docs/images/screenshots/url-path-and-query.png similarity index 100% rename from images/screenshots/url-path-and-query.png rename to _docs/images/screenshots/url-path-and-query.png diff --git a/images/screenshots/url-path-matching.png b/_docs/images/screenshots/url-path-matching.png similarity index 100% rename from images/screenshots/url-path-matching.png rename to _docs/images/screenshots/url-path-matching.png diff --git a/images/screenshots/wiremock-folder-drop.png b/_docs/images/screenshots/wiremock-folder-drop.png similarity index 100% rename from images/screenshots/wiremock-folder-drop.png rename to _docs/images/screenshots/wiremock-folder-drop.png diff --git a/images/screenshots/xpath-body-match.png b/_docs/images/screenshots/xpath-body-match.png similarity index 100% rename from images/screenshots/xpath-body-match.png rename to _docs/images/screenshots/xpath-body-match.png diff --git a/images/screenshots/xpath-soap-match.png b/_docs/images/screenshots/xpath-soap-match.png similarity index 100% rename from images/screenshots/xpath-soap-match.png rename to _docs/images/screenshots/xpath-soap-match.png diff --git a/images/separatorLine.png b/_docs/images/separatorLine.png similarity index 100% rename from images/separatorLine.png rename to _docs/images/separatorLine.png diff --git a/images/signupModalRobot.png b/_docs/images/signupModalRobot.png similarity index 100% rename from images/signupModalRobot.png rename to _docs/images/signupModalRobot.png diff --git a/images/slack-logo-medium.png b/_docs/images/slack-logo-medium.png similarity index 100% rename from images/slack-logo-medium.png rename to _docs/images/slack-logo-medium.png diff --git a/images/slackIcon.svg b/_docs/images/slackIcon.svg similarity index 100% rename from images/slackIcon.svg rename to _docs/images/slackIcon.svg diff --git a/images/small-json-idea-shot.png b/_docs/images/small-json-idea-shot.png similarity index 100% rename from images/small-json-idea-shot.png rename to _docs/images/small-json-idea-shot.png diff --git a/images/solutions/graphql/wiremock_graphql_opengraph.png b/_docs/images/solutions/graphql/wiremock_graphql_opengraph.png similarity index 100% rename from images/solutions/graphql/wiremock_graphql_opengraph.png rename to _docs/images/solutions/graphql/wiremock_graphql_opengraph.png diff --git a/images/solutions/grpc/header.png b/_docs/images/solutions/grpc/header.png similarity index 100% rename from images/solutions/grpc/header.png rename to _docs/images/solutions/grpc/header.png diff --git a/images/solutions/grpc/intro_schema.png b/_docs/images/solutions/grpc/intro_schema.png similarity index 100% rename from images/solutions/grpc/intro_schema.png rename to _docs/images/solutions/grpc/intro_schema.png diff --git a/images/solutions/grpc/wiremock-grpc-opengraph.png b/_docs/images/solutions/grpc/wiremock-grpc-opengraph.png similarity index 100% rename from images/solutions/grpc/wiremock-grpc-opengraph.png rename to _docs/images/solutions/grpc/wiremock-grpc-opengraph.png diff --git a/images/solutions/testcontainers/testcontainers_c_logo_square.png b/_docs/images/solutions/testcontainers/testcontainers_c_logo_square.png similarity index 100% rename from images/solutions/testcontainers/testcontainers_c_logo_square.png rename to _docs/images/solutions/testcontainers/testcontainers_c_logo_square.png diff --git a/images/solutions/testcontainers/testcontainers_c_logo_wide.png b/_docs/images/solutions/testcontainers/testcontainers_c_logo_wide.png similarity index 100% rename from images/solutions/testcontainers/testcontainers_c_logo_wide.png rename to _docs/images/solutions/testcontainers/testcontainers_c_logo_wide.png diff --git a/images/solutions/testcontainers/testcontainers_c_opengraph.png b/_docs/images/solutions/testcontainers/testcontainers_c_opengraph.png similarity index 100% rename from images/solutions/testcontainers/testcontainers_c_opengraph.png rename to _docs/images/solutions/testcontainers/testcontainers_c_opengraph.png diff --git a/images/studioRightIcon.svg b/_docs/images/studioRightIcon.svg similarity index 100% rename from images/studioRightIcon.svg rename to _docs/images/studioRightIcon.svg diff --git a/images/twitterIcon.svg b/_docs/images/twitterIcon.svg similarity index 100% rename from images/twitterIcon.svg rename to _docs/images/twitterIcon.svg diff --git a/images/ui-bg_glass_20_555555_1x400.png b/_docs/images/ui-bg_glass_20_555555_1x400.png similarity index 100% rename from images/ui-bg_glass_20_555555_1x400.png rename to _docs/images/ui-bg_glass_20_555555_1x400.png diff --git a/images/ui-bg_glass_40_7E8AA2_1x400.png b/_docs/images/ui-bg_glass_40_7E8AA2_1x400.png similarity index 100% rename from images/ui-bg_glass_40_7E8AA2_1x400.png rename to _docs/images/ui-bg_glass_40_7E8AA2_1x400.png diff --git a/images/ui-bg_glass_40_ffc73d_1x400.png b/_docs/images/ui-bg_glass_40_ffc73d_1x400.png similarity index 100% rename from images/ui-bg_glass_40_ffc73d_1x400.png rename to _docs/images/ui-bg_glass_40_ffc73d_1x400.png diff --git a/images/ui-bg_gloss-wave_25_333333_500x100.png b/_docs/images/ui-bg_gloss-wave_25_333333_500x100.png similarity index 100% rename from images/ui-bg_gloss-wave_25_333333_500x100.png rename to _docs/images/ui-bg_gloss-wave_25_333333_500x100.png diff --git a/images/ui-bg_highlight-soft_80_eeeeee_1x100.png b/_docs/images/ui-bg_highlight-soft_80_eeeeee_1x100.png similarity index 100% rename from images/ui-bg_highlight-soft_80_eeeeee_1x100.png rename to _docs/images/ui-bg_highlight-soft_80_eeeeee_1x100.png diff --git a/images/ui-bg_inset-soft_25_000000_1x100.png b/_docs/images/ui-bg_inset-soft_25_000000_1x100.png similarity index 100% rename from images/ui-bg_inset-soft_25_000000_1x100.png rename to _docs/images/ui-bg_inset-soft_25_000000_1x100.png diff --git a/images/ui-bg_inset-soft_30_FF9800_1x100.png b/_docs/images/ui-bg_inset-soft_30_FF9800_1x100.png similarity index 100% rename from images/ui-bg_inset-soft_30_FF9800_1x100.png rename to _docs/images/ui-bg_inset-soft_30_FF9800_1x100.png diff --git a/images/ui-icons_222222_256x240.png b/_docs/images/ui-icons_222222_256x240.png similarity index 100% rename from images/ui-icons_222222_256x240.png rename to _docs/images/ui-icons_222222_256x240.png diff --git a/images/ui-icons_4b8e0b_256x240.png b/_docs/images/ui-icons_4b8e0b_256x240.png similarity index 100% rename from images/ui-icons_4b8e0b_256x240.png rename to _docs/images/ui-icons_4b8e0b_256x240.png diff --git a/images/ui-icons_a83300_256x240.png b/_docs/images/ui-icons_a83300_256x240.png similarity index 100% rename from images/ui-icons_a83300_256x240.png rename to _docs/images/ui-icons_a83300_256x240.png diff --git a/images/ui-icons_cccccc_256x240.png b/_docs/images/ui-icons_cccccc_256x240.png similarity index 100% rename from images/ui-icons_cccccc_256x240.png rename to _docs/images/ui-icons_cccccc_256x240.png diff --git a/images/ui-icons_ffffff_256x240.png b/_docs/images/ui-icons_ffffff_256x240.png similarity index 100% rename from images/ui-icons_ffffff_256x240.png rename to _docs/images/ui-icons_ffffff_256x240.png diff --git a/images/verification-exception.png b/_docs/images/verification-exception.png similarity index 100% rename from images/verification-exception.png rename to _docs/images/verification-exception.png diff --git a/images/wiremock-cloud/wiremock_cloud_favicon.svg b/_docs/images/wiremock-cloud/wiremock_cloud_favicon.svg similarity index 100% rename from images/wiremock-cloud/wiremock_cloud_favicon.svg rename to _docs/images/wiremock-cloud/wiremock_cloud_favicon.svg diff --git a/images/wiremock-cloud/wiremock_cloud_logo.png b/_docs/images/wiremock-cloud/wiremock_cloud_logo.png similarity index 100% rename from images/wiremock-cloud/wiremock_cloud_logo.png rename to _docs/images/wiremock-cloud/wiremock_cloud_logo.png diff --git a/images/wiremock-cloud/wiremock_cloud_logo.svg b/_docs/images/wiremock-cloud/wiremock_cloud_logo.svg similarity index 100% rename from images/wiremock-cloud/wiremock_cloud_logo.svg rename to _docs/images/wiremock-cloud/wiremock_cloud_logo.svg diff --git a/images/wiremock-idea-shots.png b/_docs/images/wiremock-idea-shots.png similarity index 100% rename from images/wiremock-idea-shots.png rename to _docs/images/wiremock-idea-shots.png diff --git a/images/wiremockBYUP9.png b/_docs/images/wiremockBYUP9.png similarity index 100% rename from images/wiremockBYUP9.png rename to _docs/images/wiremockBYUP9.png diff --git a/images/wiremockDashboard.png b/_docs/images/wiremockDashboard.png similarity index 100% rename from images/wiremockDashboard.png rename to _docs/images/wiremockDashboard.png diff --git a/images/wiremockRobot.png b/_docs/images/wiremockRobot.png similarity index 100% rename from images/wiremockRobot.png rename to _docs/images/wiremockRobot.png diff --git a/images/wiremockRobotBG.png b/_docs/images/wiremockRobotBG.png similarity index 100% rename from images/wiremockRobotBG.png rename to _docs/images/wiremockRobotBG.png diff --git a/images/wiremockStudioLeft.png b/_docs/images/wiremockStudioLeft.png similarity index 100% rename from images/wiremockStudioLeft.png rename to _docs/images/wiremockStudioLeft.png diff --git a/images/wiremockStudioRight.png b/_docs/images/wiremockStudioRight.png similarity index 100% rename from images/wiremockStudioRight.png rename to _docs/images/wiremockStudioRight.png diff --git a/images/wiremockTypeExample.svg b/_docs/images/wiremockTypeExample.svg similarity index 100% rename from images/wiremockTypeExample.svg rename to _docs/images/wiremockTypeExample.svg diff --git a/images/wm-concept-01.svg b/_docs/images/wm-concept-01.svg similarity index 98% rename from images/wm-concept-01.svg rename to _docs/images/wm-concept-01.svg index f9fd5100..c686885f 100644 --- a/images/wm-concept-01.svg +++ b/_docs/images/wm-concept-01.svg @@ -1,58 +1,58 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_docs/index.html b/_docs/index.html index e380cdbf..d3c2d44a 100644 --- a/_docs/index.html +++ b/_docs/index.html @@ -69,21 +69,21 @@

Getting Started

- + Overview Quick Start - + Download - + Get Help
@@ -99,15 +99,15 @@

Distributions

- + Standalone JAR - + Docker - + Helm (Experimental) Distributions target="_blank" > WireMock Cloud (commercial SaaS) - + NPM
@@ -136,14 +136,14 @@

By use-case

Wiremock Features Advanced request matching wiremock dynamic response Dynamic response templating @@ -151,21 +151,21 @@

By use-case

wiremock unit tests Use API Mocking in your unit tests wiremock fault and latency Fault and latency injection wiremock record playback Record / Playback @@ -178,14 +178,14 @@

By use-case

-->
WireMock API Templates Use pre-defined Mock API templates Extending WireMock Extending WireMock @@ -202,19 +202,19 @@

By protocol

@@ -228,91 +228,91 @@

By technology

- + Java and JVM - + Python - + Spring Boot Node.js Android .NET Golang Rust Groovy Kotlin Kubernetes Testcontainers Quarkus C/C++ diff --git a/_docs/overview.md b/_docs/overview.md index b0342301..6e2ffad3 100644 --- a/_docs/overview.md +++ b/_docs/overview.md @@ -1,5 +1,4 @@ --- -layout: docs title: Overview meta_title: WireMock Overview and Basics toc_rank: 1 diff --git a/images/navigation/loudspeaker.svg b/images/navigation/loudspeaker.svg new file mode 100644 index 00000000..80352dc3 --- /dev/null +++ b/images/navigation/loudspeaker.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/images/wiremockStudioDashboard.png b/images/studio/wiremockStudioDashboard.png similarity index 100% rename from images/wiremockStudioDashboard.png rename to images/studio/wiremockStudioDashboard.png diff --git a/index.html b/index.html index 84a0a719..155dcbba 100644 --- a/index.html +++ b/index.html @@ -134,7 +134,7 @@

  Join us for Hacktoberfest 2023!

diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..60ca865f --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,224 @@ +site_name: WireMock Documentation +site_description: >- + WireMock Documentation. +copyright: Copyright © 2023 - WireMock Contributors +docs_dir: _docs + +# Build +site_dir: _site-docs + + +theme: + name: material + highlightjs: true + features: + - announce.dismiss + - content.action.edit + - content.action.view + - content.code.annotate + - content.code.copy + # - content.code.select + # - content.tabs.link + - content.tooltips + # - header.autohide + # - navigation.expand + - navigation.footer + # NOT compatible qith toc.integrate + # - navigation.indexes + - navigation.path + # - navigation.instant + # - navigation.instant.prefetch + # - navigation.instant.progress + # - navigation.prune + - navigation.sections + - navigation.expand + #- navigation.tabs + # - navigation.tabs.sticky + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + - toc.integrate + font: + text: DM Sans + code: Roboto Mono + favicon: images/logos/wiremock/logo_small.svg + logo: images/logos/wiremock/logo_wide.svg + +extra: + social: + - icon: fontawesome/brands/slack + link: https://slack.wiremock.org/ + name: WireMock Community Slack + - icon: fontawesome/brands/twitter + link: https://twitter.com/wiremockorg + name: WireMock on Twitter + - icon: fontawesome/brands/linkedin + link: https://www.linkedin.com/company/wiremock/ + name: WireMock on LinkedIn + - icon: fontawesome/brands/mastodon + link: https://fosstodon.org/@wiremock + name: WireMock on Fosstodon + + +extra_css: + - assets/css/wiremock.css + +plugins: + - search + - multirepo: + # TODO: Change to True once works + cleanup: false + keep_docs_dir: false + nav_repos: + - name: graphql + import_url: 'https://github.com/wiremock/wiremock-graphql-extension?branch=main&edit_uri=/blob/main/' + imports: [ /README.md, docs/* ] + - name: grpc + import_url: 'https://github.com/wiremock/wiremock-grpc-extension?branch=main&edit_uri=/blob/main/' + imports: [ /README.md, docs/* ] + - name: state + import_url: 'https://github.com/wiremock/wiremock-extension-state?branch=develop&edit_uri=/blob/develop/' + imports: [ /README.md, docs/* ] + + + # Outside WireMock GitHub org + - name: 9cookies + import_url: 'https://github.com/9cookies/wiremock-extensions?branch=master&edit_uri=/blob/master/' + imports: [ /*.md ] + - name: jwt + import_url: 'https://github.com/MasonM/wiremock-jwt-extension?branch=master&edit_uri=/blob/master/' + imports: [ /README.md ] + - name: cors + import_url: 'https://github.com/RichieLoco/WiremockCorsExtension?branch=master&edit_uri=/blob/master/' + imports: [ /README.md ] + - name: stub-mapping-tracker + import_url: 'https://github.com/MasonM/wiremock-stub-mapping-tracker?branch=master&edit_uri=/blob/master/' + imports: [ /README.md ] + - name: prometheus + import_url: 'https://github.com/mikeskali/wiremock-metrics?branch=master&edit_uri=/blob/master/' + imports: [ /README.md ] + - name: record-delay + import_url: 'https://github.com/anuragashok/wiremock-extension-record-delay?branch=main&edit_uri=/blob/main/' + imports: [ /README.md ] + + # System + - name: community + import_url: 'https://github.com/wiremock/community?branch=main&edit_uri=/blob/main/' + imports: [ contributing/* ] + - name: dotgithub + import_url: 'https://github.com/wiremock/.github?branch=main&edit_uri=/blob/main/' + imports: [ CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md ] + + +nav: + - Getting started: +# link: /docs/overview + - overview + - quickstart/java-junit + - download-and-installation + - getting-started + - faq + + - WireMock Standalone: + # link: /docs/standalone + - standalone/docker + - standalone/java-jar + - standalone/administration + + - Java Usage: + # link: /docs/solutions/jvm/ + - junit-jupiter + - junit-extensions + - spring-boot + - java-usage + - configuration + - running-without-http-server + - android + + - Stubbing & Verifying: + #link: /docs/stubbing + - stubbing + - request-matching + - response-templating + - simulating-faults + - stateful-behaviour + - proxying + - verifying + + - Templating: + # link: /docs/mock-api-templates + - mock-api-templates + - mock-api-templates/usage + + - Record & Playback: + #link: /docs/record-playback/ + - record-playback + + - Protocols: + - webhooks-and-callbacks + - grpc + - solutions/graphql + - https + + - Advanced use-cases: + - multi-domain-mocking + - advanced/deploy-to-servlet-container + - advanced/java7 + + - Extensibility: + # link: /docs/extending-wiremock/ + - extending-wiremock + - extensibility/filtering-requests + - extensibility/transforming-responses + - extensibility/custom-matching + - extensibility/listening-for-serve-events + - extensibility/extending-the-admin-api + - extensibility/adding-template-helpers + - extensibility/adding-template-model-data + - extensibility/listening-for-stub-changes + - extensibility/listening-for-settings-changes + - extensibility/adding-mappings-loader + - stub-metadata + + - Reference: + # pages: + - standalone/admin-api-reference + - mock-api-templates + + - Extensions: + - Features: + - gRPC: grpc/README.md + - GraphQL: graphql/README.md + - Response Template Transformer: wiremock/_docs/response-templating.md + - State: state/README.md + - Webhooks: wiremock/_docs/webhooks-and-callbacks.md + + # Outside WireMock GitHub org + - CORS protection: cors/README.md + - JSON Web Tokens (JWT): jwt/README.md + - JSON Body Transformer: 9cookies/json-body-transformer.md + - Request Time Matcher: 9cookies/request-time-matcher.md + + - Operations Extensions: + - Prometheus Metrics: prometheus/README.md + + - Developer Extensions: + - Callback Simulator: 9cookies/callback-simulator.md + - Keywords: 9cookies/keywords.md + - Stub Mapping Tracker: stub-mapping-tracker/README.md + - Record Delay Capture: record-delay/README.md + + - General: + Security: dotgithub/SECURITY.md + + - Contributing: + - Contributor Guide: community/contributing/README.md + - Hacktoberfest 2023: dotgithub/CONTRIBUTING.md + - Creating Extensions: wiremock/_docs/extending-wiremock.md + - Code of Conduct: dotgithub/CODE_OF_CONDUCT.md + + + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..9b94f78a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,23 @@ +Markdown==3.5 +MarkupSafe==2.1.3 +mergedeep==1.3.4 +mkdocs==1.5.3 +mkdocs-multirepo-plugin==0.6.3 +mkdocs-material==9.4.5 +click==8.1.7 +dacite==1.8.1 +ghp-import==2.1.0 +jinja2==3.1.2 +mypy-extensions==1.0.0 +packaging==23.2 +pathspec==0.11.2 +platformdirs==3.11.0 +python-dateutil==2.8.2 +python-slugify==8.0.1 +pyyaml==6.0.1 +pyyaml-env-tag==0.1 +six==1.16.0 +text-unidecode==1.3 +typing-extensions==4.8.0 +typing-inspect==0.8.0 +watchdog==3.0.0 From 1ada9d1e0c307540164ead944e2a3238dfa29b65 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 22:01:38 +0100 Subject: [PATCH 02/71] Restore images also included in the docs --- _docs/images/faultIcon.svg | 16 ++++++++++++++++ _docs/images/recordIcon.svg | 12 ++++++++++++ _docs/images/requestIcon.svg | 4 ++++ _docs/images/responseIcon.svg | 17 +++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 _docs/images/faultIcon.svg create mode 100644 _docs/images/recordIcon.svg create mode 100644 _docs/images/requestIcon.svg create mode 100644 _docs/images/responseIcon.svg diff --git a/_docs/images/faultIcon.svg b/_docs/images/faultIcon.svg new file mode 100644 index 00000000..b3744027 --- /dev/null +++ b/_docs/images/faultIcon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/_docs/images/recordIcon.svg b/_docs/images/recordIcon.svg new file mode 100644 index 00000000..50b8a2d0 --- /dev/null +++ b/_docs/images/recordIcon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_docs/images/requestIcon.svg b/_docs/images/requestIcon.svg new file mode 100644 index 00000000..8d8c253d --- /dev/null +++ b/_docs/images/requestIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_docs/images/responseIcon.svg b/_docs/images/responseIcon.svg new file mode 100644 index 00000000..114c7214 --- /dev/null +++ b/_docs/images/responseIcon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From cce3fc37155bec2e701b38c70565ca876d9424f7 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 22:15:24 +0100 Subject: [PATCH 03/71] Add code tabs --- _docs/stubbing.md | 104 ++++++++++++++++++++-------------------------- mkdocs.yml | 21 +++++++--- 2 files changed, 61 insertions(+), 64 deletions(-) diff --git a/_docs/stubbing.md b/_docs/stubbing.md index eb72e0c3..232debff 100644 --- a/_docs/stubbing.md +++ b/_docs/stubbing.md @@ -25,73 +25,61 @@ when the relative URL exactly matches `/some/thing` (including query parameters) The body of the response will be "Hello world!" and a `Content-Type` header will be sent with a value of `text-plain`. -{% codetabs %} +=== "JSON" -{% codetab JSON %} + ```json + { + "request": { + "method": "GET", + "url": "/some/thing" + }, -```json -{ - "request": { - "method": "GET", - "url": "/some/thing" - }, - - "response": { - "status": 200, - "body": "Hello, world!", - "headers": { - "Content-Type": "text/plain" + "response": { + "status": 200, + "body": "Hello, world!", + "headers": { + "Content-Type": "text/plain" + } } - } -} -``` - -{% endcodetab %} - -{% codetab Java %} + } + ``` -```java -@Test -public void exactUrlOnly() { - stubFor(get(urlEqualTo("/some/thing")) - .willReturn(aResponse() - .withHeader("Content-Type", "text/plain") - .withBody("Hello world!"))); +=== "Java" - assertThat(testClient.get("/some/thing").statusCode(), is(200)); - assertThat(testClient.get("/some/thing/else").statusCode(), is(404)); -} -``` + ```java + @Test + public void exactUrlOnly() { + stubFor(get(urlEqualTo("/some/thing")) + .willReturn(aResponse() + .withHeader("Content-Type", "text/plain") + .withBody("Hello world!"))); -{% endcodetab %} + assertThat(testClient.get("/some/thing").statusCode(), is(200)); + assertThat(testClient.get("/some/thing/else").statusCode(), is(404)); + } + ``` -{% codetab Python %} +=== "Python" -```python -Mappings.create_mapping( - Mapping( - request=MappingRequest(method=HttpMethods.GET, url="/some/thing"), - response=MappingResponse(status=200, body="Hello, world!", headers=("Content-Type", "text/plain")), + ```python + Mappings.create_mapping( + Mapping( + request=MappingRequest(method=HttpMethods.GET, url="/some/thing"), + response=MappingResponse(status=200, body="Hello, world!", headers=("Content-Type", "text/plain")), + ) ) -) -``` - -{% endcodetab %} - -{% codetab Golang %} - -```go -wiremockClient.StubFor(wiremock.Get(wiremock.URLPathEqualTo("/some/thing")). - WillReturnResponse( - wiremock.NewResponse(). - WithStatus(http.StatusOK). - WithBody("Hello, world!"). - WithHeader("Content-Type", "text/plain"))) -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` + +=== "Golang" + + ```go + wiremockClient.StubFor(wiremock.Get(wiremock.URLPathEqualTo("/some/thing")). + WillReturnResponse( + wiremock.NewResponse(). + WithStatus(http.StatusOK). + WithBody("Hello, world!"). + WithHeader("Content-Type", "text/plain"))) + ``` In Java, if you'd prefer to use slightly more BDDish language in your tests, you can replace `stubFor` with `givenThat`. diff --git a/mkdocs.yml b/mkdocs.yml index 60ca865f..e78bc73f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -17,8 +17,8 @@ theme: - content.action.view - content.code.annotate - content.code.copy - # - content.code.select - # - content.tabs.link + - content.code.select + - content.tabs.link - content.tooltips # - header.autohide # - navigation.expand @@ -71,7 +71,7 @@ plugins: - multirepo: # TODO: Change to True once works cleanup: false - keep_docs_dir: false + keep_docs_dir: true nav_repos: - name: graphql import_url: 'https://github.com/wiremock/wiremock-graphql-extension?branch=main&edit_uri=/blob/main/' @@ -212,7 +212,7 @@ nav: - Record Delay Capture: record-delay/README.md - General: - Security: dotgithub/SECURITY.md + - Security: dotgithub/SECURITY.md - Contributing: - Contributor Guide: community/contributing/README.md @@ -220,5 +220,14 @@ nav: - Creating Extensions: wiremock/_docs/extending-wiremock.md - Code of Conduct: dotgithub/CODE_OF_CONDUCT.md - - \ No newline at end of file + # Markdown +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true From 286a8116ec8034aeb0d6cbc08773fbc8b49f56e0 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 22:53:03 +0100 Subject: [PATCH 04/71] Migrate code tabs to the native MkDocs engine --- CONTRIBUTING.md | 12 +- _docs/download-and-installation.md | 46 +- _docs/extensibility/custom-matching.md | 92 ++-- _docs/extensibility/transforming-responses.md | 111 ++-- _docs/junit-jupiter.md | 158 +++--- _docs/quickstart/java-junit.md | 54 +- _docs/solutions/testcontainers.md | 188 ++++--- _docs/stub-metadata.md | 140 +++-- _docs/stubbing.md | 480 ++++++++---------- mkdocs.yml | 13 +- 10 files changed, 561 insertions(+), 733 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7aa5e072..4d6019d9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,15 +38,13 @@ and they will be included into the main release line. To reduce vertical space and provide examples by multiple technology stacks, we added support for code tabs in the documentation. -It is a custom Jekyll plugin providing the `{% codetabs %}` macro in Markdown. See the example here: https://wiremock.org/docs/stubbing/ . Example: ```markdown - {% codetabs %} - {% codetab JSON %} +=== "JSON" ```json { @@ -64,9 +62,8 @@ Example: } ``` - {% endcodetab %} - {% codetab Java %} +=== "Java" ```java @Test @@ -77,14 +74,9 @@ Example: } ``` - {% endcodetab %} - - {% endcodetabs %} ``` - When editing the existing code, make sure to also copy-edit text around it to ensure consistency. -Example of a patch: [PR #165 - Code tabs in stubbing overview](https://github.com/wiremock/wiremock.org/pull/165). ## Preparing the developer environment diff --git a/_docs/download-and-installation.md b/_docs/download-and-installation.md index 6c7fa81a..c65f3691 100644 --- a/_docs/download-and-installation.md +++ b/_docs/download-and-installation.md @@ -34,39 +34,29 @@ conflicting versions of its dependencies. The standalone JAR is also runnable (s Run the following in a terminal: -{% codetabs %} +=== "Docker" -{% codetab Docker %} + ```bash + docker run -it --rm -p 8080:8080 --name wiremock \ + wiremock/wiremock:{{ site.wiremock_version }} + ``` -```bash -docker run -it --rm -p 8080:8080 --name wiremock \ - wiremock/wiremock:{{ site.wiremock_version }} -``` +=== "Maven" -{% endcodetab %} + ```xml + + org.wiremock + wiremock-standalone + {{ site.wiremock_version }} + test + + ``` -{% codetab Maven %} +=== "Gradle Groovy" -```xml - - org.wiremock - wiremock-standalone - {{ site.wiremock_version }} - test - -``` - -{% endcodetab %} - -{% codetab Gradle Groovy %} - -```groovy -testImplementation "org.wiremock:wiremock-standalone:{{ site.wiremock_version }}" -``` - -{% endcodetab %} - -{% endcodetabs %} + ```groovy + testImplementation "org.wiremock:wiremock-standalone:{{ site.wiremock_version }}" + ``` Learn more in the [Docker guide](../docker). diff --git a/_docs/extensibility/custom-matching.md b/_docs/extensibility/custom-matching.md index 5099bde6..ba30bb95 100644 --- a/_docs/extensibility/custom-matching.md +++ b/_docs/extensibility/custom-matching.md @@ -70,38 +70,30 @@ public class BodyLengthMatcher extends RequestMatcherExtension { Then define a stub with it: -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(requestMatching("body-too-long", Parameters.one("maxLength", 2048)) - .willReturn(aResponse().withStatus(422))); -``` - -{% endcodetab %} - -{% codetab JSON %} - -```json -{ - "request": { - "customMatcher": { - "name": "body-too-long", - "parameters": { - "maxLength": 2048 +=== "Java" + + ```java + stubFor(requestMatching("body-too-long", Parameters.one("maxLength", 2048)) + .willReturn(aResponse().withStatus(422))); + ``` + +=== "JSON" + + ```json + { + "request": { + "customMatcher": { + "name": "body-too-long", + "parameters": { + "maxLength": 2048 + } } + }, + "response": { + "status": 422 } - }, - "response": { - "status": 422 } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ### Combining standard and custom request matchers @@ -118,9 +110,7 @@ WireMock server. An exception will be thrown if attempting to use an inline cust Custom matchers defined as extensions can also be combined with standard matchers. -{% codetabs %} - -{% codetab Java %} +=== "Java" ```java stubFor(get(urlPathMatching("/the/.*/one")) @@ -128,28 +118,22 @@ stubFor(get(urlPathMatching("/the/.*/one")) .willReturn(ok())); ``` -{% endcodetab %} - -{% codetab JSON %} - -```json -{ - "request": { - "urlPathPattern": "/the/.*/one", - "method": "GET", - "customMatcher": { - "name": "path-contains-param", - "parameters": { - "path": "correct" +=== "JSON" + + ```json + { + "request": { + "urlPathPattern": "/the/.*/one", + "method": "GET", + "customMatcher": { + "name": "path-contains-param", + "parameters": { + "path": "correct" + } } + }, + "response": { + "status": 200 } - }, - "response": { - "status": 200 } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` diff --git a/_docs/extensibility/transforming-responses.md b/_docs/extensibility/transforming-responses.md index cdf2f503..521f1358 100644 --- a/_docs/extensibility/transforming-responses.md +++ b/_docs/extensibility/transforming-responses.md @@ -64,42 +64,34 @@ intend to register them via an instance as described below. Parameters are supplied on a per stub mapping basis: -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(get(urlEqualTo("/transform")).willReturn( - aResponse() - .withTransformerParameter("newValue", 66) - .withTransformerParameter("inner", ImmutableMap.of("thing", "value")))); // ImmutableMap is from Guava, but any Map will do -``` - -{% endcodetab %} - -{% codetab JSON %} - -```json -{ - "request": { - "url": "/transform", - "method": "GET" - }, - "response": { - "status": 200, - "transformerParameters": { - "newValue": 66, - "inner": { - "thing": "value" +=== "Java" + + ```java + stubFor(get(urlEqualTo("/transform")).willReturn( + aResponse() + .withTransformerParameter("newValue", 66) + .withTransformerParameter("inner", ImmutableMap.of("thing", "value")))); // ImmutableMap is from Guava, but any Map will do + ``` + +=== "JSON" + + ```json + { + "request": { + "url": "/transform", + "method": "GET" + }, + "response": { + "status": 200, + "transformerParameters": { + "newValue": 66, + "inner": { + "thing": "value" + } } } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ### Non-global transformations @@ -116,37 +108,30 @@ public boolean applyGlobally() { Then you add the transformation to specific stubs via its name: -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(get(urlEqualTo("/local-transform")).willReturn(aResponse() - .withStatus(200) - .withBody("Original body") - .withTransformers("my-transformer", "other-transformer"))); -``` - -{% endcodetab %} - -{% codetab JSON %} - -```json -{ - "request": { - "method": "GET", - "url": "/local-transform" - }, - "response": { - "status": 200, - "body": "Original body", - "transformers": ["my-transformer", "other-transformer"] +=== "Java" + + ```java + stubFor(get(urlEqualTo("/local-transform")).willReturn(aResponse() + .withStatus(200) + .withBody("Original body") + .withTransformers("my-transformer", "other-transformer"))); + ``` + +=== "JSON" + + ```json + { + "request": { + "method": "GET", + "url": "/local-transform" + }, + "response": { + "status": 200, + "body": "Original body", + "transformers": ["my-transformer", "other-transformer"] + } } -} -``` -{% endcodetab %} - -{% endcodetabs %} + ``` The Java API also has a convenience method for adding transformers and parameters in one call: diff --git a/_docs/junit-jupiter.md b/_docs/junit-jupiter.md index 2645fb75..e48e4860 100644 --- a/_docs/junit-jupiter.md +++ b/_docs/junit-jupiter.md @@ -174,91 +174,83 @@ HTTP client honours the JVM's proxy system properties, you can specify different Proxy mode can be enabled via the extension builder when using the programmatic form. -{% codetabs %} - -{% codetab Declarative %} - -```java -@WireMockTest(proxyMode = true) -public class JUnitJupiterExtensionJvmProxyDeclarativeTest { - - CloseableHttpClient client; - - @BeforeEach - void init() { - client = HttpClientBuilder.create() - .useSystemProperties() // This must be enabled for auto proxy config - .build(); - } - - @Test - void configures_jvm_proxy_and_enables_browser_proxying() throws Exception { - stubFor(get("/things") - .withHost(equalTo("one.my.domain")) - .willReturn(ok("1"))); - - stubFor(get("/things") - .withHost(equalTo("two.my.domain")) - .willReturn(ok("2"))); - - assertThat(getContent("http://one.my.domain/things"), is("1")); - assertThat(getContent("http://two.my.domain/things"), is("2")); - } - - private String getContent(String url) throws Exception { - try (CloseableHttpResponse response = client.execute(new HttpGet(url))) { - return EntityUtils.toString(response.getEntity()); +=== "Declarative" + + ```java + @WireMockTest(proxyMode = true) + public class JUnitJupiterExtensionJvmProxyDeclarativeTest { + + CloseableHttpClient client; + + @BeforeEach + void init() { + client = HttpClientBuilder.create() + .useSystemProperties() // This must be enabled for auto proxy config + .build(); + } + + @Test + void configures_jvm_proxy_and_enables_browser_proxying() throws Exception { + stubFor(get("/things") + .withHost(equalTo("one.my.domain")) + .willReturn(ok("1"))); + + stubFor(get("/things") + .withHost(equalTo("two.my.domain")) + .willReturn(ok("2"))); + + assertThat(getContent("http://one.my.domain/things"), is("1")); + assertThat(getContent("http://two.my.domain/things"), is("2")); + } + + private String getContent(String url) throws Exception { + try (CloseableHttpResponse response = client.execute(new HttpGet(url))) { + return EntityUtils.toString(response.getEntity()); + } + } } - } -} -``` - -{% endcodetab %} - -{% codetab Programmatic %} - -```java -public class JUnitJupiterProgrammaticProxyTest { - - @RegisterExtension - static WireMockExtension wm = WireMockExtension.newInstance() - .proxyMode(true) - .build(); - - CloseableHttpClient client; - - @BeforeEach - void init() { - client = HttpClientBuilder.create() - .useSystemProperties() // This must be enabled for auto proxy config - .build(); - } - - @Test - void configures_jvm_proxy_and_enables_browser_proxying() throws Exception { - wm.stubFor(get("/things") - .withHost(equalTo("one.my.domain")) - .willReturn(ok("1"))); - - wm.stubFor(get("/things") - .withHost(equalTo("two.my.domain")) - .willReturn(ok("2"))); - - assertThat(getContent("http://one.my.domain/things"), is("1")); - assertThat(getContent("http://two.my.domain/things"), is("2")); - } - - private String getContent(String url) throws Exception { - try (CloseableHttpResponse response = client.execute(new HttpGet(url))) { - return EntityUtils.toString(response.getEntity()); + ``` + +=== "Programmatic" + + ```java + public class JUnitJupiterProgrammaticProxyTest { + + @RegisterExtension + static WireMockExtension wm = WireMockExtension.newInstance() + .proxyMode(true) + .build(); + + CloseableHttpClient client; + + @BeforeEach + void init() { + client = HttpClientBuilder.create() + .useSystemProperties() // This must be enabled for auto proxy config + .build(); + } + + @Test + void configures_jvm_proxy_and_enables_browser_proxying() throws Exception { + wm.stubFor(get("/things") + .withHost(equalTo("one.my.domain")) + .willReturn(ok("1"))); + + wm.stubFor(get("/things") + .withHost(equalTo("two.my.domain")) + .willReturn(ok("2"))); + + assertThat(getContent("http://one.my.domain/things"), is("1")); + assertThat(getContent("http://two.my.domain/things"), is("2")); + } + + private String getContent(String url) throws Exception { + try (CloseableHttpResponse response = client.execute(new HttpGet(url))) { + return EntityUtils.toString(response.getEntity()); + } + } } - } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Subclassing the extension diff --git a/_docs/quickstart/java-junit.md b/_docs/quickstart/java-junit.md index d9bc384a..b4a0578d 100644 --- a/_docs/quickstart/java-junit.md +++ b/_docs/quickstart/java-junit.md @@ -26,37 +26,29 @@ To send the requests, we will use the embedded HTTP client available in Java 11+ If you want to add a Java 1.8 test, you will need to add an external HTTP Client implementation like [Apache HttpClient](https://hc.apache.org/httpcomponents-client-5.2.x/#). -{% codetabs %} - -{% codetab Maven %} - -```xml - - org.wiremock - wiremock - {{ site.wiremock_version }} - test - - - org.assertj - assertj-core - 3.24.2 - test - -``` - -{% endcodetab %} - -{% codetab Gradle Groovy %} - -```groovy -testImplementation "org.wiremock:wiremock:{{ site.wiremock_version }}" -testImplementation "org.assertj:assertj-core:3.24.2" -``` - -{% endcodetab %} - -{% endcodetabs %} +=== "Maven" + + ```xml + + org.wiremock + wiremock + {{ site.wiremock_version }} + test + + + org.assertj + assertj-core + 3.24.2 + test + + ``` + +=== "Gradle Groovy" + + ```groovy + testImplementation "org.wiremock:wiremock:{{ site.wiremock_version }}" + testImplementation "org.assertj:assertj-core:3.24.2" + ``` ## Add the WireMock rule diff --git a/_docs/solutions/testcontainers.md b/_docs/solutions/testcontainers.md index c1d5f83b..6c9c0c81 100644 --- a/_docs/solutions/testcontainers.md +++ b/_docs/solutions/testcontainers.md @@ -76,105 +76,95 @@ Node.js, Rust, Haskell, Ruby, etc. Examples of using the Testcontainers Modules for different languages and Testcontainers modules: -{% codetabs %} - -{% codetab Java %} - -```java -import org.junit.jupiter.api.*; -import org.testcontainers.junit.jupiter.*; -import org.wiremock.integrations.testcontainers.testsupport.http.*; -import static org.assertj.core.api.Assertions.assertThat; - -@Testcontainers -class WireMockContainerJunit5Test { - - @Container - WireMockContainer wiremockServer = new WireMockContainer("2.35.0") - .withMapping("hello", WireMockContainerJunit5Test.class, "hello-world.json"); - - @Test - void helloWorld() throws Exception { - String url = wiremockServer.getUrl("/hello"); - HttpResponse response = new TestHttpClient().get(url); - assertThat(response.getBody()) - .as("Wrong response body") - .contains("Hello, world!"); +=== "Java" + + ```java + import org.junit.jupiter.api.*; + import org.testcontainers.junit.jupiter.*; + import org.wiremock.integrations.testcontainers.testsupport.http.*; + import static org.assertj.core.api.Assertions.assertThat; + + @Testcontainers + class WireMockContainerJunit5Test { + + @Container + WireMockContainer wiremockServer = new WireMockContainer("2.35.0") + .withMapping("hello", WireMockContainerJunit5Test.class, "hello-world.json"); + + @Test + void helloWorld() throws Exception { + String url = wiremockServer.getUrl("/hello"); + HttpResponse response = new TestHttpClient().get(url); + assertThat(response.getBody()) + .as("Wrong response body") + .contains("Hello, world!"); + } } -} -``` - -{% endcodetab %} - -{% codetab Python %} - -```python -import pytest -from wiremock.testing.testcontainer import wiremock_container - -@pytest.fixture(scope="session") # (1) -def wm_server(): - with wiremock_container(secure=False) as wm: - Config.base_url = wm.get_url("__admin") # (2)= - Mappings.create_mapping( - Mapping( - request=MappingRequest(method=HttpMethods.GET, url="/hello"), - response=MappingResponse(status=200, body="hello"), - persistent=False, - ) - ) # (3) - yield wm - -def test_get_hello_world(wm_server): # (4) - resp1 = requests.get(wm_server.get_url("/hello"), verify=False) - assert resp1.status_code == 200 - assert resp1.content == b"hello" -``` - -{% endcodetab %} - -{% codetab Golang %} - -```golang -package testcontainers_wiremock_quickstart - -import ( - "context" - "testing" - - . "github.com/wiremock/wiremock-testcontainers-go" -) - -func TestWireMock(t *testing.T) { - ctx := context.Background() - mappingFileName := "hello-world.json" - - container, err := RunContainerAndStopOnCleanup(ctx, t, - WithMappingFile(mappingFileName), - ) - if err != nil { - t.Fatal(err) - } - - statusCode, out, err := SendHttpGet(container, "/hello", nil) - if err != nil { - t.Fatal(err, "Failed to get a response") - } - - // Verify the response - if statusCode != 200 { - t.Fatalf("expected HTTP-200 but got %d", statusCode) - } - - if string(out) != "Hello, world!" { - t.Fatalf("expected 'Hello, world!' but got %s", out) - } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` + +=== "Python" + + ```python + import pytest + from wiremock.testing.testcontainer import wiremock_container + + @pytest.fixture(scope="session") # (1) + def wm_server(): + with wiremock_container(secure=False) as wm: + Config.base_url = wm.get_url("__admin") # (2)= + Mappings.create_mapping( + Mapping( + request=MappingRequest(method=HttpMethods.GET, url="/hello"), + response=MappingResponse(status=200, body="hello"), + persistent=False, + ) + ) # (3) + yield wm + + def test_get_hello_world(wm_server): # (4) + resp1 = requests.get(wm_server.get_url("/hello"), verify=False) + assert resp1.status_code == 200 + assert resp1.content == b"hello" + ``` + +=== "Golang" + + ```golang + package testcontainers_wiremock_quickstart + + import ( + "context" + "testing" + + . "github.com/wiremock/wiremock-testcontainers-go" + ) + + func TestWireMock(t *testing.T) { + ctx := context.Background() + mappingFileName := "hello-world.json" + + container, err := RunContainerAndStopOnCleanup(ctx, t, + WithMappingFile(mappingFileName), + ) + if err != nil { + t.Fatal(err) + } + + statusCode, out, err := SendHttpGet(container, "/hello", nil) + if err != nil { + t.Fatal(err, "Failed to get a response") + } + + // Verify the response + if statusCode != 200 { + t.Fatalf("expected HTTP-200 but got %d", statusCode) + } + + if string(out) != "Hello, world!" { + t.Fatalf("expected 'Hello, world!' but got %s", out) + } + } + ``` ## Coming soon @@ -183,8 +173,6 @@ A lot more features can be implemented in the listed modules, and any contributions are welcome! If you are interested, join us on the [community Slack](http://slack.wiremock.org/). -## Learn More - ## References - Devoxx BE talk on API Integration testing with Testcontainers and WireMock, diff --git a/_docs/stub-metadata.md b/_docs/stub-metadata.md index 4fbc1295..4cb6e579 100644 --- a/_docs/stub-metadata.md +++ b/_docs/stub-metadata.md @@ -12,111 +12,87 @@ It is possible to attach arbitrary metadata to stub mappings, which can be later Data under the `metadata` key is a JSON object (represented in Java by a `Map`). It can be added to a stub mapping on creation. -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(get("/with-metadata") - .withMetadata(metadata() - .attr("singleItem", 1234) - .list("listItem", 1, 2, 3, 4) - .attr("nestedObject", metadata() - .attr("innerItem", "Hello") - ) -)); -``` - -{% endcodetab %} - -{% codetab JSON %} - -```json -{ - "request": { - "url": "/with-metadata" - }, - "response": { - "status": 200 - }, - - "metadata": { - "singleItem": 1234, - "listItem": [1, 2, 3, 4], - "nestedObject": { - "innerItem": "Hello" +=== "Java" + + ```java + stubFor(get("/with-metadata") + .withMetadata(metadata() + .attr("singleItem", 1234) + .list("listItem", 1, 2, 3, 4) + .attr("nestedObject", metadata() + .attr("innerItem", "Hello") + ) + )); + ``` + +=== "JSON" + + ```json + { + "request": { + "url": "/with-metadata" + }, + "response": { + "status": 200 + }, + + "metadata": { + "singleItem": 1234, + "listItem": [1, 2, 3, 4], + "nestedObject": { + "innerItem": "Hello" + } } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Search for stubs by metadata Stubs can be found by matching against their metadata using the same matching strategies as when [matching HTTP requests](../request-matching/). The most useful matcher for this is `matchesJsonPath`: -{% codetabs %} - -{% codetab Java %} +=== "Java" -```java -List stubs = - findStubsByMetadata(matchingJsonPath("$.singleItem", containing("123"))); -``` + ```java + List stubs = + findStubsByMetadata(matchingJsonPath("$.singleItem", containing("123"))); + ``` -{% endcodetab %} +=== "JSON" -{% codetab JSON %} + ```json + POST /__admin/mappings/find-by-metadata -```json -POST /__admin/mappings/find-by-metadata - -{ - "matchesJsonPath" : { - "expression" : "$.singleItem", - "contains" : "123" + { + "matchesJsonPath" : { + "expression" : "$.singleItem", + "contains" : "123" + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Remove stubs by metadata Similarly, stubs with matching metadata can be removed: -{% codetabs %} - -{% codetab Java %} - -```java -removeStubsByMetadata(matchingJsonPath("$.singleItem", containing("123"))); -``` +=== "Java" -{% endcodetab %} + ```java + removeStubsByMetadata(matchingJsonPath("$.singleItem", containing("123"))); + ``` -{% codetab JSON %} +=== "JSON" -POST /__admin/mappings/remove-by-metadata + POST /__admin/mappings/remove-by-metadata -```json -{ - "matchesJsonPath" : { - "expression" : "$.singleItem", - "contains" : "123" + ```json + { + "matchesJsonPath" : { + "expression" : "$.singleItem", + "contains" : "123" + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Remove request journal events by metadata diff --git a/_docs/stubbing.md b/_docs/stubbing.md index 232debff..dc66b4b5 100644 --- a/_docs/stubbing.md +++ b/_docs/stubbing.md @@ -129,44 +129,36 @@ you want the stub mapping to match on any request method. In addition to the status code, the status message can optionally also be set. -{% codetabs %} - -{% codetab Java %} - -```java -@Test -public void statusMessage() { - stubFor(get(urlEqualTo("/some/thing")) - .willReturn(aResponse() - .withStatus(200) - .withStatusMessage("Everything was just fine!") - .withHeader("Content-Type", "text/plain"))); - - assertThat(testClient.get("/some/thing").statusCode(), is(200)); - assertThat(testClient.get("/some/thing/else").statusCode(), is(404)); -} -``` - -{% endcodetab %} +=== "Java" -{% codetab JSON %} + ```java + @Test + public void statusMessage() { + stubFor(get(urlEqualTo("/some/thing")) + .willReturn(aResponse() + .withStatus(200) + .withStatusMessage("Everything was just fine!") + .withHeader("Content-Type", "text/plain"))); -```json -{ - "request": { - "method": "GET", - "url": "/some/thing" - }, - "response": { - "status": 200, - "statusMessage": "Everything was just fine!" + assertThat(testClient.get("/some/thing").statusCode(), is(200)); + assertThat(testClient.get("/some/thing/else").statusCode(), is(404)); } -} -``` + ``` -{% endcodetab %} +=== "JSON" -{% endcodetabs %} + ```json + { + "request": { + "method": "GET", + "url": "/some/thing" + }, + "response": { + "status": 200, + "statusMessage": "Everything was just fine!" + } + } + ``` ## Stub priority @@ -180,42 +172,34 @@ One example of this might be where you want to define a catch-all stub for any URL that doesn't match any more specific cases. Adding a priority to a stub mapping facilitates this: -{% codetabs %} - -{% codetab Java %} +=== "Java" -```java -//Catch-all case -stubFor(get(urlMatching("/api/.*")).atPriority(5) - .willReturn(aResponse().withStatus(401))); - -//Specific case -stubFor(get(urlEqualTo("/api/specific-resource")).atPriority(1) //1 is highest - .willReturn(aResponse() - .withStatus(200) - .withBody("Resource state"))); -``` + ```java + //Catch-all case + stubFor(get(urlMatching("/api/.*")).atPriority(5) + .willReturn(aResponse().withStatus(401))); -{% endcodetab %} + //Specific case + stubFor(get(urlEqualTo("/api/specific-resource")).atPriority(1) //1 is highest + .willReturn(aResponse() + .withStatus(200) + .withBody("Resource state"))); + ``` -{% codetab Json %} +=== "JSON" -```json -{ - "priority": 1, - "request": { - "method": "GET", - "url": "/api/specific-resource" - }, - "response": { - "status": 200 + ```json + { + "priority": 1, + "request": { + "method": "GET", + "url": "/api/specific-resource" + }, + "response": { + "status": 200 + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` When unspecified, stubs default to a priority of `5`[^](https://github.com/wiremock/wiremock/blob/master/src/main/java/com/github/tomakehurst/wiremock/stubbing/StubMapping.java#L37) where `1` is the highest priority and Java `Integer.MAX_VALUE` (i.e., `2147483647`) is the minimum priority. @@ -223,80 +207,64 @@ When unspecified, stubs default to a priority of `5`[^](https://githu In addition to matching on request headers, it's also possible to send response headers. -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(get(urlEqualTo("/whatever")) - .willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withHeader("Set-Cookie", "session_id=91837492837") - .withHeader("Set-Cookie", "split_test_group=B") // You can call withHeader more than once for the same header if multiple values are required - .withHeader("Cache-Control", "no-cache"))); -``` +=== "Java" -{% endcodetab %} + ```java + stubFor(get(urlEqualTo("/whatever")) + .willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withHeader("Set-Cookie", "session_id=91837492837") + .withHeader("Set-Cookie", "split_test_group=B") // You can call withHeader more than once for the same header if multiple values are required + .withHeader("Cache-Control", "no-cache"))); + ``` -{% codetab JSON %} +=== "JSON" -```json -{ - "request": { - "method": "GET", - "url": "/whatever" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "text/plain", - "Set-Cookie": ["session_id=91837492837", "split_test_group=B"], - "Cache-Control": "no-cache" + ```json + { + "request": { + "method": "GET", + "url": "/whatever" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "text/plain", + "Set-Cookie": ["session_id=91837492837", "split_test_group=B"], + "Cache-Control": "no-cache" + } } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Specifying the response body The simplest way to specify a response body is as a string literal. -{% codetabs %} - -{% codetab Java %} +=== "Java" %}" -```java -stubFor(get(urlEqualTo("/body")) - .willReturn(aResponse() - .withBody("Literal text to put in the body"))); -``` - -{% endcodetab %} + ```java + stubFor(get(urlEqualTo("/body")) + .willReturn(aResponse() + .withBody("Literal text to put in the body"))); + ``` -{% codetab JSON %} +=== "JSON" -```json -{ - "request": { - "method": "GET", - "url": "/body" - }, - "response": { - "status": 200, - "body": "Literal text to put in the body" + ```json + { + "request": { + "method": "GET", + "url": "/body" + }, + "response": { + "status": 200, + "body": "Literal text to put in the body" + } } -} ``` -{% endcodetab %} - -{% endcodetabs %} - If you're specifying a JSON body via the JSON API, you can avoid having to escape it like this: ```json @@ -315,9 +283,7 @@ under the current directory in which the server was started. To make your stub use the file, simply call `bodyFile()` on the response builder with the file's path relative to `__files`: -{% codetabs %} - -{% codetab Java %} +=== "Java" ```java stubFor(get(urlEqualTo("/body-file")) @@ -325,26 +291,20 @@ stubFor(get(urlEqualTo("/body-file")) .withBodyFile("path/to/myfile.xml"))); ``` -{% endcodetab %} - -{% codetab JSON %} +=== "JSON" -```json -{ - "request": { - "method": "GET", - "url": "/body-file" - }, - "response": { - "status": 200, - "bodyFileName": "path/to/myfile.xml" + ```json + { + "request": { + "method": "GET", + "url": "/body-file" + }, + "response": { + "status": 200, + "bodyFileName": "path/to/myfile.xml" + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` > **note** > @@ -362,36 +322,28 @@ overloaded `body()` in Java. JSON API accepts this as a base64 string (to avoid stupidly long JSON documents): -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(get(urlEqualTo("/binary-body")) - .willReturn(aResponse() - .withBody(new byte[] { 1, 2, 3, 4 }))); -``` +=== "Java" -{% endcodetab %} + ```java + stubFor(get(urlEqualTo("/binary-body")) + .willReturn(aResponse() + .withBody(new byte[] { 1, 2, 3, 4 }))); + ``` -{% codetab JSON %} +=== "JSON" -```json -{ - "request": { - "method": "GET", - "url": "/binary-body" - }, - "response": { - "status": 200, - "base64Body": "WUVTIElOREVFRCE=" + ```json + { + "request": { + "method": "GET", + "url": "/binary-body" + }, + "response": { + "status": 200, + "base64Body": "WUVTIElOREVFRCE=" + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Default response for unmapped requests @@ -399,42 +351,34 @@ When a request cannot be mapped to a response, Wiremock returns an HTML response It is possible to customize the response by catching all URLs with a low priority. -{% codetabs %} - -{% codetab Java %} - -```java -stubFor(any(anyUrl()) - .atPriority(10) - .willReturn(aResponse() - .withStatus(404) - .withBody("{\"status\":\"Error\",\"message\":\"Endpoint not found\"}"))); -``` +=== "Java" -{% endcodetab %} + ```java + stubFor(any(anyUrl()) + .atPriority(10) + .willReturn(aResponse() + .withStatus(404) + .withBody("{\"status\":\"Error\",\"message\":\"Endpoint not found\"}"))); + ``` -{% codetab JSON %} +=== "JSON" -```json -{ - "priority": 10, - "request": { - "method": "ANY", - "urlPattern": ".*" - }, - "response": { - "status": 404, - "jsonBody": { "status": "Error", "message": "Endpoint not found" }, - "headers": { - "Content-Type": "application/json" + ```json + { + "priority": 10, + "request": { + "method": "ANY", + "urlPattern": ".*" + }, + "response": { + "status": 404, + "jsonBody": { "status": "Error", "message": "Endpoint not found" }, + "headers": { + "Content-Type": "application/json" + } } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## Saving stubs @@ -452,45 +396,37 @@ In Java, Existing stub mappings can be modified, provided they have been assigne To do the equivalent via the JSON API, `PUT` the edited stub mapping to `/__admin/mappings/{id}` -{% codetabs %} - -{% codetab Java %} - -```java -wireMockServer.stubFor(get(urlEqualTo("/edit-this")) - .withId(id) - .willReturn(aResponse() - .withBody("Original"))); +=== "Java" -assertThat(testClient.get("/edit-this").content(), is("Original")); + ```java + wireMockServer.stubFor(get(urlEqualTo("/edit-this")) + .withId(id) + .willReturn(aResponse() + .withBody("Original"))); -wireMockServer.editStub(get(urlEqualTo("/edit-this")) - .withId(id) - .willReturn(aResponse() - .withBody("Modified"))); + assertThat(testClient.get("/edit-this").content(), is("Original")); -assertThat(testClient.get("/edit-this").content(), is("Modified")); -``` + wireMockServer.editStub(get(urlEqualTo("/edit-this")) + .withId(id) + .willReturn(aResponse() + .withBody("Modified"))); -{% endcodetab %} + assertThat(testClient.get("/edit-this").content(), is("Modified")); + ``` -{% codetab JSON %} +=== "JSON" -```json -{ - "request": { - "urlPath": "/edit-me", - "method": "ANY" - }, - "response": { - "status": 200 + ```json + { + "request": { + "urlPath": "/edit-me", + "method": "ANY" + }, + "response": { + "status": 200 + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ## File serving @@ -557,57 +493,49 @@ In Java, Multiple stubs can be imported in one call. The equivalent can be carried out Via the JSON API, `POST` the to `/__admin/mappings/import`: -{% codetabs %} - -{% codetab Java %} - -```java -WireMock.importStubs(stubImport() - .stub(get("/one").willReturn(ok())) - .stub(post("/two").willReturn(ok("Body content"))) - .stub(put("/three").willReturn(ok())) - .ignoreExisting() - .deleteAllExistingStubsNotInImport()); -``` +=== "Java" -{% endcodetab %} + ```java + WireMock.importStubs(stubImport() + .stub(get("/one").willReturn(ok())) + .stub(post("/two").willReturn(ok("Body content"))) + .stub(put("/three").willReturn(ok())) + .ignoreExisting() + .deleteAllExistingStubsNotInImport()); + ``` -{% codetab JSON %} +=== "JSON" -```json -{ - "mappings": [ - { - "request": { - "method": "GET", - "url": "/one" - }, - "response": { - "status": 200 - } - }, - { - "id": "8c5db8b0-2db4-4ad7-a99f-38c9b00da3f7", - "request": { - "url": "/two" + ```json + { + "mappings": [ + { + "request": { + "method": "GET", + "url": "/one" + }, + "response": { + "status": 200 + } }, - "response": { - "status": 200, - "body": "Body content" + { + "id": "8c5db8b0-2db4-4ad7-a99f-38c9b00da3f7", + "request": { + "url": "/two" + }, + "response": { + "status": 200, + "body": "Body content" + } } - } - ], + ], - "importOptions": { - "duplicatePolicy": "IGNORE", - "deleteAllNotInImport": true + "importOptions": { + "duplicatePolicy": "IGNORE", + "deleteAllNotInImport": true + } } -} -``` - -{% endcodetab %} - -{% endcodetabs %} + ``` ### Existing stubs policy diff --git a/mkdocs.yml b/mkdocs.yml index e78bc73f..aa9868fd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -115,13 +115,14 @@ plugins: nav: - Getting started: + - Overview: overview + - "Quick Start: API Mocking with Java and JUnit 4": quickstart/java-junit + - Download and Installation: download-and-installation + - WireMock Tutorials: getting-started + - FAQ: faq + # link: /docs/overview - - overview - - quickstart/java-junit - - download-and-installation - - getting-started - - faq - + - WireMock Standalone: # link: /docs/standalone - standalone/docker From 94e4b6abfbe8816c4b683bd7cbe5699a30a3abbd Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 22:59:53 +0100 Subject: [PATCH 05/71] Workaround missing navigation entries --- mkdocs.yml | 81 +++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index aa9868fd..59413489 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -125,69 +125,68 @@ nav: - WireMock Standalone: # link: /docs/standalone - - standalone/docker - - standalone/java-jar - - standalone/administration + - Running in Docker: standalone/docker + - Running as a Standalone Process: standalone/java-jar + - Administration API: standalone/administration - Java Usage: # link: /docs/solutions/jvm/ - - junit-jupiter - - junit-extensions - - spring-boot - - java-usage - - configuration - - running-without-http-server - - android + - JUnit 5+ Jupiter: junit-jupiter + - JUnit 4 and Vintage: junit-extensions + - Spring Boot: spring-boot + - Plain Java: java-usage + - Java configuration: configuration + - Running without the HTTP Server: running-without-http-server - Stubbing & Verifying: #link: /docs/stubbing - - stubbing - - request-matching - - response-templating - - simulating-faults - - stateful-behaviour - - proxying - - verifying + - Stubbing: stubbing + - Request Matching: request-matching + - Response Templating: response-templating + - Simulating Faults: simulating-faults + - Stateful Behaviour: stateful-behaviour + - Proxying: proxying + - Verifying: verifying - Templating: # link: /docs/mock-api-templates - - mock-api-templates - - mock-api-templates/usage + - WireMock API Templates Library: mock-api-templates + - Using Mock API Templates: mock-api-templates/usage - Record & Playback: #link: /docs/record-playback/ - - record-playback + - Record and Playback: record-playback - Protocols: - - webhooks-and-callbacks - - grpc - - solutions/graphql - - https + - Webhooks and Callbacks: webhooks-and-callbacks + - Mocking gRPC services: grpc + - WireMock and GraphQL: solutions/graphql + - Serving HTTPs: https - Advanced use-cases: - - multi-domain-mocking - - advanced/deploy-to-servlet-container - - advanced/java7 + - Multi-domain Mocking: multi-domain-mocking + - Deploying into a servlet container: advanced/deploy-to-servlet-container + - "WireMock on Java 1.7": advanced/java7 - Extensibility: # link: /docs/extending-wiremock/ - - extending-wiremock - - extensibility/filtering-requests - - extensibility/transforming-responses - - extensibility/custom-matching - - extensibility/listening-for-serve-events - - extensibility/extending-the-admin-api - - extensibility/adding-template-helpers - - extensibility/adding-template-model-data - - extensibility/listening-for-stub-changes - - extensibility/listening-for-settings-changes - - extensibility/adding-mappings-loader - - stub-metadata + - Extending WireMock: extending-wiremock + - Filtering and Modifying Requests: extensibility/filtering-requests + - Transforming Responses: extensibility/transforming-responses + - Custom Matching: extensibility/custom-matching + - Listening for Serve Events: extensibility/listening-for-serve-events + - Admin API Extensions: extensibility/extending-the-admin-api + - Adding Template Helpers: extensibility/adding-template-helpers + - Adding Template Model Data: extensibility/adding-template-model-data + - Listening for Stub Changes: extensibility/listening-for-stub-changes + - Listening for Settings Changes: extensibility/listening-for-settings-changes + - Mappings Loader Extensions: extensibility/adding-mappings-loader + - Stub Metadata: stub-metadata - Reference: # pages: - - standalone/admin-api-reference - - mock-api-templates + - Admin API: standalone/admin-api-reference + - WireMock API Templates Library: mock-api-templates - Extensions: - Features: From 737f40acae1ea00f4364f5902d33df918463d8ce Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 23:04:16 +0100 Subject: [PATCH 06/71] Add WireMock.css --- _docs/assets/css/wiremock.css | 47 ++++++++++++++++++ _docs/assets/images/favicon.svg | 86 +++++++++++++++++++++++++++++++++ mkdocs.yml | 2 +- 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 _docs/assets/css/wiremock.css create mode 100644 _docs/assets/images/favicon.svg diff --git a/_docs/assets/css/wiremock.css b/_docs/assets/css/wiremock.css new file mode 100644 index 00000000..75bb15f7 --- /dev/null +++ b/_docs/assets/css/wiremock.css @@ -0,0 +1,47 @@ +:root { + --wm-blue: #0FB2EF; + --wm-orange: #FF9505; + --wm-light-blue: #F0F5FF; + } + +.wm-button { + height: 100%; + right: 0; + padding: 0 0.5rem; + outline: none; + height: 40px; + background-color: var(--wm-light-blue); + border: 3px solid var(--wm-blue); + border-radius: 5px; + font-weight: bold; + color: var(--wm-blue); + cursor: pointer; +} + +.wm-left { + float: left; +} + +.wy-side-nav-search { + background-color: var(--wm-blue); +} + +.md-nav__item--section>.md-nav__link[for] { + color: var(--wm-blue); +} + +.md-typeset h1 { + color: var(--wm-blue); +} + +h2 { + color: var(--wm-blue); +} + +h3 { + color: var(--wm-blue); +} + +h4 { + color: var(--wm-blue); +} diff --git a/_docs/assets/images/favicon.svg b/_docs/assets/images/favicon.svg new file mode 100644 index 00000000..071d4419 --- /dev/null +++ b/_docs/assets/images/favicon.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + diff --git a/mkdocs.yml b/mkdocs.yml index 59413489..fd1d3488 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -44,7 +44,7 @@ theme: font: text: DM Sans code: Roboto Mono - favicon: images/logos/wiremock/logo_small.svg + favicon: assets/images/favicon.svg logo: images/logos/wiremock/logo_wide.svg extra: From b6e814c6451d4d0bdc3c387754053166ccdce4f4 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 23:11:27 +0100 Subject: [PATCH 07/71] Update contributing info for MkDocs --- CONTRIBUTING.md | 36 ++++++++++++++++++++++++++++++++---- README.md | 4 ++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4d6019d9..c8fb8e9e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,7 +32,33 @@ that is included as a submodule and build by the CD flow. To update the documentation, submit pull requests against the branch, and they will be included into the main release line. -## Editing +## Documentation + +The documentation is built using +[MkDocs](https://www.mkdocs.org/), +[mkdocs-multirepo-plugin](https://github.com/jdoiro3/mkdocs-multirepo-plugin/tree/main) and +[Material for MkDocs](https://squidfunk.github.io/mkdocs-material) + +### Building + +Requirements: + +- Python and PiP, recent versions + +```shell +pip install -r requirements.txt +mkdocs build +``` + +### Local development + +To serve the site locally: + +```shell +mkdocs serve +``` + +Note that the multi-repo site maybe quite slow during the first build. ### Code Tabs @@ -78,7 +104,9 @@ Example: When editing the existing code, make sure to also copy-edit text around it to ensure consistency. -## Preparing the developer environment +## Main site + +### Preparing the developer environment The website is powered by Jekyll, and hence the Ruby developer environment is needed. It is recommended to use `Ruby 2.7.6` because of the known compatibility issues between recent Jekyll version and Ruby 3. @@ -90,7 +118,7 @@ Prerequisites: - Ruby 2.7.6 - Bundler 2.4.10 -## Building the website +### Building the website ```bash # Install the dependencies including Jekyll @@ -102,7 +130,7 @@ bundle exec jekyll build --config '_config.yml' Note that `_config_preview.yml' is used to disable analytics in the deployed versions -## Running the website locally +### Running the website locally You can run the website locally and get live preview of the changes on the website and in the documentation contents. diff --git a/README.md b/README.md index 6ee29f74..58ec953d 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ Repository that stores the WireMock website and documentation. Powered by Jekyll and Markdown. The website uses the [Minimal Mistakes Theme](https://mmistakes.github.io/minimal-mistakes/) for Jekyll. +The documentation is built using +[MkDocs](https://www.mkdocs.org/), +[mkdocs-multirepo-plugin](https://github.com/jdoiro3/mkdocs-multirepo-plugin/tree/main) and +[Material for MkDocs](https://squidfunk.github.io/mkdocs-material) ## Contributing From 37abf2994aca9efd612119d1b435ea8fb06f1bd2 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 20 Nov 2023 23:19:39 +0100 Subject: [PATCH 08/71] Ignore docs site contents --- .gitignore | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 32c353a9..da113d5b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ main.css # MkDocs /temp_dir/ +/_site-docs/ diff --git a/README.md b/README.md index 58ec953d..e6cd81e5 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Repository that stores the WireMock website and documentation. Powered by Jekyll and Markdown. The website uses the [Minimal Mistakes Theme](https://mmistakes.github.io/minimal-mistakes/) for Jekyll. -The documentation is built using +The documentation is built using [MkDocs](https://www.mkdocs.org/), [mkdocs-multirepo-plugin](https://github.com/jdoiro3/mkdocs-multirepo-plugin/tree/main) and [Material for MkDocs](https://squidfunk.github.io/mkdocs-material) From 475af8d46f54b9b746e22d1dce8b2ee348149996 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 19:25:20 +0100 Subject: [PATCH 09/71] Use top tabs for navigation --- mkdocs.yml | 140 ++++++++++++++++++++++------------------------------- 1 file changed, 59 insertions(+), 81 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index fd1d3488..30aa1ece 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -32,7 +32,7 @@ theme: # - navigation.prune - navigation.sections - navigation.expand - #- navigation.tabs + - navigation.tabs # - navigation.tabs.sticky - navigation.top - navigation.tracking @@ -114,79 +114,50 @@ plugins: nav: - - Getting started: - - Overview: overview - - "Quick Start: API Mocking with Java and JUnit 4": quickstart/java-junit - - Download and Installation: download-and-installation - - WireMock Tutorials: getting-started - - FAQ: faq - -# link: /docs/overview - - - WireMock Standalone: - # link: /docs/standalone - - Running in Docker: standalone/docker - - Running as a Standalone Process: standalone/java-jar - - Administration API: standalone/administration - - - Java Usage: - # link: /docs/solutions/jvm/ - - JUnit 5+ Jupiter: junit-jupiter - - JUnit 4 and Vintage: junit-extensions - - Spring Boot: spring-boot - - Plain Java: java-usage - - Java configuration: configuration - - Running without the HTTP Server: running-without-http-server - - - Stubbing & Verifying: - #link: /docs/stubbing - - Stubbing: stubbing - - Request Matching: request-matching - - Response Templating: response-templating - - Simulating Faults: simulating-faults - - Stateful Behaviour: stateful-behaviour - - Proxying: proxying - - Verifying: verifying - - - Templating: - # link: /docs/mock-api-templates - - WireMock API Templates Library: mock-api-templates - - Using Mock API Templates: mock-api-templates/usage - - - Record & Playback: - #link: /docs/record-playback/ - - Record and Playback: record-playback - - - Protocols: - - Webhooks and Callbacks: webhooks-and-callbacks - - Mocking gRPC services: grpc - - WireMock and GraphQL: solutions/graphql - - Serving HTTPs: https - - - Advanced use-cases: - - Multi-domain Mocking: multi-domain-mocking - - Deploying into a servlet container: advanced/deploy-to-servlet-container - - "WireMock on Java 1.7": advanced/java7 - - - Extensibility: - # link: /docs/extending-wiremock/ - - Extending WireMock: extending-wiremock - - Filtering and Modifying Requests: extensibility/filtering-requests - - Transforming Responses: extensibility/transforming-responses - - Custom Matching: extensibility/custom-matching - - Listening for Serve Events: extensibility/listening-for-serve-events - - Admin API Extensions: extensibility/extending-the-admin-api - - Adding Template Helpers: extensibility/adding-template-helpers - - Adding Template Model Data: extensibility/adding-template-model-data - - Listening for Stub Changes: extensibility/listening-for-stub-changes - - Listening for Settings Changes: extensibility/listening-for-settings-changes - - Mappings Loader Extensions: extensibility/adding-mappings-loader - - Stub Metadata: stub-metadata - - - Reference: - # pages: - - Admin API: standalone/admin-api-reference - - WireMock API Templates Library: mock-api-templates + - Using WireMock: + - Getting started: + - Overview: overview.md + - "Quick Start: API Mocking with Java and JUnit 4": quickstart/java-junit.md + - Download and Installation: download-and-installation.md + - WireMock Tutorials: getting-started.md + - FAQ: faq.md + - WireMock Standalone: + - Running in Docker: standalone/docker.md + - Running as a Standalone Process: standalone/java-jar.md + - Administration API: standalone/administration.md + - Java Usage: + - JUnit 5+ Jupiter: junit-jupiter.md + - JUnit 4 and Vintage: junit-extensions.md + - Spring Boot: spring-boot.md + - Plain Java: java-usage.md + - Java configuration: configuration.md + - Running without the HTTP Server: running-without-http-server .md + - Stubbing & Verifying: + - Stubbing: stubbing.md + - Request Matching: request-matching.md + - Response Templating: response-templating.md + - Simulating Faults: simulating-faults.md + - Stateful Behaviour: stateful-behaviour.md + - Proxying: proxying.md + - Verifying: verifying.md + - Templating: + - WireMock API Templates Library: mock-api-templates.md + - Using Mock API Templates: mock-api-templates/usage.md + - Record & Playback: + - Record and Playback: record-playback.md + - Protocols: + - Webhooks and Callbacks: webhooks-and-callbacks.md + - Mocking gRPC services: grpc.md + - WireMock and GraphQL: solutions/graphql.md + - Serving HTTPs: https.md + - Advanced use-cases: + - Multi-domain Mocking: multi-domain-mocking.md + - Deploying into a servlet container: advanced/deploy-to-servlet-container.md + - "WireMock on Java 1.7": advanced/java7.md + - Reference: + - Admin API: standalone/admin-api-reference.md + - Security: dotgithub/SECURITY.md + - WireMock API Templates Library: mock-api-templates.md - Extensions: - Features: @@ -195,25 +166,32 @@ nav: - Response Template Transformer: wiremock/_docs/response-templating.md - State: state/README.md - Webhooks: wiremock/_docs/webhooks-and-callbacks.md - - # Outside WireMock GitHub org - CORS protection: cors/README.md - JSON Web Tokens (JWT): jwt/README.md - JSON Body Transformer: 9cookies/json-body-transformer.md - Request Time Matcher: 9cookies/request-time-matcher.md - - Operations Extensions: - Prometheus Metrics: prometheus/README.md - - Developer Extensions: - Callback Simulator: 9cookies/callback-simulator.md - Keywords: 9cookies/keywords.md - Stub Mapping Tracker: stub-mapping-tracker/README.md - Record Delay Capture: record-delay/README.md - - General: - - Security: dotgithub/SECURITY.md - + - Extending WireMock: + - Extending WireMock: extending-wiremock.md + - Filtering and Modifying Requests: extensibility/filtering-requests.md + - Transforming Responses: extensibility/transforming-responses.md + - Custom Matching: extensibility/custom-matching.md + - Listening for Serve Events: extensibility/listening-for-serve-events.md + - Admin API Extensions: extensibility/extending-the-admin-api.md + - Adding Template Helpers: extensibility/adding-template-helpers.md + - Adding Template Model Data: extensibility/adding-template-model-data.md + - Listening for Stub Changes: extensibility/listening-for-stub-changes.md + - Listening for Settings Changes: extensibility/listening-for-settings-changes.md + - Mappings Loader Extensions: extensibility/adding-mappings-loader.md + - Stub Metadata: stub-metadata.md + - Contributing: - Contributor Guide: community/contributing/README.md - Hacktoberfest 2023: dotgithub/CONTRIBUTING.md From 209141f393dd7d26efd02d647ef988992ccc91e9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 20:16:34 +0100 Subject: [PATCH 10/71] Migrate redirects to MkDocs and Jekyll outward redirects --- .vscode/settings.json | 5 +++++ _config.yml | 1 + _docs/download-and-installation.md | 7 ------- _docs/extending-wiremock.md | 1 - _docs/getting-started.md | 3 --- _docs/grpc.md | 3 --- _docs/https.md | 1 - _docs/java-usage.md | 3 --- _docs/junit-extensions.md | 6 ------ _docs/junit-jupiter.md | 2 -- _docs/participate.md | 3 --- _docs/proxying.md | 1 - _docs/record-playback.md | 1 - _docs/running-without-http-server.md | 1 - _docs/simulating-faults.md | 1 - _docs/solutions/android.md | 1 - _docs/solutions/golang.md | 3 --- _docs/solutions/graphql.md | 3 --- _docs/solutions/spring-boot.md | 2 -- _docs/solutions/testcontainers.md | 5 ----- _docs/standalone.md | 2 -- _docs/standalone/admin-api-reference.md | 4 ---- _docs/standalone/docker.md | 4 ---- _docs/standalone/java-jar.md | 5 ----- _docs/stateful-behaviour.md | 1 - _docs/stubbing.md | 1 - _docs/verifying.md | 1 - _redirects/admin-api-reference.html | 5 +++++ _redirects/android.html | 5 +++++ _redirects/contributing.html | 5 +++++ _redirects/download.html | 5 +++++ _redirects/downloads.html | 5 +++++ _redirects/extending-wiremock.html | 5 +++++ _redirects/getting-started.html | 5 +++++ _redirects/graphql.html | 5 +++++ _redirects/grpc.html | 5 +++++ _redirects/https.html | 5 +++++ _redirects/java-usage.html | 5 +++++ _redirects/junit-rule.html | 5 +++++ _redirects/participate.html | 5 +++++ _redirects/proxying.html | 5 +++++ _redirects/record-playback.html | 5 +++++ _redirects/running-standalone.html | 5 +++++ _redirects/running-without-http-server.html | 5 +++++ _redirects/simulating-faults.html | 5 +++++ _redirects/standalone.html | 5 +++++ _redirects/stateful-behaviour.html | 5 +++++ _redirects/stubbing.html | 5 +++++ _redirects/testcontainers.html | 5 +++++ _redirects/verifying.html | 5 +++++ mkdocs.yml | 20 +++++++++++++++++++- requirements.txt | 1 + support/index.md | 2 -- 53 files changed, 141 insertions(+), 68 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 _redirects/admin-api-reference.html create mode 100644 _redirects/android.html create mode 100644 _redirects/contributing.html create mode 100644 _redirects/download.html create mode 100644 _redirects/downloads.html create mode 100644 _redirects/extending-wiremock.html create mode 100644 _redirects/getting-started.html create mode 100644 _redirects/graphql.html create mode 100644 _redirects/grpc.html create mode 100644 _redirects/https.html create mode 100644 _redirects/java-usage.html create mode 100644 _redirects/junit-rule.html create mode 100644 _redirects/participate.html create mode 100644 _redirects/proxying.html create mode 100644 _redirects/record-playback.html create mode 100644 _redirects/running-standalone.html create mode 100644 _redirects/running-without-http-server.html create mode 100644 _redirects/simulating-faults.html create mode 100644 _redirects/standalone.html create mode 100644 _redirects/stateful-behaviour.html create mode 100644 _redirects/stubbing.html create mode 100644 _redirects/testcontainers.html create mode 100644 _redirects/verifying.html diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..45100a01 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "search.exclude": { + "**/wiremock.org-2.x/**": true + } + } diff --git a/_config.yml b/_config.yml index b1242a67..d0b7bf98 100644 --- a/_config.yml +++ b/_config.yml @@ -104,6 +104,7 @@ author: include: - .htaccess - _pages + - _redirects exclude: - vendor/ - "*.sublime-project" diff --git a/_docs/download-and-installation.md b/_docs/download-and-installation.md index c65f3691..8c5d780f 100644 --- a/_docs/download-and-installation.md +++ b/_docs/download-and-installation.md @@ -6,13 +6,6 @@ toc_rank: 13 description: > WireMock is available as a standalone service (for Docker of Java), Java library and integrations for modern languages and technology stacks. -redirect_from: - - "/download.html" - - "/download/" - - "/downloads.html" - - "/downloads/" - - "/docs/download.html" - - "/docs/download/" --- diff --git a/_docs/extending-wiremock.md b/_docs/extending-wiremock.md index bebd4462..c75f9e6d 100644 --- a/_docs/extending-wiremock.md +++ b/_docs/extending-wiremock.md @@ -3,7 +3,6 @@ layout: docs title: Extending WireMock meta_title: Extending WireMock via custom code | WireMock toc_rank: 110 -redirect_from: "/extending-wiremock.html" description: You can register the extension programmatically via its class name, class or an instance --- diff --git a/_docs/getting-started.md b/_docs/getting-started.md index 76c09df5..3aabbc2a 100644 --- a/_docs/getting-started.md +++ b/_docs/getting-started.md @@ -3,9 +3,6 @@ layout: docs title: WireMock Tutorials meta_title: Listing of WireMock Quick Starts and Tutorials toc_rank: 10 -redirect_from: - - "/getting-started.html" - - "/docs/tutorials.html" description: Provides links to WireMock tutorials and other entry materials --- diff --git a/_docs/grpc.md b/_docs/grpc.md index 7d264bc3..4fe006f4 100644 --- a/_docs/grpc.md +++ b/_docs/grpc.md @@ -6,9 +6,6 @@ description: Mocking gRPC services with WireMock og_image: solutions/grpc/wiremock_grpc_opengraph.png header: image: solutions/grpc/header.png -redirect_from: -- "/grpc.html" -- "/grpc/" --- WireMock 3.2.0+ supports mocking of gRPC services via the diff --git a/_docs/https.md b/_docs/https.md index 289c16c4..0e852aee 100644 --- a/_docs/https.md +++ b/_docs/https.md @@ -2,7 +2,6 @@ layout: docs title: Serving HTTPs meta_title: Using WireMock with HTTPs using self-signed or custom certificates | WireMock -redirect_from: "/https.html" description: WireMock can optionally accept requests over HTTPS. By default it will serve its own self-signed TLS certificate. --- diff --git a/_docs/java-usage.md b/_docs/java-usage.md index 964b9d26..6a402907 100644 --- a/_docs/java-usage.md +++ b/_docs/java-usage.md @@ -2,9 +2,6 @@ layout: docs title: Plain Java meta_title: Use WireMock from Java or other JVM languages | WireMock -redirect_from: - - "/java-usage.html" - - "/docs/plain-java.html" description: If you want to use WireMock from Java (or any other JVM language) outside of JUnit you can programmatically create, start and stop the server. --- diff --git a/_docs/junit-extensions.md b/_docs/junit-extensions.md index aad4035b..6462eb98 100644 --- a/_docs/junit-extensions.md +++ b/_docs/junit-extensions.md @@ -2,12 +2,6 @@ layout: docs title: 'JUnit 4 and Vintage' meta_title: Using Junit 4 and Vintage to Manage WireMock instances | WireMock -redirect_from: - - "/junit-rule.html" - - "/docs/junit-rule/index.html" - - "/docs/junit-rule/" - - "/junit-rule/" - - "/docs/junit-4.html" description: WireMock includes a JUnit rule, compatible with JUnit 4.x and JUnit 5 Vintage. This provides a convenient way to manage one or more WireMock instances in your test cases. --- diff --git a/_docs/junit-jupiter.md b/_docs/junit-jupiter.md index e48e4860..5b87aea7 100644 --- a/_docs/junit-jupiter.md +++ b/_docs/junit-jupiter.md @@ -3,8 +3,6 @@ layout: docs title: "JUnit 5+ Jupiter" meta_title: Using WireMock's JUnit Jupiter extension | WireMock description: WireMock includes a JUnit Jupiter extension which is used to manage the lifecycle and configuration of one or more WireMock instances in your test case. -redirect_from: - - "/docs/junit-5.html" --- The JUnit Jupiter extension simplifies running of one or more WireMock instances in a Jupiter test class. diff --git a/_docs/participate.md b/_docs/participate.md index 6950c835..e721e902 100644 --- a/_docs/participate.md +++ b/_docs/participate.md @@ -2,9 +2,6 @@ layout: docs title: Participate in WireMock meta_title: How to participate in the WireMock Community -redirect_from: -- "/contributing.html" -- "/participate.html" description: > Regardless of your expertise and time you could dedicate, there're opportunities to participate in the project and its community! diff --git a/_docs/proxying.md b/_docs/proxying.md index 4bd01be1..d69eba5e 100644 --- a/_docs/proxying.md +++ b/_docs/proxying.md @@ -3,7 +3,6 @@ layout: docs title: Proxying meta_title: Proxying and proxy stub mappings | WireMock toc_rank: 65 -redirect_from: "/proxying.html" description: Proxy responses are defined in exactly the same manner as stubs, meaning that the same request matching criteria can be used. --- diff --git a/_docs/record-playback.md b/_docs/record-playback.md index 2a993910..fa864ab2 100644 --- a/_docs/record-playback.md +++ b/_docs/record-playback.md @@ -2,7 +2,6 @@ layout: docs title: Record and Playback meta_title: Record and Playback an API to Create a Mock | WireMock -redirect_from: "/record-playback.html" description: WireMock can create stub mappings from requests it has received. Combined with its proxying feature this allows you to “record” stub mappings from interaction with existing APIs. --- diff --git a/_docs/running-without-http-server.md b/_docs/running-without-http-server.md index f18c33ac..86c7d3fc 100644 --- a/_docs/running-without-http-server.md +++ b/_docs/running-without-http-server.md @@ -3,7 +3,6 @@ layout: docs title: Running without the HTTP Server meta_title: Running WireMock without an HTTP Server | WireMock toc_rank: 42 -redirect_from: "/running-without-http-server.html" description: Running WireMock inside a Java process, without running the inbuilt HTTP layer. --- diff --git a/_docs/simulating-faults.md b/_docs/simulating-faults.md index fd2af476..7b0f6f6e 100644 --- a/_docs/simulating-faults.md +++ b/_docs/simulating-faults.md @@ -3,7 +3,6 @@ layout: docs title: Simulating Faults meta_title: Simulating faults in API behavior | WireMock toc_rank: 80 -redirect_from: "/simulating-faults.html" description: One of the main reasons it’s beneficial to use web service fakes when testing is to inject faulty behaviour that might be difficult to get the real service to produce on demand. --- diff --git a/_docs/solutions/android.md b/_docs/solutions/android.md index 580b287d..61c5f984 100644 --- a/_docs/solutions/android.md +++ b/_docs/solutions/android.md @@ -4,7 +4,6 @@ title: Running on Android meta_title: Running WireMock on the Android platform | WireMock toc_rank: 115 description: With some effort it is now possible to run WireMock on Android. Please see Sam Edwards’ excellent blog post for instructions. -redirect_from: "/docs/android.html" logo: /images/logos/technology/android.svg --- diff --git a/_docs/solutions/golang.md b/_docs/solutions/golang.md index 5e2b8c5a..96ef75aa 100644 --- a/_docs/solutions/golang.md +++ b/_docs/solutions/golang.md @@ -4,9 +4,6 @@ title: "WireMock and Go" meta_title: "Golang Solutions | WireMock" description: "Additional solutions for WireMock when using Golang" logo: /images/logos/technology/golang.svg -redirect_from: -- "/go.html" -- "/go/" hide-disclaimer: true --- diff --git a/_docs/solutions/graphql.md b/_docs/solutions/graphql.md index 24b0f91e..30aad877 100644 --- a/_docs/solutions/graphql.md +++ b/_docs/solutions/graphql.md @@ -5,9 +5,6 @@ meta_title: "GraphQL Solutions | WireMock" description: "Additional solutions for WireMock when using Golang" logo: /images/logos/technology/graphql.svg og_image: solutions/graphql/wiremock_graphql_opengraph.png -redirect_from: -- "/graphql.html" -- "/graphql/" hide-disclaimer: true --- diff --git a/_docs/solutions/spring-boot.md b/_docs/solutions/spring-boot.md index bb27b622..7412171d 100644 --- a/_docs/solutions/spring-boot.md +++ b/_docs/solutions/spring-boot.md @@ -4,8 +4,6 @@ title: "Using WireMock with Spring Boot" meta_title: Running WireMock with Spring Boot | WireMock toc_rank: 116 description: The team behind Spring Cloud Contract have created a library to support running WireMock using the “ambient” HTTP server -redirect_from: -- "/docs/spring-boot.html" logo: /images/logos/technology/spring.svg --- diff --git a/_docs/solutions/testcontainers.md b/_docs/solutions/testcontainers.md index 6c9c0c81..89150cc6 100644 --- a/_docs/solutions/testcontainers.md +++ b/_docs/solutions/testcontainers.md @@ -5,11 +5,6 @@ meta_title: "Testcontainers Solutions | WireMock" description: "Additional solutions for WireMock when using Testcontainers" logo: /images/logos/technology/testcontainers.svg hide-disclaimer: true -redirect_from: -- "/docs/testcontainers.html" -- "/docs/testcontainers/" -- "/testcontainers.html" -- "/testcontainers/" --- The WireMock community provides modules for [Testcontainers](https://testcontainers.com/). diff --git a/_docs/standalone.md b/_docs/standalone.md index 5c731e2b..cb3e49d5 100644 --- a/_docs/standalone.md +++ b/_docs/standalone.md @@ -3,8 +3,6 @@ layout: docs title: WireMock Standalone meta_title: WireMock as a Standalone Service toc_rank: 41 -redirect_from: - - "/standalone.html" description: > WireMock can be run as a standalone service. We provide the JAR file and Docker image distributions for it. diff --git a/_docs/standalone/admin-api-reference.md b/_docs/standalone/admin-api-reference.md index 8476f05e..9569ef43 100644 --- a/_docs/standalone/admin-api-reference.md +++ b/_docs/standalone/admin-api-reference.md @@ -4,10 +4,6 @@ title: Admin API Reference meta_title: WireMock Admin REST API Documentation | WireMock toc_rank: 120 description: The WireMock admin API is described in OpenAPI 3.0. -redirect_from: - - "/wiremock-admin-api.html" - - "/docs/api.html" - - "/docs/api/" --- The WireMock admin API is described in [OpenAPI 3.0](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md). The spec file plus an instance of Swagger UI can be accessed from a running WireMock instance under `/__admin/docs/`, e.g. `http://localhost:8080/__admin/docs/`. diff --git a/_docs/standalone/docker.md b/_docs/standalone/docker.md index 2ebc00b4..e392ded5 100644 --- a/_docs/standalone/docker.md +++ b/_docs/standalone/docker.md @@ -3,10 +3,6 @@ layout: docs title: Running in Docker meta_title: Configuring and running WireMock in Docker | WireMock description: The Docker image supports exactly the same set of command line arguments as the standalone version. These can be passed to the container by appending them to the end of the command. -redirect_from: - - "/docs/solutions/docker.html" - - "/docs/docker.html" - - "/docs/docker/" --- From version 2.31.0 WireMock has an [official Docker image](https://hub.docker.com/r/wiremock/wiremock). diff --git a/_docs/standalone/java-jar.md b/_docs/standalone/java-jar.md index 77a81ee2..d3294774 100644 --- a/_docs/standalone/java-jar.md +++ b/_docs/standalone/java-jar.md @@ -3,11 +3,6 @@ layout: docs title: Running as a Standalone Process meta_title: Run an API Mock Server as a Standalone Process | WireMock toc_rank: 41 -redirect_from: - - "/running-standalone.html" - - "/running-standalone/" - - "/docs/running-standalone.html" - - "/docs/running-standalone/" description: The WireMock server can be run in its own process, and configured via the Java API, JSON over HTTP or JSON files. --- diff --git a/_docs/stateful-behaviour.md b/_docs/stateful-behaviour.md index d4a5838a..74c6f39c 100644 --- a/_docs/stateful-behaviour.md +++ b/_docs/stateful-behaviour.md @@ -2,7 +2,6 @@ layout: docs title: Stateful Behaviour meta_title: Simulating Stateful Behavior for Testing | WireMock -redirect_from: "/stateful-behaviour.html" description: Most web services tend to have some state, which changes as you and others interact with it. --- diff --git a/_docs/stubbing.md b/_docs/stubbing.md index dc66b4b5..6ce07ccf 100644 --- a/_docs/stubbing.md +++ b/_docs/stubbing.md @@ -3,7 +3,6 @@ layout: docs title: Stubbing meta_title: Returning stubbed HTTP responses to specific requests | WireMock toc_rank: 50 -redirect_from: "/stubbing.html" description: A core feature of WireMock is the ability to return canned HTTP responses for requests matching criteria. These are described in detail in Request Matching. --- diff --git a/_docs/verifying.md b/_docs/verifying.md index 4aee216b..5207f816 100644 --- a/_docs/verifying.md +++ b/_docs/verifying.md @@ -3,7 +3,6 @@ layout: docs title: Verifying meta_title: Verifying whether specific HTTP requests were made | WireMock toc_rank: 60 -redirect_from: "/verifying.html" description: Verifying and querying requests relies on the request journal, which is an in-memory log of received requests. This can be disabled for load testing. --- diff --git a/_redirects/admin-api-reference.html b/_redirects/admin-api-reference.html new file mode 100644 index 00000000..6193dbb4 --- /dev/null +++ b/_redirects/admin-api-reference.html @@ -0,0 +1,5 @@ +--- +permalink: /wiremock-admin-api +redirect_to: + - ./docs/standalone/admin-api-reference +--- diff --git a/_redirects/android.html b/_redirects/android.html new file mode 100644 index 00000000..59639352 --- /dev/null +++ b/_redirects/android.html @@ -0,0 +1,5 @@ +--- +permalink: /android +redirect_to: + - ./docs/solutions/android +--- diff --git a/_redirects/contributing.html b/_redirects/contributing.html new file mode 100644 index 00000000..3b5f3dbb --- /dev/null +++ b/_redirects/contributing.html @@ -0,0 +1,5 @@ +--- +permalink: /contributing +redirect_to: + - ./docs/contributing +--- diff --git a/_redirects/download.html b/_redirects/download.html new file mode 100644 index 00000000..d9597917 --- /dev/null +++ b/_redirects/download.html @@ -0,0 +1,5 @@ +--- +permalink: /download +redirect_to: + - ./docs/download-and-installation +--- diff --git a/_redirects/downloads.html b/_redirects/downloads.html new file mode 100644 index 00000000..d9597917 --- /dev/null +++ b/_redirects/downloads.html @@ -0,0 +1,5 @@ +--- +permalink: /download +redirect_to: + - ./docs/download-and-installation +--- diff --git a/_redirects/extending-wiremock.html b/_redirects/extending-wiremock.html new file mode 100644 index 00000000..8a0cc82a --- /dev/null +++ b/_redirects/extending-wiremock.html @@ -0,0 +1,5 @@ +--- +permalink: /extending-wiremock +redirect_to: + - ./docs/extending-wiremock +--- diff --git a/_redirects/getting-started.html b/_redirects/getting-started.html new file mode 100644 index 00000000..ad6e04b8 --- /dev/null +++ b/_redirects/getting-started.html @@ -0,0 +1,5 @@ +--- +permalink: /getting-started +redirect_to: + - ./docs/getting-started +--- diff --git a/_redirects/graphql.html b/_redirects/graphql.html new file mode 100644 index 00000000..e249cc80 --- /dev/null +++ b/_redirects/graphql.html @@ -0,0 +1,5 @@ +--- +permalink: /graphql +redirect_to: + - ./docs/solutions/graphql +--- diff --git a/_redirects/grpc.html b/_redirects/grpc.html new file mode 100644 index 00000000..e6c48960 --- /dev/null +++ b/_redirects/grpc.html @@ -0,0 +1,5 @@ +--- +permalink: /grpc +redirect_to: + - ./docs/grpc +--- diff --git a/_redirects/https.html b/_redirects/https.html new file mode 100644 index 00000000..c5a812ec --- /dev/null +++ b/_redirects/https.html @@ -0,0 +1,5 @@ +--- +permalink: /https +redirect_to: + - ./docs/https +--- diff --git a/_redirects/java-usage.html b/_redirects/java-usage.html new file mode 100644 index 00000000..235cee48 --- /dev/null +++ b/_redirects/java-usage.html @@ -0,0 +1,5 @@ +--- +permalink: /java-usage +redirect_to: + - ./docs/java-usage +--- diff --git a/_redirects/junit-rule.html b/_redirects/junit-rule.html new file mode 100644 index 00000000..534ab875 --- /dev/null +++ b/_redirects/junit-rule.html @@ -0,0 +1,5 @@ +--- +permalink: /junit-extensions +redirect_to: + - ./docs/junit-extensions +--- diff --git a/_redirects/participate.html b/_redirects/participate.html new file mode 100644 index 00000000..8ae9db73 --- /dev/null +++ b/_redirects/participate.html @@ -0,0 +1,5 @@ +--- +permalink: /participate +redirect_to: + - ./docs/participate +--- diff --git a/_redirects/proxying.html b/_redirects/proxying.html new file mode 100644 index 00000000..6f092399 --- /dev/null +++ b/_redirects/proxying.html @@ -0,0 +1,5 @@ +--- +permalink: /proxying +redirect_to: + - ./docs/proxying +--- diff --git a/_redirects/record-playback.html b/_redirects/record-playback.html new file mode 100644 index 00000000..07c46113 --- /dev/null +++ b/_redirects/record-playback.html @@ -0,0 +1,5 @@ +--- +permalink: /record-playback +redirect_to: + - ./docs/record-playback +--- diff --git a/_redirects/running-standalone.html b/_redirects/running-standalone.html new file mode 100644 index 00000000..eca8bc7c --- /dev/null +++ b/_redirects/running-standalone.html @@ -0,0 +1,5 @@ +--- +permalink: /running-standalone +redirect_to: + - ./docs/running-standalone +--- diff --git a/_redirects/running-without-http-server.html b/_redirects/running-without-http-server.html new file mode 100644 index 00000000..f57f2d5a --- /dev/null +++ b/_redirects/running-without-http-server.html @@ -0,0 +1,5 @@ +--- +permalink: /running-without-http-server +redirect_to: + - ./docs/running-without-http-server +--- diff --git a/_redirects/simulating-faults.html b/_redirects/simulating-faults.html new file mode 100644 index 00000000..e1546b84 --- /dev/null +++ b/_redirects/simulating-faults.html @@ -0,0 +1,5 @@ +--- +permalink: /simulating-faults +redirect_to: + - ./docs/simulating-faults +--- diff --git a/_redirects/standalone.html b/_redirects/standalone.html new file mode 100644 index 00000000..205ff2f1 --- /dev/null +++ b/_redirects/standalone.html @@ -0,0 +1,5 @@ +--- +permalink: /standalone +redirect_to: + - ./docs/standalone +--- diff --git a/_redirects/stateful-behaviour.html b/_redirects/stateful-behaviour.html new file mode 100644 index 00000000..f83ed753 --- /dev/null +++ b/_redirects/stateful-behaviour.html @@ -0,0 +1,5 @@ +--- +permalink: /stateful-behaviour +redirect_to: + - ./docs/stateful-behaviour +--- diff --git a/_redirects/stubbing.html b/_redirects/stubbing.html new file mode 100644 index 00000000..14601d59 --- /dev/null +++ b/_redirects/stubbing.html @@ -0,0 +1,5 @@ +--- +permalink: /stubbing +redirect_to: + - ./docs/stubbing +--- diff --git a/_redirects/testcontainers.html b/_redirects/testcontainers.html new file mode 100644 index 00000000..5c8b1d3c --- /dev/null +++ b/_redirects/testcontainers.html @@ -0,0 +1,5 @@ +--- +permalink: /testcontainers +redirect_to: + - ./docs/solutions/testcontainers +--- diff --git a/_redirects/verifying.html b/_redirects/verifying.html new file mode 100644 index 00000000..b0466d27 --- /dev/null +++ b/_redirects/verifying.html @@ -0,0 +1,5 @@ +--- +permalink: /verifying +redirect_to: + - ./docs/verifying +--- diff --git a/mkdocs.yml b/mkdocs.yml index 30aa1ece..fe7b8deb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -111,7 +111,25 @@ plugins: - name: dotgithub import_url: 'https://github.com/wiremock/.github?branch=main&edit_uri=/blob/main/' imports: [ CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md ] - + - redirects: + redirect_maps: + 'android.md': 'solutions/android.md' + 'go.md': 'solutions/golang.md' + 'solutions/go.md': 'solutions/golang.md' + 'graphql.md': 'solutions/go.md' + 'testcontainers.md': 'solutions/testcontainers.md' + 'spring-boot.md': 'solutions/spring-boot.md' + 'api.md': 'standalone/admin-api-reference.md' + 'download.md': 'download-and-installation.md' + 'tutorials.md': 'getting-started.md' + 'plain-java.md': 'java-usage.md' + 'junit-rule.md': 'junit-extensions.md' + 'junit-4.md': 'junit-extensions.md' + 'junit-5.md': 'junit-jupiter.md' + 'docker.md': 'standalone/docker.md' + 'solutions/docker.md': 'standalone/docker.md' + 'running-standalone.md': 'java-jar.md' + 'support.md': '../support' nav: - Using WireMock: diff --git a/requirements.txt b/requirements.txt index 9b94f78a..fa641aec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ mergedeep==1.3.4 mkdocs==1.5.3 mkdocs-multirepo-plugin==0.6.3 mkdocs-material==9.4.5 +mkdocs-redirects=1.2.1 click==8.1.7 dacite==1.8.1 ghp-import==2.1.0 diff --git a/support/index.md b/support/index.md index a60c6900..c5608386 100644 --- a/support/index.md +++ b/support/index.md @@ -3,8 +3,6 @@ layout: support title: Support meta_title: How to get WireMock support description: Community Assistance, Enterprise and commercial support and consulting options -redirect_from: - - "/docs/support.html" --- WireMock is an open source project. From 6e825bbe53120c68a1630559ffedc095d055596f Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 20:19:03 +0100 Subject: [PATCH 11/71] More redirect link fixes --- mkdocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index fe7b8deb..f384feaf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -116,7 +116,7 @@ plugins: 'android.md': 'solutions/android.md' 'go.md': 'solutions/golang.md' 'solutions/go.md': 'solutions/golang.md' - 'graphql.md': 'solutions/go.md' + 'graphql.md': 'solutions/graphql.md' 'testcontainers.md': 'solutions/testcontainers.md' 'spring-boot.md': 'solutions/spring-boot.md' 'api.md': 'standalone/admin-api-reference.md' @@ -128,7 +128,7 @@ plugins: 'junit-5.md': 'junit-jupiter.md' 'docker.md': 'standalone/docker.md' 'solutions/docker.md': 'standalone/docker.md' - 'running-standalone.md': 'java-jar.md' + 'running-standalone.md': 'standalone/java-jar.md' 'support.md': '../support' nav: From 1e72a5650ddec6cda9eb6d8dc9db73d0ccef8005 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 21:05:21 +0100 Subject: [PATCH 12/71] Use classic markdown referencing in cross-links --- _docs/configuration.md | 2 +- _docs/download-and-installation.md | 4 +-- _docs/extending-wiremock.md | 25 +++++++++---------- _docs/faq.md | 8 +++--- _docs/getting-started.md | 6 ++--- _docs/grpc.md | 2 +- _docs/java-usage.md | 4 +-- _docs/junit-extensions.md | 2 +- _docs/junit-jupiter.md | 2 +- .../README.md} | 2 +- _docs/mock-api-templates/usage.md | 10 ++++---- _docs/multi-domain-mocking.md | 2 +- _docs/overview.md | 2 +- _docs/proxying.md | 17 +++++++------ _docs/quickstart/java-junit.md | 6 ++--- _docs/record-playback.md | 12 ++++----- _docs/request-matching.md | 7 +++--- _docs/response-templating.md | 10 ++++---- _docs/running-without-http-server.md | 2 +- _docs/solutions/README.md | 3 +++ _docs/solutions/android.md | 4 +-- _docs/solutions/c_cpp.md | 6 ++--- _docs/solutions/golang.md | 6 ++--- _docs/solutions/groovy.md | 2 +- _docs/solutions/jvm.md | 24 +++++++++--------- _docs/solutions/kotlin.md | 1 - _docs/solutions/kubernetes.md | 2 +- _docs/solutions/nodejs.md | 2 +- _docs/solutions/python.md | 2 +- _docs/solutions/rust.md | 2 +- _docs/solutions/spring-boot.md | 2 +- _docs/solutions/testcontainers.md | 8 +++--- _docs/standalone.md | 11 ++++---- _docs/standalone/administration.md | 2 +- _docs/standalone/docker.md | 6 ++--- _docs/standalone/java-jar.md | 24 +++++++++--------- _docs/stateful-behaviour.md | 2 +- _docs/stub-metadata.md | 4 +-- _docs/stubbing.md | 4 +-- _docs/verifying.md | 14 +++++------ _docs/webhooks-and-callbacks.md | 4 +-- 41 files changed, 131 insertions(+), 129 deletions(-) rename _docs/{mock-api-templates.md => mock-api-templates/README.md} (98%) create mode 100644 _docs/solutions/README.md diff --git a/_docs/configuration.md b/_docs/configuration.md index accf16a5..4a89445d 100644 --- a/_docs/configuration.md +++ b/_docs/configuration.md @@ -175,7 +175,7 @@ Gzipping of responses can be disabled. ## Extensions -For details see [Extending WireMock](../extending-wiremock/). +For details see [Extending WireMock](./extending-wiremock.md). ```java // Add extensions diff --git a/_docs/download-and-installation.md b/_docs/download-and-installation.md index 8c5d780f..5749b24c 100644 --- a/_docs/download-and-installation.md +++ b/_docs/download-and-installation.md @@ -15,7 +15,7 @@ WireMock Java is distributed in two flavours - a standard JAR containing just Wi WireMock plus all its dependencies. Most of the standalone JAR's dependencies are shaded i.e. they are hidden in alternative packages. This allows WireMock to be used in projects with -conflicting versions of its dependencies. The standalone JAR is also runnable (see [Running as a Standalone Process](../running-standalone/)). +conflicting versions of its dependencies. The standalone JAR is also runnable (see [Running as a Standalone Process](./running-standalone.md)). ## Test dependencies @@ -51,7 +51,7 @@ Run the following in a terminal: testImplementation "org.wiremock:wiremock-standalone:{{ site.wiremock_version }}" ``` -Learn more in the [Docker guide](../docker). +Learn more in the [Docker guide](./standalone/docker.md). ### Direct download diff --git a/_docs/extending-wiremock.md b/_docs/extending-wiremock.md index c75f9e6d..e8197bac 100644 --- a/_docs/extending-wiremock.md +++ b/_docs/extending-wiremock.md @@ -12,20 +12,19 @@ Each extension point is defined by an interface that extends from `Extension` an At present, the following extension interfaces are available: * `RequestFilterV2`/`AdminRequestFilterV2`/`StubRequestFilterV2`: Intercept requests, modifying them or taking alternative actions based on their content. -* `ResponseDefinitionTransformerV2`: Modify the response definition used to generate a response. See [Transforming responses](../extensibility/transforming-responses/). -* `ResponseTransformerV2`: Modify the response served to the client. See [Transforming responses](../extensibility/transforming-responses/). -* `ServeEventListener`: Listen for events at various points in the request processing lifecycle. See [Listening for Serve Events](../extensibility/listening-for-serve-events/). -* `AdminApiExtension`: Add admin API functions. See [Admin API Extensions](../extensibility/extending-the-admin-api/). -* `RequestMatcherExtension`: Implement custom request matching logic. See [Custom matching](../extensibility/custom-matching/). -* `GlobalSettingsListener`: Listen for changes to the settings object. See [Listening for Settings Changes](../extensibility/listening-for-settings-changes/). -* `StubLifecycleListener`: Listen for changes to the stub mappings. See [Listening for Stub Changes](../extensibility/listening-for-stub-changes/). -* `TemplateHelperProviderExtension`: Provide custom Handlebars helpers to the template engine. See [Adding Template Helpers](../extensibility/adding-template-helpers/). -* `TemplateModelDataProviderExtension`: Provide additional data to the model passed to response templates. See [Adding Template Model Data](../extensibility/adding-template-model-data/). -* `MappingsLoaderExtension`: Provide additional source to load the stub mappings. See [Adding Mappings Loader](../extensibility/adding-mappings-loader/). +* `ResponseDefinitionTransformerV2`: Modify the response definition used to generate a response. See [Transforming responses](./extensibility/transforming-responses.md). +* `ResponseTransformerV2`: Modify the response served to the client. See [Transforming responses](./extensibility/transforming-responses.md). +* `ServeEventListener`: Listen for events at various points in the request processing lifecycle. See [Listening for Serve Events](./extensibility/listening-for-serve-events.md). +* `AdminApiExtension`: Add admin API functions. See [Admin API Extensions](./extensibility/extending-the-admin-api.md). +* `RequestMatcherExtension`: Implement custom request matching logic. See [Custom matching](./extensibility/custom-matching.md). +* `GlobalSettingsListener`: Listen for changes to the settings object. See [Listening for Settings Changes](./extensibility/listening-for-settings-changes.md). +* `StubLifecycleListener`: Listen for changes to the stub mappings. See [Listening for Stub Changes](./extensibility/listening-for-stub-changes.md). +* `TemplateHelperProviderExtension`: Provide custom Handlebars helpers to the template engine. See [Adding Template Helpers](./extensibility/adding-template-helpers.md). +* `TemplateModelDataProviderExtension`: Provide additional data to the model passed to response templates. See [Adding Template Model Data](./extensibility/adding-template-model-data.md). +* `MappingsLoaderExtension`: Provide additional source to load the stub mappings. See [Adding Mappings Loader](./extensibility/adding-mappings-loader.md). The interfaces in this list ending with `V2` supercede deprecated equivalents with an older, more restrictive interface. Additionally `ServeEventListener` deprecates `PostServeAction`. - ## Registering Extensions You can directly register the extension programmatically via its class name, @@ -42,7 +41,7 @@ new WireMockServer(wireMockConfig() .extensions(new BodyContentTransformer(), new HeaderMangler())); ``` -See [Running as a Standalone Process](../running-standalone/) for details on running with extensions from the command line. +See [Running as a Standalone Process](./standalone.md) for details on running with extensions from the command line. ### Factories @@ -62,6 +61,7 @@ new WireMockServer(wireMockConfig() ``` Services currently available to extension factories are: + * `Admin`: the main WireMock functional interface for stubbing, verification and configuration tasks. * `Options`: the configuration object built at startup. * `Stores`: the root interface for gaining access to the various stores of WireMock's state and creating/using custom stores. @@ -76,7 +76,6 @@ will be loaded automatically if they are placed on the classpath. See [https://github.com/wiremock/wiremock/tree/master/test-extension](https://github.com/wiremock/wiremock/tree/master/test-extension) for an example of such an extension. - ## Attaching sub-events during request processing Sub-events are a used to report interesting/useful information during request processing. WireMock attaches the diff report generated when a request is not matched as a sub-event, and custom extension can exploit this approach to surface e.g. diagnostic and validation data in the serve event log, where it can be retrieved later via the API or exported to monitoring/observability tools via listeners. diff --git a/_docs/faq.md b/_docs/faq.md index c69e5a51..dd8d22fd 100644 --- a/_docs/faq.md +++ b/_docs/faq.md @@ -30,9 +30,9 @@ WireMock supports several approaches for creating mock APIs - in code, via its R ### What makes WireMock unique? -WireMock has a rich [matching system](../request-matching/), allowing any part of an incoming request to be matched against complex and precise criteria. +WireMock has a rich [matching system](./request-matching.md), allowing any part of an incoming request to be matched against complex and precise criteria. Responses of any complexity can be dynamically generated via the Handlebars based templating system. -Finally, WireMock is easy to integrate into any workflow due to its numerous [extension points](../extending-wiremock/) and comprehensive APIs. +Finally, WireMock is easy to integrate into any workflow due to its numerous [extension points](./extending-wiremock.md) and comprehensive APIs. ### Is WireMock open source? @@ -50,8 +50,8 @@ WireMock is completely free under the Apache 2.0 license. This question is valid especially when it is getting difficult to keep track of what test case(s) a particular mock was meant for. #### Potential solutions -- Create your stubs (or most of them at least) in the test cases themselves, then [reset them](../stubbing/#reset) each time. -- Use the [`metadata` element](../stub-metadata/) in the stub data to tag stubs with info relating them to specific test cases. +- Create your stubs (or most of them at least) in the test cases themselves, then [reset them](./stubbing.md#reset) each time. +- Use the [`metadata` element](./stub-metadata.md) in the stub data to tag stubs with info relating them to specific test cases. #### Potential solutions for WireMock standalone - Use configuration-as-code, and store your definitions in a repository. You can have a hierarchical structure of Mappings and Files to specify teams. diff --git a/_docs/getting-started.md b/_docs/getting-started.md index 3aabbc2a..45c07447 100644 --- a/_docs/getting-started.md +++ b/_docs/getting-started.md @@ -13,14 +13,14 @@ Check out the guidelines below. At the moment, we provide the following quick starts for beginners: -- [API Mocking with Java and JUnit 4](../quickstart/java-junit) -- [Downloading and Installing WireMock](../download-and-installation) +- [API Mocking with Java and JUnit 4](./quickstart/java-junit.md) +- [Downloading and Installing WireMock](./download-and-installation.md) ## Featured tutorials -Here are some good tutorials from the [External Resources](/external-resources) you can use: +Here are some good tutorials from the [External Resources](../external-resources) you can use: - [WireMock Basics Workshop](https://github.com/basdijkstra/wiremock-workshop), by Bas Dijkstra - [Running your acceptance tests in Kubernetes using WireMock](https://blog.sebastian-daschner.com/entries/acceptance_tests_wiremock_kubernetes), by Sebastian Daschner diff --git a/_docs/grpc.md b/_docs/grpc.md index 4fe006f4..5f22ae4a 100644 --- a/_docs/grpc.md +++ b/_docs/grpc.md @@ -16,7 +16,7 @@ The extension scans for descriptor files (generated from the service's `.proto` Using these, it converts incoming messages to JSON before passing them to WireMock's core stubbing system which allows the existing JSON matchers to be used when matching requests. It also converts JSON responses back into proto messages so that all of WireMock's response definition features including templating can be used. -WireMock and gRPC schema +WireMock and gRPC schema The extension also adds a Java DSL that works with the Java classes generated by `protoc`, while also providing a more gRPC idiomatic way of defining stubs. diff --git a/_docs/java-usage.md b/_docs/java-usage.md index 6a402907..9989be2a 100644 --- a/_docs/java-usage.md +++ b/_docs/java-usage.md @@ -24,9 +24,9 @@ wireMockServer.start(); wireMockServer.stop(); ``` -For more details of the `options()` builder accepted by the constructor see [Configuration](../configuration/) for details. +For more details of the `options()` builder accepted by the constructor see [Configuration](./configuration.md) for details. -As with stubbing and verification via the [JUnit rule](../junit-rule/) you can call the +As with stubbing and verification via the [JUnit rule](./junit-extensions.md) you can call the stubbing/verifying DSL from the server object as an alternative to calling the client. diff --git a/_docs/junit-extensions.md b/_docs/junit-extensions.md index 6462eb98..5e52aaf1 100644 --- a/_docs/junit-extensions.md +++ b/_docs/junit-extensions.md @@ -28,7 +28,7 @@ various settings. An `Options` implementation can be created via the public WireMockRule wireMockRule = new WireMockRule(options().port(8888).httpsPort(8889)); ``` -See [Configuration](../configuration/) for details. +See [Configuration](./configuration.md) for details. ## Unmatched requests diff --git a/_docs/junit-jupiter.md b/_docs/junit-jupiter.md index 5b87aea7..94aa1eda 100644 --- a/_docs/junit-jupiter.md +++ b/_docs/junit-jupiter.md @@ -161,7 +161,7 @@ This behavior can be changed by calling `.failOnUnmatchedRequests(false)` on the ## Proxy mode The JUnit Jupiter extension can be configured to enable "proxy mode" which simplifies configuration and supports -[multi-domain mocking](../multi-domain-mocking/). +[multi-domain mocking](./multi-domain-mocking.md). ### Declarative diff --git a/_docs/mock-api-templates.md b/_docs/mock-api-templates/README.md similarity index 98% rename from _docs/mock-api-templates.md rename to _docs/mock-api-templates/README.md index aa0dbc56..a28f4035 100644 --- a/_docs/mock-api-templates.md +++ b/_docs/mock-api-templates/README.md @@ -23,7 +23,7 @@ and get a running mock in seconds - on your local machine or in the cloud. 2. Choose a template you need. There are categories and search capabilities at your disposal 3. Click the _Download WireMock JSON_ button to download the JSON file 4. Use the JSON file to configure your WireMock instance - See [Using Templates](./usage) + See [Using Templates](./usage.md) ## Using templates in WireMock Cloud diff --git a/_docs/mock-api-templates/usage.md b/_docs/mock-api-templates/usage.md index 1fc03706..c1cc251b 100644 --- a/_docs/mock-api-templates/usage.md +++ b/_docs/mock-api-templates/usage.md @@ -18,7 +18,7 @@ This guide explains how to run an API template after you've downloaded the JSON java -jar wiremock-jre8-standalone-{{ site.wiremock_version }}.jar ``` -See [this page](../../standalone/java-jar) for general details on running WireMock standalone. +See [this page](./../standalone/java-jar.md) for general details on running WireMock standalone. ## In WireMock Docker @@ -34,7 +34,7 @@ docker run -it --rm \ wiremock/wiremock:{{ site.wiremock_version }} ``` -See [this page](../../standalone/java-jar) for general details on running WireMock Docker. +See [this page](./../standalone/java-jar.md) for general details on running WireMock Docker. ## Plain Java @@ -49,7 +49,7 @@ WireMockServer wm = ); ``` -See [this](../../java-usage/) for general details on running WireMock in embedded Java. +See [this](./../java-usage.md) for general details on running WireMock in embedded Java. ## JUnit @@ -62,11 +62,11 @@ To do the same thing using the JUnit Jupiter extension: .build(); ``` -See [this](../../junit-jupiter/) for general details on running WireMock with JUnit 5+ Jupiter. +See [this](./../junit-jupiter.md) for general details on running WireMock with JUnit 5+ Jupiter. ## Pushing to a remotely running WireMock server -The mock API JSON can be pushed to a remotely running WireMock server via its [Admin API](../../standalone/administration). +The mock API JSON can be pushed to a remotely running WireMock server via its [Admin API](./../standalone/administration.md). For instance if the WireMock server is running on `wiremock.dev.mycompany.com` port 8080, you can POST the JSON file to it e.g. diff --git a/_docs/multi-domain-mocking.md b/_docs/multi-domain-mocking.md index ecb8b420..4507596c 100644 --- a/_docs/multi-domain-mocking.md +++ b/_docs/multi-domain-mocking.md @@ -23,7 +23,7 @@ The following sections detail how to achieve this in various deployment contexts ## Configuring for JUnit Jupiter The simplest way to enable this mode if you're using JUnit Jupiter it to toggle it on via the `WireMockExtension`. See the -[Junit Jupiter Proxy Mode](../junit-jupiter#proxy-mode) for details. +[Junit Jupiter Proxy Mode](./junit-jupiter.md#proxy-mode) for details. ## Configuring for JUnit 4.x diff --git a/_docs/overview.md b/_docs/overview.md index 6e2ffad3..ffa46b4c 100644 --- a/_docs/overview.md +++ b/_docs/overview.md @@ -38,7 +38,7 @@ or via JSON over HTTP for the standalone service. ## Getting Started -Check out WireMock Quick-starts and tutorials [here](../getting-started). +Check out WireMock Quick-starts and tutorials [here](./getting-started.md). ## WireMock Ecosystem diff --git a/_docs/proxying.md b/_docs/proxying.md index d69eba5e..955e00a3 100644 --- a/_docs/proxying.md +++ b/_docs/proxying.md @@ -12,7 +12,7 @@ default proxied to another (possibly real, live) service, but where specific stubs are configured these are returned in place of the remote service's response. Responses that the live service can't be forced to generate on demand can thus be injected for testing. Proxying also -supports [record and playback](../record-playback/). +supports [record and playback](./record-playback.md). # Proxy stub mappings @@ -121,14 +121,14 @@ or } ``` -You can also add response headers via the same method as for non-proxy responses (see [Stubbing](../stubbing/)). +You can also add response headers via the same method as for non-proxy responses (see [Stubbing](./stubbing.md)). ## Standalone shortcut It is possible to start the standalone running with the catch-all stub already configured: -Then it's simply a case of adding your stub mapping `.json` files under `mappings` as usual (see [Stubbing](../stubbing/)). +Then it's simply a case of adding your stub mapping `.json` files under `mappings` as usual (see [Stubbing](./stubbing.md)). ## Running as a browser proxy @@ -144,9 +144,9 @@ $ java -jar wiremock-standalone-{{ site.wiremock_version }}.jar --enable-browser ``` Then open your browser's proxy settings and point them to the running server: -Firefox proxy screenshot +Firefox proxy screenshot -After that, you can configure stubs as described in [Running Standalone](../running-standalone#configuring-wiremock-using-the-java-client) and then browse to a website. Any resources fetched whose requests are matched by stubs you have configured will be overridden by the stub's response. +After that, you can configure stubs as described in [Running Standalone](./standalone/java-jar.md#configuring-wiremock-using-the-java-client) and then browse to a website. Any resources fetched whose requests are matched by stubs you have configured will be overridden by the stub's response. So for instance, say you're visiting a web page that fetches a user profile via an AJAX call to `/users/12345.json` and you wanted to test how it responded to a server unavailable response. You could create a stub like this and the response from the server would be swapped for a 503 response: @@ -159,7 +159,7 @@ stubFor(get(urlEqualTo("/users/12345.json")) Also, we can enable/disable pass through unmatched requests to the target indicated by the original requests by enabling/disabling proxyPassThrough flag. By default, flag is set to true. -This flag can be enabled/disabled at startup either by passing CLI option while running jar as described in [Running Standalone](../running-standalone#command-line-options) or by passing as options in Java client as shown below. +This flag can be enabled/disabled at startup either by passing CLI option while running jar as described in [Running Standalone](./standalone/java-jar.md#command-line-options) or by passing as options in Java client as shown below. ```java WireMockServer wireMockServer = new WireMockServer(options().proxyPassThrough(false)); @@ -167,7 +167,8 @@ WireMockServer wireMockServer = new WireMockServer(options().proxyPassThrough(fa We can also update this flag without WireMock restart either by using Admin API as described in [API section](../api/#tag/System/paths/~1__admin~1settings/post) if we are running as standalone or by updating the global settings in Java client. -Json payload to update via admin API +Json payload to update via admin API: + ```json { ... @@ -314,4 +315,4 @@ public WireMockRule wireMockRule = new WireMockRule(wireMockConfig() .trustStorePassword("mostsecret")); // Defaults to "password" if omitted ``` -See [Running as a Standalone Process](../running-standalone/) for command line equivalent. +See [Running as a Standalone Process](./standalone/java-jar.md) for command line equivalent. diff --git a/_docs/quickstart/java-junit.md b/_docs/quickstart/java-junit.md index b4a0578d..21e37907 100644 --- a/_docs/quickstart/java-junit.md +++ b/_docs/quickstart/java-junit.md @@ -78,7 +78,7 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -... +// ... @Test public void exampleTest() { @@ -142,7 +142,7 @@ int httpsPort = wireMockRule.httpsPort(); ## Further reading -- For more details on verifying requests and stubbing responses, see [Stubbing](../../stubbing) and [Verifying](../../verifying/) -- For more information on the JUnit rules see [The JUnit 4 Rule](../../junit-4/). +- For more details on verifying requests and stubbing responses, see [Stubbing](./../stubbing.md) and [Verifying](./../verifying.md) +- For more information on the JUnit rules see [The JUnit 4 Rule](./../junit-extensions.md). - For many more examples of JUnit tests check out the [WireMock's own acceptance tests](https://github.com/wiremock/wiremock/tree/master/src/test/java/com/github/tomakehurst/wiremock) diff --git a/_docs/record-playback.md b/_docs/record-playback.md index fa864ab2..79cdeb94 100644 --- a/_docs/record-playback.md +++ b/_docs/record-playback.md @@ -17,11 +17,11 @@ Both approaches are described in more detail below. The fastest way to get started with WireMock's recorder is to use the simple web UI provided. -First, start an instance of [WireMock running standalone](../running-standalone). +First, start an instance of [WireMock running standalone](./standalone.md). Once that's running visit the recorder UI page at [http://localhost:8080/\_\_admin/recorder](http://localhost:8080/__admin/recorder) (assuming you started WireMock on the default port of 8080). -![Recorder UI]({{ '/images/recorder-screenshot.png' | absolute_url }}) +![Recorder UI](images/recorder-screenshot.png) Enter the URL you wish to record from in the target URL field and click the Record button. You can use `http://examples.wiremockapi.cloud` to try it out. @@ -96,7 +96,7 @@ Snapshotting is effectively "recording after the fact". Rather than starting rec into stub mappings. An implication of this order of events is that if you want to record an external API, you'll need to have configured proxying before you start generating traffic. -See [Proxying](../proxying) for details on proxy configuration, but in summary this can be achieved by creating a proxy mapping via the API or Java DSL: +See [Proxying](./proxying.md) for details on proxy configuration, but in summary this can be achieved by creating a proxy mapping via the API or Java DSL: Java: @@ -268,7 +268,7 @@ The following sections will detail each parameter in turn: ### Filtering -`filters` supports selection of requests to be recorded according to the same [request matcher](../request-matching) format used elsewhere in WireMock. +`filters` supports selection of requests to be recorded according to the same [request matcher](./request-matching.md) format used elsewhere in WireMock. Additionally, when snapshotting the `ids` parameter allows specific serve events to be selected by ID. @@ -328,7 +328,7 @@ What happens when the recorder sees two identical requests that produce differen There are two ways to handle this. Setting `repeatsAsScenarios` to `false` means that after the first request, subsequent identical ones will be ignored. -However, when set to `true` (which is the default if omitted), multiple identical requests will be added to a [Scenario](../stateful-behaviour), meaning that when +However, when set to `true` (which is the default if omitted), multiple identical requests will be added to a [Scenario](./stateful-behaviour.md), meaning that when playing back, a series of requests matching this stub will yield the same series of responses captured during recording. If more requests are made after the end of the series is reached, the last response will continue to be returned. @@ -336,7 +336,7 @@ is reached, the last response will continue to be returned. If you need even more control over how your recorded stubs are generated, you can write one or more custom transformers that will be applied to stubs as they are captured. -A transformer is an implementations of `StubMappingTransformer` and needs to be registered when starting WireMock as described in [Extending WireMock](../extending-wiremock). +A transformer is an implementations of `StubMappingTransformer` and needs to be registered when starting WireMock as described in [Extending WireMock](./extending-wiremock.md). Transformer implementations supply a name, and this is used to identify them in the `transformers` parameter e.g. diff --git a/_docs/request-matching.md b/_docs/request-matching.md index da010098..8175e30d 100644 --- a/_docs/request-matching.md +++ b/_docs/request-matching.md @@ -6,7 +6,8 @@ toc_rank: 61 description: WireMock supports matching of requests to stubs and verification queries using the following attributes. --- -WireMock enables flexible definition of a [mock API](/) by supporting rich matching of incoming requests. Stub matching and verification queries can use the following request attributes: +WireMock enables flexible definition of a mock APIs by supporting rich matching of incoming requests. +Stub matching and verification queries can use the following request attributes: - URL - HTTP Method @@ -18,7 +19,7 @@ WireMock enables flexible definition of a [mock API](/) by supporting rich match - Request body - Multipart/form-data -Here's an example showing all attributes being matched using WireMock's in-built match operators. It is also possible to write [custom matching logic](../extending-wiremock#custom-request-matchers) if +Here's an example showing all attributes being matched using WireMock's in-built match operators. It is also possible to write [custom matching logic](./extending-wiremock.md#custom-request-matchers) if you need more precise control: ## Request with XML Body @@ -221,7 +222,7 @@ WireMock from 3.0.0 onwards supports matching on URL path templates conforming t When the path template URL match type is used this enables 1. The ability to match path variables in the same way as query parameters, headers etc. -2. The ability to reference path variables by name in [response templates](../response-templating/#the-request-model). +2. The ability to reference path variables by name in [response templates](./response-templating.md#the-request-model). To match any request URL that conforms to the path template, you can do the following. diff --git a/_docs/response-templating.md b/_docs/response-templating.md index cf3635b4..45f7257e 100644 --- a/_docs/response-templating.md +++ b/_docs/response-templating.md @@ -28,14 +28,14 @@ WireMockServer wm = new WireMockServer(options().templatingEnabled(false)); ``` -See [the command line docs](../standalone/java-jar/#command-line-options) for the standalone equivalents of these parameters. +See [the command line docs](./standalone/java-jar.md#command-line-options) for the standalone equivalents of these parameters. ## Customising and extending the template engine -Custom Handlebars helpers can be registered via an extension point. See [Adding Template Helpers](../extensibility/adding-template-helpers/) for details. +Custom Handlebars helpers can be registered via an extension point. See [Adding Template Helpers](./extensibility/adding-template-helpers.md) for details. -Similarly custom model data providers can be registered as extensions. See [Adding Template Model Data](../extensibility/adding-template-model-data/) for details. +Similarly custom model data providers can be registered as extensions. See [Adding Template Model Data](./extensibility/adding-template-model-data.md) for details. ## Applying templating in local mode @@ -86,7 +86,7 @@ WireMockServer wm = new WireMockServer(options().withMaxTemplateCacheEntries(10000)); ``` -See [the command line docs](../standalone/java-jar/#command-line-options) for the equivalent configuration setting when running standalone. +See [the command line docs](./standalone/java-jar.md#command-line-options) for the equivalent configuration setting when running standalone. ## Proxying @@ -557,7 +557,7 @@ Dates can be truncated to e.g. first day of month using the `truncateDate` helpe {% endraw %} -See the [full list of truncations here](../request-matching#all-truncations). +See the [full list of truncations here](./request-matching.md#all-truncations). ## Random value helper diff --git a/_docs/running-without-http-server.md b/_docs/running-without-http-server.md index 86c7d3fc..51d7da86 100644 --- a/_docs/running-without-http-server.md +++ b/_docs/running-without-http-server.md @@ -6,7 +6,7 @@ toc_rank: 42 description: Running WireMock inside a Java process, without running the inbuilt HTTP layer. --- -If you want to run Wiremock inside another process, such as wrapping it in a serverless function such as on AWS Lambda, or using it as part of an application's integration tests, you previously would need to resort to [Running as a Standalone Process](../running-standalone/). +If you want to run Wiremock inside another process, such as wrapping it in a serverless function such as on AWS Lambda, or using it as part of an application's integration tests, you previously would need to resort to [Running as a Standalone Process](./standalone/java-jar.md). This works well, but has the overhead of a full HTTP server and HTTP calls back and forth that in some cases may not be relevant, and adds a fair bit of overhead to each call, and the memory footprint of the application. diff --git a/_docs/solutions/README.md b/_docs/solutions/README.md new file mode 100644 index 00000000..77454dc4 --- /dev/null +++ b/_docs/solutions/README.md @@ -0,0 +1,3 @@ +# WireMock Solutions + +See the [documentation landing](../index.html) diff --git a/_docs/solutions/android.md b/_docs/solutions/android.md index 61c5f984..2c99ad1c 100644 --- a/_docs/solutions/android.md +++ b/_docs/solutions/android.md @@ -25,6 +25,6 @@ References: ## Useful pages -- [WireMock and Kotlin](../kotlin) - Android ecosystem embraces Kotlin as a development language, +- [WireMock and Kotlin](./kotlin.md) - Android ecosystem embraces Kotlin as a development language, and there are some additional tooling available -- [WireMock on Java and JVM](../jvm) - Some of JVM generic solutions are applicable to Android development too +- [WireMock on Java and JVM](./jvm.md) - Some of JVM generic solutions are applicable to Android development too diff --git a/_docs/solutions/c_cpp.md b/_docs/solutions/c_cpp.md index 832036f9..fdab5033 100644 --- a/_docs/solutions/c_cpp.md +++ b/_docs/solutions/c_cpp.md @@ -9,11 +9,11 @@ og_image: solutions/testcontainers/testcontainers_c_opengraph.png ## Testcontainers for C/C++ module -Testcontainers C +Testcontainers C Recently we created an experimental WireMock module for [Testcontainers for C/C++](https://github.com/oleg-nenashev/testcontainers-c). -It allows provisioning the WireMock server as a standalone container within your tests, based on [WireMock Docker](/docker). +It allows provisioning the WireMock server as a standalone container within your tests, based on [WireMock Docker](../standalone/docker.md). It allows using WireMock with all popular C/C++ testing frameworks like Google Test, CTest, Doctest, QtTest or CppUnit. @@ -78,4 +78,4 @@ Sending HTTP requests printf("Server Response: HTTP-%d\n%s\n\n", response.r0, response.r1); return 0; } -``` \ No newline at end of file +``` diff --git a/_docs/solutions/golang.md b/_docs/solutions/golang.md index 96ef75aa..6ef66c37 100644 --- a/_docs/solutions/golang.md +++ b/_docs/solutions/golang.md @@ -55,7 +55,7 @@ References: ## Go WireMock - WireMock REST API client -The Golang client library to stub API resources in WireMock using its [Administrative REST API](../../standalone/administration). +The Golang client library to stub API resources in WireMock using its [Administrative REST API](../standalone/administration.md). The project connects to the instance and allows setting up stubs and response templating, or using administrative API to extract observability data. References: @@ -86,5 +86,5 @@ func TestSome(t *testing.T) { ## Useful pages -- [WireMock and Docker](../docker) -- [WireMock and Kubernetes](../kubernetes) +- [WireMock and Docker](../standalone/docker.md) +- [WireMock and Kubernetes](./kubernetes.md) diff --git a/_docs/solutions/groovy.md b/_docs/solutions/groovy.md index 400f251c..b41f730c 100644 --- a/_docs/solutions/groovy.md +++ b/_docs/solutions/groovy.md @@ -45,4 +45,4 @@ def "test using groovy truth if you need at least one request and shows example ## Useful pages -- [WireMock on Java and JVM](../solutions/jvm) - Most of JVM generic solutions are applicable to Groovy development too +- [WireMock on Java and JVM](./jvm.md) - Most of JVM generic solutions are applicable to Groovy development too diff --git a/_docs/solutions/jvm.md b/_docs/solutions/jvm.md index ff6c06d9..ac032429 100644 --- a/_docs/solutions/jvm.md +++ b/_docs/solutions/jvm.md @@ -14,13 +14,13 @@ and there are plenty of solutions when developing applications powered by the Ja _WireMock_, also known as _WireMock Java_ is the flagman implementation of WireMock functionality and specifications, maintained on the WireMock GitHub organization. -It is included into many distributions (including [WireMock Docker](../docker)), test framework adapters and products. +It is included into many distributions (including [WireMock Docker](../standalone/docker.md)), test framework adapters and products. Most of the documentation on this website is about _WireMock Java_, unless specified explicitly. Usage: -- [Running WireMock as a Standalone server](../../running-standalone) -- [Using WireMock in plain Java without frameworks](../../java-usage) +- [Running WireMock as a Standalone server](../standalone.md) +- [Using WireMock in plain Java without frameworks](./../java-usage.md) References: @@ -31,24 +31,24 @@ References: WireMock has integrations with many popular Java test frameworks for unit and integration testing. -- [JUnit 5+ and Jupiter](../../junit-5) -- [JUnit 4 and Vintage](../../junit-4) +- [JUnit 5+ and Jupiter](../junit-jupiter.md) +- [JUnit 4 and Vintage](../junit-extensions.md) - [Testcontainers Java](https://github.com/wiremock/wiremock-testcontainers-java) - [Spock](https://github.com/felipefzdz/spock-wiremock-extension) - maintained outside WireMock's organization on GitHub ## WireMock Extensions -_WireMock Java_ is [extensible](../../extending-wiremock), +_WireMock Java_ is [extensible](../extending-wiremock.md), and there is a number of available extensions that can be included into WireMock to extend its functionality, including but not limited to request filters, observability, storage, etc. A few popular extensions: - Response Template Transformer - - [Documentation](../../response-templating) + - [Documentation](../response-templating.md) - This extension is a built-in part of the WireMock Java, but needs to be enabled explicitly - Webhooks - - [Documentation](../../webhooks-and-callbacks/) + - [Documentation](../webhooks-and-callbacks.md) - JSON Body Transformer, Callback Simulator, Request time matcher - [9cookies/wiremock-extensions](https://github.com/9cookies/wiremock-extensions) Active @@ -60,9 +60,9 @@ Active Here are references to particular JVM technologies and languages, sorted by alphabet: -- [Android](../android) +- [Android](./android.md) - [Clojure](https://docs.google.com/document/d/1TQccT9Bk-o2lvRVN8_mMaGttaOnwbYFLkn0DsmwGIOA/edit#heading=h.gvb3rxc1ab9p) -- [Groovy](../groovy) -- [Kotlin](../kotlin) +- [Groovy](./groovy.md) +- [Kotlin](./kotlin.md) - [Scala](https://docs.google.com/document/d/1TQccT9Bk-o2lvRVN8_mMaGttaOnwbYFLkn0DsmwGIOA/edit#heading=h.gvb3rxc1ab9p) -- [Spring Boot](../spring-boot) +- [Spring Boot](./spring-boot.md) diff --git a/_docs/solutions/kotlin.md b/_docs/solutions/kotlin.md index 322b90d8..a7933314 100644 --- a/_docs/solutions/kotlin.md +++ b/_docs/solutions/kotlin.md @@ -63,4 +63,3 @@ References: - [Documentation](https://kotest.io/docs/extensions/wiremock.html) - [GitHub repo: kotest/kotest-extensions-wiremock](https://github.com/kotest/kotest-extensions-wiremock) - diff --git a/_docs/solutions/kubernetes.md b/_docs/solutions/kubernetes.md index 5e22728b..08f1956d 100644 --- a/_docs/solutions/kubernetes.md +++ b/_docs/solutions/kubernetes.md @@ -35,4 +35,4 @@ References: ## Useful pages -- [WireMock and Golang](../golang) - There's WireMock for Golang developers too! +- [WireMock and Golang](./golang.md) - There's WireMock for Golang developers too! diff --git a/_docs/solutions/nodejs.md b/_docs/solutions/nodejs.md index 47f9f867..f18d481e 100644 --- a/_docs/solutions/nodejs.md +++ b/_docs/solutions/nodejs.md @@ -47,7 +47,7 @@ describe('Integration with WireMock', () => { ## WireMock REST Client The WireMock REST client is a lightweight module to interact with a running -WireMock server based on its [OpenAPI 3.0 spec](../../api) via REST API. +WireMock server based on its [OpenAPI 3.0 spec](../standalone/admin-api-reference.md) via REST API. Note that this library is maintained outside the WireMock organization on GitHub. - [GitHUb Repository](https://github.com/kwoding/wiremock-rest-client) diff --git a/_docs/solutions/python.md b/_docs/solutions/python.md index 8f4f2f93..ea90813c 100644 --- a/_docs/solutions/python.md +++ b/_docs/solutions/python.md @@ -13,7 +13,7 @@ hide-disclaimer: true **Python WireMock** is a library that allows users to interact with a WireMock instance from within a Python project. Key features include: -- [Testcontainers Python](../testcontainers) module to easily start WireMock server for your tests +- [Testcontainers Python](./testcontainers.md) module to easily start WireMock server for your tests - REST API Client for a standalone WireMock Java server - Support for most of the major WireMock features (more on their way soon) diff --git a/_docs/solutions/rust.md b/_docs/solutions/rust.md index 150db781..1477fc41 100644 --- a/_docs/solutions/rust.md +++ b/_docs/solutions/rust.md @@ -79,7 +79,7 @@ References: ## Testcontainers module We are interested in providing a Testcontainers for Rust module that -would provide SDK for the official [WireMock Docker images](../../docker). +would provide SDK for the official [WireMock Docker images](../standalone/docker.md). This module is on our roadmap but have not been published yet, see [wiremock/ecosystem #8](https://github.com/wiremock/ecosystem/issues/8). Contributions are welcome! diff --git a/_docs/solutions/spring-boot.md b/_docs/solutions/spring-boot.md index 7412171d..b166461e 100644 --- a/_docs/solutions/spring-boot.md +++ b/_docs/solutions/spring-boot.md @@ -59,4 +59,4 @@ from Pivotal's blog shows how WireMock can be used to test Spring apps that use ## Useful pages -- [WireMock on Java and JVM](../solutions/jvm) - Most of JVM generic solutions are applicable to Spring Boot development too +- [WireMock on Java and JVM](./jvm.md) - Most of JVM generic solutions are applicable to Spring Boot development too diff --git a/_docs/solutions/testcontainers.md b/_docs/solutions/testcontainers.md index 89150cc6..6c474c17 100644 --- a/_docs/solutions/testcontainers.md +++ b/_docs/solutions/testcontainers.md @@ -15,7 +15,7 @@ All the modules are under active development. If there is no module implemented for your technology stack, a `GenericContainer` implementation from Testcontainers can be used. For features that are not implemented yet in Module APIs for your language, -it is possible to use the [Administrative REST API](../../standalone/administration). +it is possible to use the [Administrative REST API](../standalone/administration.md). Feedback and contributions are welcome! See WireMock on the [Testcontainers modules listing](https://testcontainers.com/modules/wiremock/). @@ -46,17 +46,17 @@ for all documentation and examples. Golang implementation is a multi-platform library that includes the Testcontainers module only. The module's full documentation and examples are available in its [GitHub Repository](https://github.com/wiremock/wiremock-testcontainers-go). -There is a separate library for the CLI, see the [Golang Solutions page](../golang). +There is a separate library for the CLI, see the [Golang Solutions page](./golang.md). ## Experimental modules **C/C++ and other native languages.** We created a WireMock module for [Testcontainers for C/C++](https://github.com/oleg-nenashev/testcontainers-c). -It allows provisioning the WireMock server as a standalone container within your tests, based on [WireMock Docker](/docker). +It allows provisioning the WireMock server as a standalone container within your tests, based on [WireMock Docker](../standalone/docker.md). It allows using WireMock with all popular C/C++ testing frameworks like Google Test, CTest, Doctest, QtTest or CppUnit. -Read More: [C/C++ Solutions Page](../c_cpp). +Read More: [C/C++ Solutions Page](./c_cpp.md). ## Other Languages diff --git a/_docs/standalone.md b/_docs/standalone.md index cb3e49d5..5358e077 100644 --- a/_docs/standalone.md +++ b/_docs/standalone.md @@ -14,18 +14,17 @@ We provide the JAR file and Docker image distributions for it. ## Running WireMock -- [Running as a Docker Image](../docker) -- [Running as a JAR file](./java-jar) +- [Running as a Docker Image](./standalone/docker.md) +- [Running as a JAR file](./standalone/java-jar.md) ## Management When WireMock runs as a standalone service, it can be managed through its REST API. -- [WireMock Administration](./administration) -- [Admin API Reference](./admin-api-reference/) +- [WireMock Administration](./standalone/administration.md) +- [Admin API Reference](./standalone/admin-api-reference.md) ## API Clients There is a number of API clients that work with the standalone WireMock instance. -Check out the [Solution pages](../../docs) for more info and pointers. - +Check out the [Solution pages](./solutions/README.md) for more info and pointers. diff --git a/_docs/standalone/administration.md b/_docs/standalone/administration.md index ff573545..c976282b 100644 --- a/_docs/standalone/administration.md +++ b/_docs/standalone/administration.md @@ -21,4 +21,4 @@ post a request with an empty body to `http://:/__admin/shutdown`. ## Full specification -The full specification is available [here](../admin-api-reference). +The full specification is available [here](./admin-api-reference.md). diff --git a/_docs/standalone/docker.md b/_docs/standalone/docker.md index e392ded5..62a8113f 100644 --- a/_docs/standalone/docker.md +++ b/_docs/standalone/docker.md @@ -22,7 +22,7 @@ docker run -it --rm \ ### Start with command line arguments -The Docker image supports exactly the same set of command line arguments as the [standalone version](../java-jar#command-line-options). +The Docker image supports exactly the same set of command line arguments as the [standalone version](../standalone/java-jar.md#command-line-options). These can be passed to the container by appending them to the end of the command e.g.: ```sh @@ -63,10 +63,10 @@ docker run -it --rm \ ### Running with extensions -[WireMock extensions](../../extending-wiremock/) are packaged as JAR files. In order to use them they need to be made +[WireMock extensions](../extending-wiremock.md) are packaged as JAR files. In order to use them they need to be made available at runtime and WireMock must be configured to enable them. -For example, to use the [Webhooks extension](../../webhooks-and-callbacks/) we would first download [wiremock-webhooks-extension-{{ site.wiremock_version }}.jar](https://repo1.maven.org/maven2/org/wiremock/wiremock-webhooks-extension/{{ site.wiremock_version }}/wiremock-webhooks-extension-{{ site.wiremock_version }}.jar) +For example, to use the [Webhooks extension](../webhooks-and-callbacks.md) we would first download [wiremock-webhooks-extension-{{ site.wiremock_version }}.jar](https://repo1.maven.org/maven2/org/wiremock/wiremock-webhooks-extension/{{ site.wiremock_version }}/wiremock-webhooks-extension-{{ site.wiremock_version }}.jar) into the `extensions` directory under our working directory. Then when starting Docker we would mount the extensions directory to `/var/wiremock/extensions` and enable the webhooks extension diff --git a/_docs/standalone/java-jar.md b/_docs/standalone/java-jar.md index d3294774..eb0bb49d 100644 --- a/_docs/standalone/java-jar.md +++ b/_docs/standalone/java-jar.md @@ -9,7 +9,7 @@ description: The WireMock server can be run in its own process, and configured v The WireMock server can be run in its own process, and configured via the Java API, JSON over HTTP or JSON files. -Once you have [downloaded the standalone JAR](../../download) you can run it simply by doing this: +Once you have [downloaded the standalone JAR](./../download-and-installation.md) you can run it simply by doing this: ```bash $ java -jar wiremock-standalone-{{ site.wiremock_version }}.jar @@ -47,8 +47,8 @@ sets the keystore password value. The key manager password can be set with the ( `--https-truststore`: Path to a keystore file containing client public certificates, proxy target public certificates & private keys to use when authenticate with a proxy target that require client authentication. Can be a path to a file or a resource on the classpath. See -[HTTPS configuration](../../configuration#https-configuration) -and [Running as a browser proxy](../../proxying#running-as-a-browser-proxy) for +[HTTPS configuration](./../configuration.md#https-configuration) +and [Running as a browser proxy](./../proxying.md#running-as-a-browser-proxy) for details. `--truststore-type`: The HTTPS trust store type. Usually JKS or PKCS12. @@ -57,7 +57,7 @@ details. to "password" if not specified. `--https-require-client-cert`: Force clients to authenticate with a -client certificate. See [HTTPS](../../https/) for details. +client certificate. See [HTTPS](./../https.md) for details. `--verbose`: Turn on verbose logging to stdout @@ -65,10 +65,10 @@ client certificate. See [HTTPS](../../https/) for details. `__files` reside. This defaults to the current directory. `--record-mappings`: Record incoming requests as stub mappings. See -[Record and Playback](../../record-playback/). +[Record and Playback](./../record-playback.md). `--match-headers`: When in record mode, capture request headers with the -keys specified. See [Record and Playback](../../record-playback/). +keys specified. See [Record and Playback](./../record-playback.md). `--proxy-all`: Proxy all requests through to another base URL e.g. `--proxy-all="http://api.someservice.com"` Typically used in conjunction @@ -90,7 +90,7 @@ internet access via an opaque proxy). e.g. e.g. `--proxy-via http://username:password@webproxy.mycorp.com:8080/`. `--enable-browser-proxying`: Run as a browser proxy. See -[Running as a browser proxy](../../proxying#running-as-a-browser-proxy). +[Running as a browser proxy](./../proxying.md#running-as-a-browser-proxy). `--ca-keystore`: A key store containing a root Certificate Authority private key and certificate that can be used to sign generated certificates when @@ -144,7 +144,7 @@ Recommended when using WireMock for performance testing with delays, as it allow Effective only with `asynchronousResponseEnabled=true`. Defaults to 10. `--extensions`: Extension class names e.g. -com.mycorp.HeaderTransformer,com.mycorp.BodyTransformer. See [Extending WireMock](../../extending-wiremock/). +com.mycorp.HeaderTransformer,com.mycorp.BodyTransformer. See [Extending WireMock](./../extending-wiremock.md). `--print-all-network-traffic`: Print all raw incoming and outgoing network traffic to console. @@ -169,9 +169,9 @@ The last of these will cause chunked encoding to be used only when a stub define `--logged-response-body-size-limit`: Set a limit in bytes beyond which response bodies in the log will be truncated. When enabled this helps avoid out of memory errors when serving large response bodies. -`--allow-proxy-targets`: Limit the permitted targets for proxying to and recording from the supplied addressess. This parameter takes a comma-separated list of single IP addresses, IP address ranges and hostname wildcards. See [this article](../../configuration#preventing-proxying-to-and-recording-from-specific-target-addresses) for details. +`--allow-proxy-targets`: Limit the permitted targets for proxying to and recording from the supplied addressess. This parameter takes a comma-separated list of single IP addresses, IP address ranges and hostname wildcards. See [this article](./../configuration.md#preventing-proxying-to-and-recording-from-specific-target-addresses) for details. -`--deny-proxy-targets`: Prevent proxying to and recording from the supplied addressess. This parameter takes a comma-separated list of single IP addresses, IP address ranges and hostname wildcards. Note: if both `--allow-proxy-targets` and this parameter are set, the allow list will be evaluated first. See [this article](../../configuration#preventing-proxying-to-and-recording-from-specific-target-addresses) for details. +`--deny-proxy-targets`: Prevent proxying to and recording from the supplied addressess. This parameter takes a comma-separated list of single IP addresses, IP address ranges and hostname wildcards. Note: if both `--allow-proxy-targets` and this parameter are set, the allow list will be evaluated first. See [this article](./../configuration.md#preventing-proxying-to-and-recording-from-specific-target-addresses) for details. `--proxy-timeout`: Set the timeout for requests to the proxy in milliseconds @@ -217,7 +217,7 @@ $ curl http://localhost:8080/get/this Here it is! ``` -The full stubbing API syntax is described in [Stubbing](../../stubbing/). +The full stubbing API syntax is described in [Stubbing](./../stubbing.md). ## JSON file configuration @@ -248,7 +248,7 @@ $ curl http://localhost:8080/api/mytest More content ``` -See [stubbing](../../stubbing/) and [verifying](../../verifying/) for more on the JSON API. +See [stubbing](./../stubbing.md) and [verifying](./../verifying.md) for more on the JSON API. ### Multi-stub JSON files diff --git a/_docs/stateful-behaviour.md b/_docs/stateful-behaviour.md index 74c6f39c..97ad052f 100644 --- a/_docs/stateful-behaviour.md +++ b/_docs/stateful-behaviour.md @@ -177,4 +177,4 @@ PUT /__admin/scenarios/my_scenario/state { "state": "state_2" } -``` \ No newline at end of file +``` diff --git a/_docs/stub-metadata.md b/_docs/stub-metadata.md index 4cb6e579..4c9c5f19 100644 --- a/_docs/stub-metadata.md +++ b/_docs/stub-metadata.md @@ -48,7 +48,7 @@ Data under the `metadata` key is a JSON object (represented in Java by a `Map Date: Tue, 21 Nov 2023 22:07:31 +0100 Subject: [PATCH 13/71] Add MkDocs build to CI --- .github/workflows/ci.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c70aa783..9f7c059d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,6 +36,23 @@ jobs: run: bundle exec jekyll build --config '_config.yml' --baseurl "${{ steps.pages.outputs.base_path }}" env: JEKYLL_ENV: development + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Build the docs + run: mkdocs build + - name: Build 2.x with Jekyll # Outputs to the './_site' directory by default run: | @@ -52,6 +69,7 @@ jobs: # with: # directory: ./_site # enforce_https: false - - name: Upload artifact - # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v1 + +# - name: Upload artifact +# # Automatically uploads an artifact from the './_site' directory by default +# uses: actions/upload-pages-artifact@v1 From 94087eb417f4742f1ecbf724660c0127c3ae47a5 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:09:35 +0100 Subject: [PATCH 14/71] Fix the requirements file --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fa641aec..267e4957 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ mergedeep==1.3.4 mkdocs==1.5.3 mkdocs-multirepo-plugin==0.6.3 mkdocs-material==9.4.5 -mkdocs-redirects=1.2.1 +mkdocs-redirects==1.2.1 click==8.1.7 dacite==1.8.1 ghp-import==2.1.0 From 97b05aa264324388fd132514d269d75447a31953 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:16:06 +0100 Subject: [PATCH 15/71] Add staging deployment pipeline --- .github/workflows/deploy-mkdocs-preview.yaml | 111 +++++++++++++++++++ _config-oleg-nenashev-2.x.yml | 1 + _config-oleg-nenashev-3.x.yml | 1 + _config-oleg-nenashev.yml | 1 + 4 files changed, 114 insertions(+) create mode 100644 .github/workflows/deploy-mkdocs-preview.yaml create mode 100644 _config-oleg-nenashev-2.x.yml create mode 100644 _config-oleg-nenashev-3.x.yml create mode 100644 _config-oleg-nenashev.yml diff --git a/.github/workflows/deploy-mkdocs-preview.yaml b/.github/workflows/deploy-mkdocs-preview.yaml new file mode 100644 index 00000000..ae344793 --- /dev/null +++ b/.github/workflows/deploy-mkdocs-preview.yaml @@ -0,0 +1,111 @@ +name: Deploy Jekyll site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main", "mkdocs-migration"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: "true" + - name: Setup Ruby + uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + with: + ruby-version: '2.7.6' # Not needed with a .ruby-version file + bundler: '2.4.10' + bundler-cache: false # runs 'bundle install' and caches installed gems automatically + cache-version: 3 # Increment this number if you need to re-download cached gems + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Update RubyGems and Co + run: gem update --system + - name: Install Ruby Bundles + run: bundle install + + - name: Build with Jekyll + # Outputs to the './_site' directory by default + run: bundle exec jekyll build --config '_config.yml._config-oleg-nenashev.yml' --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: 1.5.1 + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Build the docs site + run: mkdocs build + + - name: Build 2.x with Jekyll + # Outputs to the './_site' directory by default + run: | + cd .submodules/wiremock.org-2.x + bundle exec jekyll build --config '../../_config.yml,../../_config-2.x.yml,../../_config-oleg-nenashev-2.x.yml'' --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: Build 3.x with Jekyll + # We use the same as the root build, but with additional config + run: | + bundle exec jekyll build --config '_config.yml,_config-3.x.yml,_config-oleg-nenashev-3.x.yml' --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: Deploy version branches to the website + run: | + ruby .scripts/merge-sitemaps.rb + mkdir _site/2.x + cp -R .submodules/wiremock.org-2.x/tmp/site_2x/* _site/2.x/ + mkdir _site/3.x + cp -R tmp/site_3x/* _site/3.x/ + mkdir _site/docs + cp -R _site-docs/* _site/docs/ +# TODO: Uncomment when cleaned up (if ever) +# - name: Validate HTML and links +# uses: anishathalye/proof-html@v2 +# with: +# directory: ./_site +# enforce_https: false + - name: Upload artifact + # Automatically uploads an artifact from the './_site' directory by default + uses: actions/upload-pages-artifact@v1 + + # Deployment job + deploy: + environment: + name: mkdocs-preview + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/_config-oleg-nenashev-2.x.yml b/_config-oleg-nenashev-2.x.yml new file mode 100644 index 00000000..48bdbe85 --- /dev/null +++ b/_config-oleg-nenashev-2.x.yml @@ -0,0 +1 @@ +url: "https://oleg-nenashev.github.io/wiremock.org/2.x" diff --git a/_config-oleg-nenashev-3.x.yml b/_config-oleg-nenashev-3.x.yml new file mode 100644 index 00000000..1c656713 --- /dev/null +++ b/_config-oleg-nenashev-3.x.yml @@ -0,0 +1 @@ +url: "https://oleg-nenashev.github.io/wiremock.org/3.x" diff --git a/_config-oleg-nenashev.yml b/_config-oleg-nenashev.yml new file mode 100644 index 00000000..a8cad4cf --- /dev/null +++ b/_config-oleg-nenashev.yml @@ -0,0 +1 @@ +url: "https://oleg-nenashev.github.io/wiremock.org" From a043c4779353271b64be0be4caa95fde44db71c7 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:17:39 +0100 Subject: [PATCH 16/71] Fix the branch name --- .github/workflows/deploy-mkdocs-preview.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-mkdocs-preview.yaml b/.github/workflows/deploy-mkdocs-preview.yaml index ae344793..0f8b7a52 100644 --- a/.github/workflows/deploy-mkdocs-preview.yaml +++ b/.github/workflows/deploy-mkdocs-preview.yaml @@ -3,7 +3,7 @@ name: Deploy Jekyll site to Pages on: # Runs on pushes targeting the default branch push: - branches: ["main", "mkdocs-migration"] + branches: ["main", "mkdocs"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From bd609ce28bdb801f4bef3efec9d84747043acf9c Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:19:51 +0100 Subject: [PATCH 17/71] Rename deployment pipelines --- .github/workflows/deploy-mkdocs-preview.yaml | 4 ++-- .github/workflows/deploy.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-mkdocs-preview.yaml b/.github/workflows/deploy-mkdocs-preview.yaml index 0f8b7a52..a257d80e 100644 --- a/.github/workflows/deploy-mkdocs-preview.yaml +++ b/.github/workflows/deploy-mkdocs-preview.yaml @@ -1,4 +1,4 @@ -name: Deploy Jekyll site to Pages +name: Deploy Preview to GitHub Pages on: # Runs on pushes targeting the default branch @@ -46,7 +46,7 @@ jobs: - name: Build with Jekyll # Outputs to the './_site' directory by default - run: bundle exec jekyll build --config '_config.yml._config-oleg-nenashev.yml' --baseurl "${{ steps.pages.outputs.base_path }}" + run: bundle exec jekyll build --config '_config.yml,_config-oleg-nenashev.yml' --baseurl "${{ steps.pages.outputs.base_path }}" env: JEKYLL_ENV: production diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index adfb4b90..25f9baa8 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -1,4 +1,4 @@ -name: Deploy Jekyll site to Pages +name: Deploy to GitHub Pages on: # Runs on pushes targeting the default branch From fbe2b2913087847b16f8da104028f0ce31bf39ea Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:25:20 +0100 Subject: [PATCH 18/71] Use MkDocs to generate 3.x docs --- .github/workflows/deploy-mkdocs-preview.yaml | 16 ++++++++-------- .scripts/merge-sitemaps.rb | 14 ++++++++------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/workflows/deploy-mkdocs-preview.yaml b/.github/workflows/deploy-mkdocs-preview.yaml index a257d80e..9373c050 100644 --- a/.github/workflows/deploy-mkdocs-preview.yaml +++ b/.github/workflows/deploy-mkdocs-preview.yaml @@ -70,24 +70,24 @@ jobs: # Outputs to the './_site' directory by default run: | cd .submodules/wiremock.org-2.x - bundle exec jekyll build --config '../../_config.yml,../../_config-2.x.yml,../../_config-oleg-nenashev-2.x.yml'' --baseurl "${{ steps.pages.outputs.base_path }}" + bundle exec jekyll build --config '../../_config.yml,../../_config-2.x.yml,../../_config-oleg-nenashev-2.x.yml' --baseurl "${{ steps.pages.outputs.base_path }}" env: JEKYLL_ENV: production - - name: Build 3.x with Jekyll + #- name: Build 3.x with Jekyll # We use the same as the root build, but with additional config - run: | - bundle exec jekyll build --config '_config.yml,_config-3.x.yml,_config-oleg-nenashev-3.x.yml' --baseurl "${{ steps.pages.outputs.base_path }}" - env: - JEKYLL_ENV: production + # run: | + # bundle exec jekyll build --config '_config.yml,_config-3.x.yml,_config-oleg-nenashev-3.x.yml' --baseurl "${{ steps.pages.outputs.base_path }}" + # env: + # JEKYLL_ENV: production - name: Deploy version branches to the website run: | ruby .scripts/merge-sitemaps.rb mkdir _site/2.x cp -R .submodules/wiremock.org-2.x/tmp/site_2x/* _site/2.x/ - mkdir _site/3.x - cp -R tmp/site_3x/* _site/3.x/ mkdir _site/docs cp -R _site-docs/* _site/docs/ + mkdir -p _site/3.x/docs + cp -R _site-docs/* _site/3.x/docs/ # TODO: Uncomment when cleaned up (if ever) # - name: Validate HTML and links # uses: anishathalye/proof-html@v2 diff --git a/.scripts/merge-sitemaps.rb b/.scripts/merge-sitemaps.rb index 94ec37d3..3b9240d1 100644 --- a/.scripts/merge-sitemaps.rb +++ b/.scripts/merge-sitemaps.rb @@ -13,14 +13,16 @@ content_2x.slice!( -1 ) end -File.open( "./tmp/site_3x/sitemap.xml", 'r' ) do |f3| - content_3x = (IO.readlines f3) - content_3x.slice!( 0..11 ) - content_3x.slice!( -1 ) -end +#File.open( "./tmp/site_3x/sitemap.xml", 'r' ) do |f3| +# content_3x = (IO.readlines f3) +# content_3x.slice!( 0..11 ) +# content_3x.slice!( -1 ) +#end + +# TODO: Add MkDocs sitemap File.open( "_site/sitemap.xml", 'w' ) do |f4| - f4.write ( header + content_main + content_2x + content_3x + footer ).join() + f4.write ( header + content_main + content_2x + footer ).join() end From a09704df99d8bba1c688f9c148d301ee83d79ba9 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:48:16 +0100 Subject: [PATCH 19/71] Serve the documentation landing from Jekyll (for now) --- .github/workflows/deploy-mkdocs-preview.yaml | 3 +- _config-oleg-nenashev-2.x.yml | 3 +- _config-oleg-nenashev-3.x.yml | 3 +- _config-oleg-nenashev.yml | 3 +- _docs/index.html | 68 ++-- docs.html | 319 ++++++++++++++++++ images/logos/doc-sections/bug.svg | 13 + images/logos/doc-sections/download.svg | 24 ++ images/logos/doc-sections/edit.svg | 19 ++ images/logos/doc-sections/extensibility.svg | 4 + images/logos/doc-sections/help.svg | 51 +++ images/logos/doc-sections/home.svg | 6 + images/logos/doc-sections/quickstart.svg | 3 + images/logos/doc-sections/slack.svg | 1 + images/logos/doc-sections/summary.svg | 8 + images/logos/technology/android.svg | 25 ++ images/logos/technology/c.png | Bin 0 -> 23215 bytes images/logos/technology/cpp.png | Bin 0 -> 112631 bytes images/logos/technology/docker.svg | 7 + images/logos/technology/dotnet.svg | 2 + images/logos/technology/golang.svg | 2 + images/logos/technology/gradle.svg | 8 + images/logos/technology/graphql.svg | 8 + images/logos/technology/groovy.svg | 2 + images/logos/technology/grpc.png | Bin 0 -> 6207 bytes images/logos/technology/helm.svg | 7 + images/logos/technology/http.svg | 28 ++ images/logos/technology/https.svg | 28 ++ images/logos/technology/jar.svg | 41 +++ images/logos/technology/java.svg | 38 +++ images/logos/technology/kotlin.svg | 19 ++ images/logos/technology/kubernetes.svg | 2 + images/logos/technology/maven.svg | 2 + images/logos/technology/micronaut.svg | 1 + images/logos/technology/nodejs.svg | 8 + images/logos/technology/npm.svg | 5 + images/logos/technology/openshift.svg | 32 ++ images/logos/technology/php.svg | 7 + images/logos/technology/prometheus.svg | 8 + images/logos/technology/python.svg | 2 + images/logos/technology/quarkus.svg | 12 + images/logos/technology/ruby.svg | 121 +++++++ images/logos/technology/rust.svg | 6 + images/logos/technology/spring.svg | 7 + images/logos/technology/testcontainers.svg | 17 + images/logos/technology/webhooks.svg | 12 + .../images => images}/slack-logo-medium.png | Bin .../wiremock-cloud/wiremock_cloud_favicon.svg | 88 +++++ images/wiremock-cloud/wiremock_cloud_logo.png | Bin 0 -> 3237 bytes images/wiremock-cloud/wiremock_cloud_logo.svg | 12 + 50 files changed, 1047 insertions(+), 38 deletions(-) create mode 100644 docs.html create mode 100644 images/logos/doc-sections/bug.svg create mode 100644 images/logos/doc-sections/download.svg create mode 100644 images/logos/doc-sections/edit.svg create mode 100644 images/logos/doc-sections/extensibility.svg create mode 100644 images/logos/doc-sections/help.svg create mode 100644 images/logos/doc-sections/home.svg create mode 100644 images/logos/doc-sections/quickstart.svg create mode 100644 images/logos/doc-sections/slack.svg create mode 100644 images/logos/doc-sections/summary.svg create mode 100644 images/logos/technology/android.svg create mode 100644 images/logos/technology/c.png create mode 100644 images/logos/technology/cpp.png create mode 100644 images/logos/technology/docker.svg create mode 100644 images/logos/technology/dotnet.svg create mode 100644 images/logos/technology/golang.svg create mode 100644 images/logos/technology/gradle.svg create mode 100644 images/logos/technology/graphql.svg create mode 100644 images/logos/technology/groovy.svg create mode 100644 images/logos/technology/grpc.png create mode 100644 images/logos/technology/helm.svg create mode 100644 images/logos/technology/http.svg create mode 100644 images/logos/technology/https.svg create mode 100644 images/logos/technology/jar.svg create mode 100644 images/logos/technology/java.svg create mode 100644 images/logos/technology/kotlin.svg create mode 100644 images/logos/technology/kubernetes.svg create mode 100644 images/logos/technology/maven.svg create mode 100644 images/logos/technology/micronaut.svg create mode 100644 images/logos/technology/nodejs.svg create mode 100644 images/logos/technology/npm.svg create mode 100644 images/logos/technology/openshift.svg create mode 100644 images/logos/technology/php.svg create mode 100644 images/logos/technology/prometheus.svg create mode 100644 images/logos/technology/python.svg create mode 100644 images/logos/technology/quarkus.svg create mode 100644 images/logos/technology/ruby.svg create mode 100644 images/logos/technology/rust.svg create mode 100644 images/logos/technology/spring.svg create mode 100644 images/logos/technology/testcontainers.svg create mode 100644 images/logos/technology/webhooks.svg rename {_docs/images => images}/slack-logo-medium.png (100%) create mode 100644 images/wiremock-cloud/wiremock_cloud_favicon.svg create mode 100644 images/wiremock-cloud/wiremock_cloud_logo.png create mode 100644 images/wiremock-cloud/wiremock_cloud_logo.svg diff --git a/.github/workflows/deploy-mkdocs-preview.yaml b/.github/workflows/deploy-mkdocs-preview.yaml index 9373c050..1105b30a 100644 --- a/.github/workflows/deploy-mkdocs-preview.yaml +++ b/.github/workflows/deploy-mkdocs-preview.yaml @@ -84,6 +84,7 @@ jobs: ruby .scripts/merge-sitemaps.rb mkdir _site/2.x cp -R .submodules/wiremock.org-2.x/tmp/site_2x/* _site/2.x/ + rm _site-docs/index.html mkdir _site/docs cp -R _site-docs/* _site/docs/ mkdir -p _site/3.x/docs @@ -101,7 +102,7 @@ jobs: # Deployment job deploy: environment: - name: mkdocs-preview + name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build diff --git a/_config-oleg-nenashev-2.x.yml b/_config-oleg-nenashev-2.x.yml index 48bdbe85..066c2660 100644 --- a/_config-oleg-nenashev-2.x.yml +++ b/_config-oleg-nenashev-2.x.yml @@ -1 +1,2 @@ -url: "https://oleg-nenashev.github.io/wiremock.org/2.x" +url: "https://oleg-nenashev.github.io/wiremock.org" +baseurl: "wiremock.org/2.x/" diff --git a/_config-oleg-nenashev-3.x.yml b/_config-oleg-nenashev-3.x.yml index 1c656713..5e78d6cb 100644 --- a/_config-oleg-nenashev-3.x.yml +++ b/_config-oleg-nenashev-3.x.yml @@ -1 +1,2 @@ -url: "https://oleg-nenashev.github.io/wiremock.org/3.x" +url: "https://oleg-nenashev.github.io/" +baseurl: "wiremock.org/3.x" diff --git a/_config-oleg-nenashev.yml b/_config-oleg-nenashev.yml index a8cad4cf..b2815a8a 100644 --- a/_config-oleg-nenashev.yml +++ b/_config-oleg-nenashev.yml @@ -1 +1,2 @@ -url: "https://oleg-nenashev.github.io/wiremock.org" +url: "https://oleg-nenashev.github.io/" +baseurl: "wiremock.org/" diff --git a/_docs/index.html b/_docs/index.html index d3c2d44a..02d76401 100644 --- a/_docs/index.html +++ b/_docs/index.html @@ -69,21 +69,21 @@

Getting Started

@@ -99,15 +99,15 @@

Distributions

target="_blank" > WireMock Cloud (commercial SaaS) - + NPM
@@ -136,14 +136,14 @@

By use-case

Wiremock Features Advanced request matching wiremock dynamic response Dynamic response templating @@ -151,21 +151,21 @@

By use-case

wiremock unit tests Use API Mocking in your unit tests wiremock fault and latency Fault and latency injection wiremock record playback Record / Playback @@ -178,14 +178,14 @@

By use-case

-->
WireMock API Templates Use pre-defined Mock API templates Extending WireMock Extending WireMock @@ -202,19 +202,19 @@

By protocol

@@ -228,91 +228,91 @@

By technology

- + Java and JVM - + Python - + Spring Boot Node.js Android .NET Golang Rust Groovy Kotlin Kubernetes Testcontainers Quarkus C/C++ diff --git a/docs.html b/docs.html new file mode 100644 index 00000000..e380cdbf --- /dev/null +++ b/docs.html @@ -0,0 +1,319 @@ +--- +layout: docs +title: "WireMock User Documentation" +meta_title: "WireMock User Documentation | WireMock" +crumbtitle: "Documentation" +toc_rank: 1001 +permalink: /docs/ +docs-wide: true +description: > + All of WireMock’s features are accessible via its REST (JSON) interface and its Java API. + Additionally, stubs can be configured via JSON files. Read the full doc here. +--- + + + +

+ WireMock is a popular open-source tool for API mock testing, with over 5 + million downloads per month. It can help you to create stable test and + development environments, isolate yourself from flakey 3rd parties and + simulate APIs that don't exist yet. +

+ + +

Getting Started

+ + + +

Distributions

+ +

+ WireMock provides the following generic distributions that allow running it as + a + standalone server + in a container or within a Java Virtual Machine. +

+ + + +

By use-case

+ +

+ Below you can find links to the documentation for WireMock key use-cases. You + can find more documentation pages on the sidebar. +

+ + + +

By protocol

+ +

+ WireMock can serve all HTTP-based protocols and REST API. Through built-in + features and extensions, it provides additional capabilities for widely used + protocols. +

+ + + +

By technology

+ +

+ There are also solutions and guides for particular technologies and + frameworks, provided by the WireMock community and external contributors. +

+ + diff --git a/images/logos/doc-sections/bug.svg b/images/logos/doc-sections/bug.svg new file mode 100644 index 00000000..df6d6936 --- /dev/null +++ b/images/logos/doc-sections/bug.svg @@ -0,0 +1,13 @@ + + + + bug + + + + + + + + + \ No newline at end of file diff --git a/images/logos/doc-sections/download.svg b/images/logos/doc-sections/download.svg new file mode 100644 index 00000000..f534de16 --- /dev/null +++ b/images/logos/doc-sections/download.svg @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/images/logos/doc-sections/edit.svg b/images/logos/doc-sections/edit.svg new file mode 100644 index 00000000..359132ad --- /dev/null +++ b/images/logos/doc-sections/edit.svg @@ -0,0 +1,19 @@ + + + + + edit [#1479] + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/doc-sections/extensibility.svg b/images/logos/doc-sections/extensibility.svg new file mode 100644 index 00000000..5e7de1d7 --- /dev/null +++ b/images/logos/doc-sections/extensibility.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/images/logos/doc-sections/help.svg b/images/logos/doc-sections/help.svg new file mode 100644 index 00000000..352d91f7 --- /dev/null +++ b/images/logos/doc-sections/help.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/doc-sections/home.svg b/images/logos/doc-sections/home.svg new file mode 100644 index 00000000..730b9914 --- /dev/null +++ b/images/logos/doc-sections/home.svg @@ -0,0 +1,6 @@ + + + +home + + \ No newline at end of file diff --git a/images/logos/doc-sections/quickstart.svg b/images/logos/doc-sections/quickstart.svg new file mode 100644 index 00000000..3e65937a --- /dev/null +++ b/images/logos/doc-sections/quickstart.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/images/logos/doc-sections/slack.svg b/images/logos/doc-sections/slack.svg new file mode 100644 index 00000000..004e2663 --- /dev/null +++ b/images/logos/doc-sections/slack.svg @@ -0,0 +1 @@ +Slack \ No newline at end of file diff --git a/images/logos/doc-sections/summary.svg b/images/logos/doc-sections/summary.svg new file mode 100644 index 00000000..0a23259c --- /dev/null +++ b/images/logos/doc-sections/summary.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/android.svg b/images/logos/technology/android.svg new file mode 100644 index 00000000..27460deb --- /dev/null +++ b/images/logos/technology/android.svg @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/c.png b/images/logos/technology/c.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7dbd7ba43b533f4ea3b90b70e8339c4431a134 GIT binary patch literal 23215 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 be?aZx^a^>GHw6I5G>MVExn8}_-N*j}&t>S# literal 0 HcmV?d00001 diff --git a/images/logos/technology/cpp.png b/images/logos/technology/cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..aaeb184b06e66f210ecb8b522362ea4081379055 GIT binary patch literal 112631 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 T4v!YX51>Za^4IKNoWlPP>at~Z literal 0 HcmV?d00001 diff --git a/images/logos/technology/docker.svg b/images/logos/technology/docker.svg new file mode 100644 index 00000000..8529e9d8 --- /dev/null +++ b/images/logos/technology/docker.svg @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/images/logos/technology/dotnet.svg b/images/logos/technology/dotnet.svg new file mode 100644 index 00000000..f4a6b619 --- /dev/null +++ b/images/logos/technology/dotnet.svg @@ -0,0 +1,2 @@ + +logo_NET \ No newline at end of file diff --git a/images/logos/technology/golang.svg b/images/logos/technology/golang.svg new file mode 100644 index 00000000..dbbb46eb --- /dev/null +++ b/images/logos/technology/golang.svg @@ -0,0 +1,2 @@ + +file_type_go \ No newline at end of file diff --git a/images/logos/technology/gradle.svg b/images/logos/technology/gradle.svg new file mode 100644 index 00000000..fb75dfee --- /dev/null +++ b/images/logos/technology/gradle.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/graphql.svg b/images/logos/technology/graphql.svg new file mode 100644 index 00000000..779374f7 --- /dev/null +++ b/images/logos/technology/graphql.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/groovy.svg b/images/logos/technology/groovy.svg new file mode 100644 index 00000000..34bd134f --- /dev/null +++ b/images/logos/technology/groovy.svg @@ -0,0 +1,2 @@ + +file_type_groovy \ No newline at end of file diff --git a/images/logos/technology/grpc.png b/images/logos/technology/grpc.png new file mode 100644 index 0000000000000000000000000000000000000000..30061b6a91bdf52b859199b5c173500ccfc612d5 GIT binary patch literal 6207 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 literal 0 HcmV?d00001 diff --git a/images/logos/technology/helm.svg b/images/logos/technology/helm.svg new file mode 100644 index 00000000..f16e157a --- /dev/null +++ b/images/logos/technology/helm.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/http.svg b/images/logos/technology/http.svg new file mode 100644 index 00000000..1a1658a0 --- /dev/null +++ b/images/logos/technology/http.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/https.svg b/images/logos/technology/https.svg new file mode 100644 index 00000000..14e8f802 --- /dev/null +++ b/images/logos/technology/https.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/jar.svg b/images/logos/technology/jar.svg new file mode 100644 index 00000000..bae5c933 --- /dev/null +++ b/images/logos/technology/jar.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/java.svg b/images/logos/technology/java.svg new file mode 100644 index 00000000..9ad31efa --- /dev/null +++ b/images/logos/technology/java.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/images/logos/technology/kotlin.svg b/images/logos/technology/kotlin.svg new file mode 100644 index 00000000..05c2515d --- /dev/null +++ b/images/logos/technology/kotlin.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/images/logos/technology/kubernetes.svg b/images/logos/technology/kubernetes.svg new file mode 100644 index 00000000..58ab457b --- /dev/null +++ b/images/logos/technology/kubernetes.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/images/logos/technology/maven.svg b/images/logos/technology/maven.svg new file mode 100644 index 00000000..6a5e1b02 --- /dev/null +++ b/images/logos/technology/maven.svg @@ -0,0 +1,2 @@ + +file_type_maven \ No newline at end of file diff --git a/images/logos/technology/micronaut.svg b/images/logos/technology/micronaut.svg new file mode 100644 index 00000000..fd988896 --- /dev/null +++ b/images/logos/technology/micronaut.svg @@ -0,0 +1 @@ +Sally \ No newline at end of file diff --git a/images/logos/technology/nodejs.svg b/images/logos/technology/nodejs.svg new file mode 100644 index 00000000..ec5b3096 --- /dev/null +++ b/images/logos/technology/nodejs.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/npm.svg b/images/logos/technology/npm.svg new file mode 100644 index 00000000..69647ede --- /dev/null +++ b/images/logos/technology/npm.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/images/logos/technology/openshift.svg b/images/logos/technology/openshift.svg new file mode 100644 index 00000000..5759558e --- /dev/null +++ b/images/logos/technology/openshift.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/php.svg b/images/logos/technology/php.svg new file mode 100644 index 00000000..357eb485 --- /dev/null +++ b/images/logos/technology/php.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/prometheus.svg b/images/logos/technology/prometheus.svg new file mode 100644 index 00000000..f39b1ba3 --- /dev/null +++ b/images/logos/technology/prometheus.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/python.svg b/images/logos/technology/python.svg new file mode 100644 index 00000000..8aa9a107 --- /dev/null +++ b/images/logos/technology/python.svg @@ -0,0 +1,2 @@ + +file_type_python \ No newline at end of file diff --git a/images/logos/technology/quarkus.svg b/images/logos/technology/quarkus.svg new file mode 100644 index 00000000..be721de2 --- /dev/null +++ b/images/logos/technology/quarkus.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/ruby.svg b/images/logos/technology/ruby.svg new file mode 100644 index 00000000..d852a3ce --- /dev/null +++ b/images/logos/technology/ruby.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/rust.svg b/images/logos/technology/rust.svg new file mode 100644 index 00000000..e4541543 --- /dev/null +++ b/images/logos/technology/rust.svg @@ -0,0 +1,6 @@ + + + +rust + + \ No newline at end of file diff --git a/images/logos/technology/spring.svg b/images/logos/technology/spring.svg new file mode 100644 index 00000000..04926d62 --- /dev/null +++ b/images/logos/technology/spring.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/testcontainers.svg b/images/logos/technology/testcontainers.svg new file mode 100644 index 00000000..7b0ee73d --- /dev/null +++ b/images/logos/technology/testcontainers.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/logos/technology/webhooks.svg b/images/logos/technology/webhooks.svg new file mode 100644 index 00000000..cfd60f01 --- /dev/null +++ b/images/logos/technology/webhooks.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/_docs/images/slack-logo-medium.png b/images/slack-logo-medium.png similarity index 100% rename from _docs/images/slack-logo-medium.png rename to images/slack-logo-medium.png diff --git a/images/wiremock-cloud/wiremock_cloud_favicon.svg b/images/wiremock-cloud/wiremock_cloud_favicon.svg new file mode 100644 index 00000000..051f2c18 --- /dev/null +++ b/images/wiremock-cloud/wiremock_cloud_favicon.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + diff --git a/images/wiremock-cloud/wiremock_cloud_logo.png b/images/wiremock-cloud/wiremock_cloud_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..100ed77c44e7c215ace98639d361e5e15a7a73ba GIT binary patch literal 3237 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 S=+42|46?uAjI2Xkrv3|yx^ij& literal 0 HcmV?d00001 diff --git a/images/wiremock-cloud/wiremock_cloud_logo.svg b/images/wiremock-cloud/wiremock_cloud_logo.svg new file mode 100644 index 00000000..4e20271e --- /dev/null +++ b/images/wiremock-cloud/wiremock_cloud_logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + From e253adf8e98ca661ecffb7069d7524078cc76690 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 22:52:12 +0100 Subject: [PATCH 20/71] Fix the deployment pipeline --- .github/workflows/deploy-mkdocs-preview.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy-mkdocs-preview.yaml b/.github/workflows/deploy-mkdocs-preview.yaml index 1105b30a..9f86c26a 100644 --- a/.github/workflows/deploy-mkdocs-preview.yaml +++ b/.github/workflows/deploy-mkdocs-preview.yaml @@ -85,7 +85,6 @@ jobs: mkdir _site/2.x cp -R .submodules/wiremock.org-2.x/tmp/site_2x/* _site/2.x/ rm _site-docs/index.html - mkdir _site/docs cp -R _site-docs/* _site/docs/ mkdir -p _site/3.x/docs cp -R _site-docs/* _site/3.x/docs/ From cb20fb4700453c3a39acb437e451a7b4a7a74e2b Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 23:09:00 +0100 Subject: [PATCH 21/71] Fix the API Templates nav bar --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index f384feaf..e0c2929c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -159,7 +159,7 @@ nav: - Proxying: proxying.md - Verifying: verifying.md - Templating: - - WireMock API Templates Library: mock-api-templates.md + - WireMock API Templates Library: mock-api-templates/README.md - Using Mock API Templates: mock-api-templates/usage.md - Record & Playback: - Record and Playback: record-playback.md From 2fa57da4e996275224084de48700a69ae9749808 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Tue, 21 Nov 2023 23:14:12 +0100 Subject: [PATCH 22/71] Fix the SpringBoot links --- mkdocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index e0c2929c..208de2ca 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -146,10 +146,10 @@ nav: - Java Usage: - JUnit 5+ Jupiter: junit-jupiter.md - JUnit 4 and Vintage: junit-extensions.md - - Spring Boot: spring-boot.md + - Spring Boot: solutions/spring-boot.md - Plain Java: java-usage.md - Java configuration: configuration.md - - Running without the HTTP Server: running-without-http-server .md + - Running without the HTTP Server: running-without-http-server.md - Stubbing & Verifying: - Stubbing: stubbing.md - Request Matching: request-matching.md From cc995d2f94781d6e9ec5af140ba10e113a09a552 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 27 Nov 2023 13:04:24 +0100 Subject: [PATCH 23/71] Add the "Go to WM Cloud" button --- _docs/assets/css/wiremock.css | 27 +++++++++++++++++++++++++++ _docs_theme/main.html | 13 +++++++++++++ extra_sass/note.txt | 2 ++ mkdocs.yml | 8 ++++++++ requirements.txt | 2 ++ 5 files changed, 52 insertions(+) create mode 100644 _docs_theme/main.html create mode 100644 extra_sass/note.txt diff --git a/_docs/assets/css/wiremock.css b/_docs/assets/css/wiremock.css index 75bb15f7..fb254525 100644 --- a/_docs/assets/css/wiremock.css +++ b/_docs/assets/css/wiremock.css @@ -1,7 +1,9 @@ :root { --wm-blue: #0FB2EF; + --wm-blue-dark: #2D69F6; --wm-orange: #FF9505; --wm-light-blue: #F0F5FF; + --wm-white: #FFFFFF; } .wm-button { @@ -45,3 +47,28 @@ h3 { h4 { color: var(--wm-blue); } + +body > div.md-container > nav > div > ul > li:last-child > a { + position: absolute; + right: 1cm; + color: var(--wm-blue); + text-align: center; + padding: 0.5rem; + margin-top: 0; + font-weight: bolder; + font-size: large; + background-color: var(--wm-white); + border-radius: 5px; +} + +.masthead__cta { + text-align: right; + + &-note { + display: block; + font-size: 12px; + color: black; + font-weight: 500; + } +} + diff --git a/_docs_theme/main.html b/_docs_theme/main.html new file mode 100644 index 00000000..bd2c320a --- /dev/null +++ b/_docs_theme/main.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block header %} + {{ super() }} +{% endblock %} + +{% block tabs %} + {{ super() }} + +
+ Free forever. No credit card needed +
+{% endblock %} diff --git a/extra_sass/note.txt b/extra_sass/note.txt new file mode 100644 index 00000000..f9a17489 --- /dev/null +++ b/extra_sass/note.txt @@ -0,0 +1,2 @@ +NOTE: Unused because of the SCSS compilation error due to the engine +which is different from WireMock diff --git a/mkdocs.yml b/mkdocs.yml index 208de2ca..b947cdc2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -10,6 +10,7 @@ site_dir: _site-docs theme: name: material + custom_dir: _docs_theme highlightjs: true features: - announce.dismiss @@ -65,8 +66,13 @@ extra: extra_css: - assets/css/wiremock.css + #FIXME: It will not work well due to the style collision, a refactoring is needed + #- assets/css/main.css + #- assets/css/main.css.map plugins: + # FIXME: SCSS compilation errors in @math, so now the CSS is copied over + #- extra-sass - search - multirepo: # TODO: Change to True once works @@ -216,6 +222,8 @@ nav: - Creating Extensions: wiremock/_docs/extending-wiremock.md - Code of Conduct: dotgithub/CODE_OF_CONDUCT.md + - Go to WM Cloud: https://www.wiremock.io/product?utm_source=wiremock.org&utm_medium=referral&utm_campaign=docs_navbar + # Markdown markdown_extensions: - pymdownx.highlight: diff --git a/requirements.txt b/requirements.txt index 267e4957..2860de1b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,8 @@ mkdocs==1.5.3 mkdocs-multirepo-plugin==0.6.3 mkdocs-material==9.4.5 mkdocs-redirects==1.2.1 +mkdocs-extra-sass-plugin==0.1.0 +livereload==2.6.3 click==8.1.7 dacite==1.8.1 ghp-import==2.1.0 From 080ba94fe862d91c60b710c29edaecb143b3d67c Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Mon, 27 Nov 2023 13:12:15 +0100 Subject: [PATCH 24/71] Render OpenAPI specification from the external repo, remove obsolete rendering --- _docs/standalone/admin-api-reference.md | 4 +- assets/js/redoc.standalone.js | 122 - assets/js/wiremock-admin-api.json | 6372 ----------------------- mkdocs.yml | 1 + 4 files changed, 2 insertions(+), 6497 deletions(-) delete mode 100644 assets/js/redoc.standalone.js delete mode 100644 assets/js/wiremock-admin-api.json diff --git a/_docs/standalone/admin-api-reference.md b/_docs/standalone/admin-api-reference.md index 9569ef43..636056cb 100644 --- a/_docs/standalone/admin-api-reference.md +++ b/_docs/standalone/admin-api-reference.md @@ -10,6 +10,4 @@ The WireMock admin API is described in [OpenAPI 3.0](https://github.com/OAI/Open Below is the full API reference: - - - +!!swagger-http https://raw.githubusercontent.com/wiremock/wiremock/master/src/main/resources/swagger/wiremock-admin-api.json!! diff --git a/assets/js/redoc.standalone.js b/assets/js/redoc.standalone.js deleted file mode 100644 index 7fa12786..00000000 --- a/assets/js/redoc.standalone.js +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null"),function(){try{return require("esprima")}catch(e){}}()):"function"==typeof define&&define.amd?define(["null","esprima"],t):"object"==typeof exports?exports.Redoc=t(require("null"),function(){try{return require("esprima")}catch(e){}}()):e.Redoc=t(e.null,e.esprima)}(this,(function(e,t){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=153)}([function(e,t,n){"use strict";e.exports=n(216)},function(e,t,n){"use strict";n.r(t),n.d(t,"__extends",(function(){return o})),n.d(t,"__assign",(function(){return i})),n.d(t,"__rest",(function(){return a})),n.d(t,"__decorate",(function(){return s})),n.d(t,"__param",(function(){return l})),n.d(t,"__metadata",(function(){return c})),n.d(t,"__awaiter",(function(){return u})),n.d(t,"__generator",(function(){return p})),n.d(t,"__exportStar",(function(){return f})),n.d(t,"__values",(function(){return d})),n.d(t,"__read",(function(){return h})),n.d(t,"__spread",(function(){return m})),n.d(t,"__spreadArrays",(function(){return g})),n.d(t,"__await",(function(){return y})),n.d(t,"__asyncGenerator",(function(){return v})),n.d(t,"__asyncDelegator",(function(){return b})),n.d(t,"__asyncValues",(function(){return w})),n.d(t,"__makeTemplateObject",(function(){return x})),n.d(t,"__importStar",(function(){return k})),n.d(t,"__importDefault",(function(){return _})); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function o(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}function l(e,t){return function(n,r){t(n,r,e)}}function c(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function u(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{l(r.next(e))}catch(e){i(e)}}function s(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){e.done?o(e.value):new n((function(t){t(e.value)})).then(a,s)}l((r=r.apply(e,t||[])).next())}))}function p(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function h(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function m(){for(var e=[],t=0;t1||s(e,t)}))})}function s(e,t){try{(n=o[e](t)).value instanceof y?Promise.resolve(n.value.v).then(l,c):u(i[0][2],n)}catch(e){u(i[0][3],e)}var n}function l(e){s("next",e)}function c(e){s("throw",e)}function u(e,t){e(t),i.shift(),i.length&&s(i[0][0],i[0][1])}}function b(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){t[r]=e[r]?function(t){return(n=!n)?{value:y(e[r](t)),done:"return"===r}:o?o(t):t}:o}}function w(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=d(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,o,(t=e[n](t)).done,t.value)}))}}}function x(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}function k(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function _(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";(function(e,r){n.d(t,"a",(function(){return an})),n.d(t,"b",(function(){return Ue})),n.d(t,"c",(function(){return ue})),n.d(t,"d",(function(){return tt})),n.d(t,"e",(function(){return se})),n.d(t,"f",(function(){return lt})),n.d(t,"g",(function(){return M})),n.d(t,"h",(function(){return ut})),n.d(t,"i",(function(){return Mt})),n.d(t,"j",(function(){return zt})),n.d(t,"k",(function(){return Kt})),n.d(t,"l",(function(){return re})),n.d(t,"m",(function(){return ht})),n.d(t,"n",(function(){return Ke})),n.d(t,"o",(function(){return mt})),n.d(t,"p",(function(){return Ee})); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -var o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function i(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return(a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function l(){for(var e=[],t=0;t2&&oe("box");var n=X(t);return new de(e,K(n),n.name,!0,n.equals)},shallowBox:function(e,t){return arguments.length>2&&oe("shallowBox"),re.box(e,{name:t,deep:!1})},array:function(e,t){arguments.length>2&&oe("array");var n=X(t);return new At(e,K(n),n.name)},shallowArray:function(e,t){return arguments.length>2&&oe("shallowArray"),re.array(e,{name:t,deep:!1})},map:function(e,t){arguments.length>2&&oe("map");var n=X(t);return new Ft(e,K(n),n.name)},shallowMap:function(e,t){return arguments.length>2&&oe("shallowMap"),re.map(e,{name:t,deep:!1})},set:function(e,t){arguments.length>2&&oe("set");var n=X(t);return new $t(e,K(n),n.name)},object:function(e,t,n){"string"==typeof arguments[1]&&oe("object");var r=X(n);return ct({},e,t,r)},shallowObject:function(e,t){return"string"==typeof arguments[1]&&oe("shallowObject"),re.object(e,{},{name:t,deep:!1})},ref:ee,shallow:Z,deep:J,struct:te},re=function(e,t,n){if("string"==typeof arguments[1])return J.apply(null,arguments);if(dt(e))return e;var r=w(e)?re.object(e,t,n):Array.isArray(e)?re.array(e,t):E(e)?re.map(e,t):O(e)?re.set(e,t):e;if(r!==e)return r;m(!1)};function oe(e){m("Expected one or two arguments to observable."+e+". Did you accidentally try to use observable."+e+" as decorator?")}Object.keys(ne).forEach((function(e){return re[e]=ne[e]}));var ie=q(!1,(function(e,t,n,r,o){var i=n.get,s=n.set,l=o[0]||{};!function(e,t,n){var r=Ht(e);n.name=r.name+"."+t,n.context=e,r.values[t]=new he(n),Object.defineProperty(e,t,function(e){return Qt[e]||(Qt[e]={configurable:Ie.computedConfigurable,enumerable:!1,get:function(){return Gt(this).read(this,e)},set:function(t){Gt(this).write(this,e,t)}})}(t))}(e,t,a({get:i,set:s},l))})),ae=ie({equals:F.structural}),se=function(e,t,n){if("string"==typeof t)return ie.apply(null,arguments);if(null!==e&&"object"==typeof e&&1===arguments.length)return ie.apply(null,arguments);var r="object"==typeof t?t:{};return r.get=e,r.set="function"==typeof t?t:r.set,r.name=r.name||e.name||"",new he(r)};function le(e,t){var n=function(){return ce(e,t,this,arguments)};return n.isMobxAction=!0,n}function ce(e,t,n,r){var o=function(e,t,n){var r=Ve()&&!!e,o=0;if(r){o=Date.now();var i=n&&n.length||0,a=new Array(i);if(i>0)for(var s=0;s0;Ie.computationDepth>0&&t&&m(!1),Ie.allowStateChanges||!t&&"strict"!==Ie.enforceActions||m(!1)}function ke(e,t,n){Te(e),e.newObserving=new Array(e.observing.length+100),e.unboundDepsCount=0,e.runId=++Ie.runId;var r,o=Ie.trackingDerivation;if(Ie.trackingDerivation=e,!0===Ie.disableErrorBoundaries)r=t.call(n);else try{r=t.call(n)}catch(e){r=new ve(e)}return Ie.trackingDerivation=o,function(e){for(var t=e.observing,n=e.observing=e.newObserving,r=me.UP_TO_DATE,o=0,i=e.unboundDepsCount,a=0;ar&&(r=s.dependenciesState)}n.length=o,e.newObserving=null,i=t.length;for(;i--;){0===(s=t[i]).diffValue&&Re(s,e),s.diffValue=0}for(;o--;){var s;1===(s=n[o]).diffValue&&(s.diffValue=0,Pe(s,e))}r!==me.UP_TO_DATE&&(e.dependenciesState=r,e.onBecomeStale())}(e),r}function _e(e){var t=e.observing;e.observing=[];for(var n=t.length;n--;)Re(t[n],e);e.dependenciesState=me.NOT_TRACKING}function Ee(e){var t=Oe(),n=e();return Se(t),n}function Oe(){var e=Ie.trackingDerivation;return Ie.trackingDerivation=null,e}function Se(e){Ie.trackingDerivation=e}function Te(e){if(e.dependenciesState!==me.UP_TO_DATE){e.dependenciesState=me.UP_TO_DATE;for(var t=e.observing,n=t.length;n--;)t[n].lowestObserverState=me.UP_TO_DATE}}var je=function(){this.version=5,this.UNCHANGED={},this.trackingDerivation=null,this.computationDepth=0,this.runId=0,this.mobxGuid=0,this.inBatch=0,this.pendingUnobservations=[],this.pendingReactions=[],this.isRunningReactions=!1,this.allowStateChanges=!0,this.enforceActions=!1,this.spyListeners=[],this.globalReactionErrorHandlers=[],this.computedRequiresReaction=!1,this.computedConfigurable=!1,this.disableErrorBoundaries=!1,this.suppressReactionErrors=!1,this.currentActionId=0,this.nextActionId=1},Ce=!0,Ae=!1,Ie=function(){var e=d();return e.__mobxInstanceCount>0&&!e.__mobxGlobals&&(Ce=!1),e.__mobxGlobals&&e.__mobxGlobals.version!==(new je).version&&(Ce=!1),Ce?e.__mobxGlobals?(e.__mobxInstanceCount+=1,e.__mobxGlobals.UNCHANGED||(e.__mobxGlobals.UNCHANGED={}),e.__mobxGlobals):(e.__mobxInstanceCount=1,e.__mobxGlobals=new je):(setTimeout((function(){Ae||m("There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`")}),1),new je)}();function Pe(e,t){var n=e.observers.length;n&&(e.observersIndexes[t.__mapid]=n),e.observers[n]=t,e.lowestObserverState>t.dependenciesState&&(e.lowestObserverState=t.dependenciesState)}function Re(e,t){if(1===e.observers.length)e.observers.length=0,Ne(e);else{var n=e.observers,r=e.observersIndexes,o=n.pop();if(o!==t){var i=r[t.__mapid]||0;i?r[o.__mapid]=i:delete r[o.__mapid],n[i]=o}delete r[t.__mapid]}}function Ne(e){!1===e.isPendingUnobservation&&(e.isPendingUnobservation=!0,Ie.pendingUnobservations.push(e))}function Le(){Ie.inBatch++}function Me(){if(0==--Ie.inBatch){$e();for(var e=Ie.pendingUnobservations,t=0;t0&&Ne(e),!1)}function Fe(e,t){if(console.log("[mobx.trace] '"+e.name+"' is invalidated due to a change in: '"+t.name+"'"),e.isTracing===ge.BREAK){var n=[];!function e(t,n,r){if(n.length>=1e3)return void n.push("(and many more)");n.push(""+new Array(r).join("\t")+t.name);t.dependencies&&t.dependencies.forEach((function(t){return e(t,n,r+1)}))}(ut(e),n,1),new Function("debugger;\n/*\nTracing '"+e.name+"'\n\nYou are entering this break point because derivation '"+e.name+"' is being traced and '"+t.name+"' is now forcing it to update.\nJust follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update\nThe stackframe you are looking for is at least ~6-8 stack-frames up.\n\n"+(e instanceof he?e.derivation.toString().replace(/[*]\//g,"/"):"")+"\n\nThe dependencies for this derivation are:\n\n"+n.join("\n")+"\n*/\n ")()}}var Ue=function(){function e(e,t,n){void 0===e&&(e="Reaction@"+h()),this.name=e,this.onInvalidate=t,this.errorHandler=n,this.observing=[],this.newObserving=[],this.dependenciesState=me.NOT_TRACKING,this.diffValue=0,this.runId=0,this.unboundDepsCount=0,this.__mapid="#"+h(),this.isDisposed=!1,this._isScheduled=!1,this._isTrackPending=!1,this._isRunning=!1,this.isTracing=ge.NONE}return e.prototype.onBecomeStale=function(){this.schedule()},e.prototype.schedule=function(){this._isScheduled||(this._isScheduled=!0,Ie.pendingReactions.push(this),$e())},e.prototype.isScheduled=function(){return this._isScheduled},e.prototype.runReaction=function(){if(!this.isDisposed){if(Le(),this._isScheduled=!1,we(this)){this._isTrackPending=!0;try{this.onInvalidate(),this._isTrackPending&&Ve()&&Ye({name:this.name,type:"scheduled-reaction"})}catch(e){this.reportExceptionInDerivation(e)}}Me()}},e.prototype.track=function(e){Le();var t,n=Ve();n&&(t=Date.now(),Qe({name:this.name,type:"reaction"})),this._isRunning=!0;var r=ke(this,e,void 0);this._isRunning=!1,this._isTrackPending=!1,this.isDisposed&&_e(this),be(r)&&this.reportExceptionInDerivation(r.cause),n&&Xe({time:Date.now()-t}),Me()},e.prototype.reportExceptionInDerivation=function(e){var t=this;if(this.errorHandler)this.errorHandler(e,this);else{if(Ie.disableErrorBoundaries)throw e;var n="[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '"+this+"'";Ie.suppressReactionErrors?console.warn("[mobx] (error in reaction '"+this.name+"' suppressed, fix error of causing action below)"):console.error(n,e),Ve()&&Ye({type:"error",name:this.name,message:n,error:""+e}),Ie.globalReactionErrorHandlers.forEach((function(n){return n(e,t)}))}},e.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._isRunning||(Le(),_e(this),Me()))},e.prototype.getDisposer=function(){var e=this.dispose.bind(this);return e.$mobx=this,e},e.prototype.toString=function(){return"Reaction["+this.name+"]"},e.prototype.trace=function(e){void 0===e&&(e=!1),function(){for(var e=[],t=0;t0||Ie.isRunningReactions||Be(qe)}function qe(){Ie.isRunningReactions=!0;for(var e=Ie.pendingReactions,t=0;e.length>0;){++t===ze&&(console.error("Reaction doesn't converge to a stable state after "+ze+" iterations. Probably there is a cycle in the reactive function: "+e[0]),e.splice(0));for(var n=e.splice(0),r=0,o=n.length;r",e):2===arguments.length&&"function"==typeof t?le(e,t):1===arguments.length&&"string"==typeof e?Ze(e):!0!==r?Ze(t).apply(null,arguments):void(e[t]=le(e.name||t,n.value))};function nt(e,t,n){x(e,t,le(t,n.bind(e)))}function rt(e,t){void 0===t&&(t=p);var n,r=t&&t.name||e.name||"Autorun@"+h();if(!t.scheduler&&!t.delay)n=new Ue(r,(function(){this.track(a)}),t.onError);else{var o=it(t),i=!1;n=new Ue(r,(function(){i||(i=!0,o((function(){i=!1,n.isDisposed||n.track(a)})))}),t.onError)}function a(){e(n)}return n.schedule(),n.getDisposer()}tt.bound=function(e,t,n,r){return!0===r?(nt(e,t,n.value),null):n?{configurable:!0,enumerable:!1,get:function(){return nt(this,t,n.value||n.initializer.call(this)),this[t]},set:Je}:{enumerable:!1,configurable:!0,set:function(e){nt(this,t,e)},get:function(){}}};var ot=function(e){return e()};function it(e){return e.scheduler?e.scheduler:e.delay?function(t){return setTimeout(t,e.delay)}:ot}function at(e,t,n){return st("onBecomeUnobserved",e,t,n)}function st(e,t,n,r){var o="function"==typeof r?Jt(t,n):Jt(t),i="function"==typeof r?r:n,a=o[e];return"function"!=typeof a?m(!1):(o[e]=function(){a.call(this),i.call(this)},function(){o[e]=a})}function lt(e){var t=e.enforceActions,n=e.computedRequiresReaction,r=e.computedConfigurable,o=e.disableErrorBoundaries,i=e.arrayBuffer,a=e.reactionScheduler;if(!0===e.isolateGlobalState&&((Ie.pendingReactions.length||Ie.inBatch||Ie.isRunningReactions)&&m("isolateGlobalState should be called before MobX is running any reactions"),Ae=!0,Ce&&(0==--d().__mobxInstanceCount&&(d().__mobxGlobals=void 0),Ie=new je)),void 0!==t){var s=void 0;switch(t){case!0:case"observed":s=!0;break;case!1:case"never":s=!1;break;case"strict":case"always":s="strict";break;default:m("Invalid value for 'enforceActions': '"+t+"', expected 'never', 'always' or 'observed'")}Ie.enforceActions=s,Ie.allowStateChanges=!0!==s&&"strict"!==s}void 0!==n&&(Ie.computedRequiresReaction=!!n),void 0!==r&&(Ie.computedConfigurable=!!r),void 0!==o&&(!0===o&&console.warn("WARNING: Debug feature only. MobX will NOT recover from errors if this is on."),Ie.disableErrorBoundaries=!!o),"number"==typeof i&&Nt(i),a&&He(a)}function ct(e,t,n,r){var o=(r=X(r)).defaultDecorator||(!1===r.deep?ee:J);$(e),Ht(e,r.name,o.enhancer),Le();try{for(var i in t){var a=Object.getOwnPropertyDescriptor(t,i);0;var s=(n&&i in n?n[i]:a.get?ie:o)(e,i,a,!0);s&&Object.defineProperty(e,i,s)}}finally{Me()}return e}function ut(e,t){return pt(Jt(e,t))}function pt(e){var t,n,r={name:e.name};return e.observing&&e.observing.length>0&&(r.dependencies=(t=e.observing,n=[],t.forEach((function(e){-1===n.indexOf(e)&&n.push(e)})),n).map(pt)),r}function ft(e,t){if(null==e)return!1;if(void 0!==t){if(Kt(e)){var n=e.$mobx;return n.values&&!!n.values[t]}return!1}return Kt(e)||!!e.$mobx||L(e)||We(e)||ye(e)}function dt(e){return 1!==arguments.length&&m(!1),ft(e)}function ht(e,t,n,r){return"function"==typeof n?function(e,t,n,r){return Zt(e,t).observe(n,r)}(e,t,n,r):function(e,t,n){return Zt(e).observe(t,n)}(e,t,n)}function mt(e,t){void 0===t&&(t=void 0),Le();try{return e.apply(t)}finally{Me()}}function gt(e){return void 0!==e.interceptors&&e.interceptors.length>0}function yt(e,t){var n=e.interceptors||(e.interceptors=[]);return n.push(t),y((function(){var e=n.indexOf(t);-1!==e&&n.splice(e,1)}))}function vt(e,t){var n=Oe();try{var r=e.interceptors;if(r)for(var o=0,i=r.length;o0}function wt(e,t){var n=e.changeListeners||(e.changeListeners=[]);return n.push(t),y((function(){var e=n.indexOf(t);-1!==e&&n.splice(e,1)}))}function xt(e,t){var n=Oe(),r=e.changeListeners;if(r){for(var o=0,i=(r=r.slice()).length;o0?e.map(this.dehancer):e},e.prototype.intercept=function(e){return yt(this,e)},e.prototype.observe=function(e,t){return void 0===t&&(t=!1),t&&e({object:this.array,type:"splice",index:0,added:this.values.slice(),addedCount:this.values.length,removed:[],removedCount:0}),wt(this,e)},e.prototype.getArrayLength=function(){return this.atom.reportObserved(),this.values.length},e.prototype.setArrayLength=function(e){if("number"!=typeof e||e<0)throw new Error("[mobx.array] Out of range: "+e);var t=this.values.length;if(e!==t)if(e>t){for(var n=new Array(e-t),r=0;r0&&e+t+1>Tt&&Nt(e+t+1)},e.prototype.spliceWithArray=function(e,t,n){var r=this;xe(this.atom);var o=this.values.length;if(void 0===e?e=0:e>o?e=o:e<0&&(e=Math.max(0,o+e)),t=1===arguments.length?o-e:null==t?0:Math.max(0,Math.min(t,o-e)),void 0===n&&(n=u),gt(this)){var i=vt(this,{object:this.array,type:"splice",index:e,removedCount:t,added:n});if(!i)return u;t=i.removedCount,n=i.added}var a=(n=0===n.length?n:n.map((function(e){return r.enhancer(e,void 0)}))).length-t;this.updateArrayLength(o,a);var s=this.spliceItemsIntoValues(e,t,n);return 0===t&&0===n.length||this.notifyArraySplice(e,n,s),this.dehanceValues(s)},e.prototype.spliceItemsIntoValues=function(e,t,n){var r;if(n.length<1e4)return(r=this.values).splice.apply(r,l([e,t],n));var o=this.values.slice(e,e+t);return this.values=this.values.slice(0,e).concat(n,this.values.slice(e+t)),o},e.prototype.notifyArrayChildUpdate=function(e,t,n){var r=!this.owned&&Ve(),o=bt(this),i=o||r?{object:this.array,type:"update",index:e,newValue:t,oldValue:n}:null;r&&Qe(a({},i,{name:this.atom.name})),this.atom.reportChanged(),o&&xt(this,i),r&&Xe()},e.prototype.notifyArraySplice=function(e,t,n){var r=!this.owned&&Ve(),o=bt(this),i=o||r?{object:this.array,type:"splice",index:e,removed:n,added:t,removedCount:n.length,addedCount:t.length}:null;r&&Qe(a({},i,{name:this.atom.name})),this.atom.reportChanged(),o&&xt(this,i),r&&Xe()},e}(),At=function(e){function t(t,n,r,o){void 0===r&&(r="ObservableArray@"+h()),void 0===o&&(o=!1);var i=e.call(this)||this,a=new Ct(r,n,i,o);if(k(i,"$mobx",a),t&&t.length){var s=pe(!0);i.spliceWithArray(0,0,t),fe(s)}return St&&Object.defineProperty(a.array,"0",It),i}return i(t,e),t.prototype.intercept=function(e){return this.$mobx.intercept(e)},t.prototype.observe=function(e,t){return void 0===t&&(t=!1),this.$mobx.observe(e,t)},t.prototype.clear=function(){return this.splice(0)},t.prototype.concat=function(){for(var e=[],t=0;t-1&&(this.splice(t,1),!0)},t.prototype.move=function(e,t){function n(e){if(e<0)throw new Error("[mobx.array] Index out of bounds: "+e+" is negative");var t=this.$mobx.values.length;if(e>=t)throw new Error("[mobx.array] Index out of bounds: "+e+" is not smaller than "+t)}if(n.call(this,e),n.call(this,t),e!==t){var r,o=this.$mobx.values;r=e",'"',"`"," ","\r","\n","\t"]),u=["'"].concat(c),p=["%","/","?",";","#"].concat(u),f=["/","?","#"],d=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,"javascript:":!0},g={javascript:!0,"javascript:":!0},y={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},v=n(225);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof i)return e;var r=new i;return r.parse(e,t,n),r}i.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var i=e.indexOf("?"),s=-1!==i&&i127?R+="x":R+=P[N];if(!R.match(d)){var M=A.slice(0,T),D=A.slice(T+1),F=P.match(h);F&&(M.push(F[1]),D.unshift(F[2])),D.length&&(b="/"+D.join(".")+b),this.hostname=M.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),C||(this.hostname=r.toASCII(this.hostname));var U=this.port?":"+this.port:"",z=this.hostname||"";this.host=z+U,this.href+=this.host,C&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!m[k])for(T=0,I=u.length;T0)&&n.host.split("@"))&&(n.auth=C.shift(),n.host=n.hostname=C.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!_.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var O=_.slice(-1)[0],S=(n.host||e.host||_.length>1)&&("."===O||".."===O)||""===O,T=0,j=_.length;j>=0;j--)"."===(O=_[j])?_.splice(j,1):".."===O?(_.splice(j,1),T++):T&&(_.splice(j,1),T--);if(!x&&!k)for(;T--;T)_.unshift("..");!x||""===_[0]||_[0]&&"/"===_[0].charAt(0)||_.unshift(""),S&&"/"!==_.join("/").substr(-1)&&_.push("");var C,A=""===_[0]||_[0]&&"/"===_[0].charAt(0);E&&(n.hostname=n.host=A?"":_.length?_.shift():"",(C=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=C.shift(),n.host=n.hostname=C.shift()));return(x=x||n.host&&_.length)&&!A&&_.unshift(""),_.length?n.pathname=_.join("/"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},i.prototype.parseHost=function(){var e=this.host,t=s.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){var r=n(25),o=n(13),i=n(121),a=n(15).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||a(t,e,{value:i.f(e)})}},function(e,t,n){"use strict";(function(e){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -var r=n(229),o=n(230),i=n(123);function a(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(a()=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function h(e,t){if(l.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return B(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return $(e).length;default:if(r)return B(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,n);case"utf8":case"utf-8":return S(this,t,n);case"ascii":return j(this,t,n);case"latin1":case"binary":return C(this,t,n);case"base64":return O(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return I(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function g(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function y(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=l.from(t,r)),l.isBuffer(t))return 0===t.length?-1:v(e,t,n,r,o);if("number"==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):v(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function v(e,t,n,r,o){var i,a=1,s=e.length,l=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,s/=2,l/=2,n/=2}function c(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var u=-1;for(i=n;is&&(n=s-l),i=n;i>=0;i--){for(var p=!0,f=0;fo&&(r=o):r=o;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");r>i/2&&(r=i/2);for(var a=0;a>8,o=n%256,i.push(o),i.push(r);return i}(t,e.length-n),e,n,r)}function O(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function S(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(u=c);break;case 2:128==(192&(i=e[o+1]))&&(l=(31&c)<<6|63&i)>127&&(u=l);break;case 3:i=e[o+1],a=e[o+2],128==(192&i)&&128==(192&a)&&(l=(15&c)<<12|(63&i)<<6|63&a)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:i=e[o+1],a=e[o+2],s=e[o+3],128==(192&i)&&128==(192&a)&&128==(192&s)&&(l=(15&c)<<18|(63&i)<<12|(63&a)<<6|63&s)>65535&&l<1114112&&(u=l)}null===u?(u=65533,p=1):u>65535&&(u-=65536,r.push(u>>>10&1023|55296),u=56320|1023&u),r.push(u),o+=p}return function(e){var t=e.length;if(t<=T)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},l.prototype.compare=function(e,t,n,r,o){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),a=(n>>>=0)-(t>>>=0),s=Math.min(i,a),c=this.slice(r,o),u=e.slice(t,n),p=0;po)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return w(this,e,t,n);case"ascii":return x(this,e,t,n);case"latin1":case"binary":return k(this,e,t,n);case"base64":return _(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,e,t,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var T=4096;function j(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",i=t;in)throw new RangeError("Trying to access beyond buffer length")}function R(e,t,n,r,o,i){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function N(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function L(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function M(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function D(e,t,n,r,i){return i||M(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function F(e,t,n,r,i){return i||M(e,0,n,8),o.write(e,t,n,r,52,8),n+8}l.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},l.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},l.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,i=0;++i=(o*=128)&&(r-=Math.pow(2,8*t)),r},l.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=t,o=1,i=this[e+--r];r>0&&(o*=256);)i+=this[e+--r]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*t)),i},l.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!1,52,8)},l.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||R(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,i=0;for(this[t]=255&e;++i=0&&(i*=256);)this[t+o]=e/i&255;return t+n},l.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,255,0),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},l.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},l.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,65535,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},l.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):L(this,e,t,!0),t+4},l.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,4294967295,0),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):L(this,e,t,!1),t+4},l.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var i=0,a=1,s=0;for(this[t]=255&e;++i>0)-s&255;return t+n},l.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);R(this,e,t,n,o-1,-o)}var i=n-1,a=1,s=0;for(this[t+i]=255&e;--i>=0&&(a*=256);)e<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(e/a>>0)-s&255;return t+n},l.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,1,127,-128),l.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):N(this,e,t,!0),t+2},l.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,2,32767,-32768),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):N(this,e,t,!1),t+2},l.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),l.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):L(this,e,t,!0),t+4},l.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||R(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),l.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):L(this,e,t,!1),t+4},l.prototype.writeFloatLE=function(e,t,n){return D(this,e,t,!0,n)},l.prototype.writeFloatBE=function(e,t,n){return D(this,e,t,!1,n)},l.prototype.writeDoubleLE=function(e,t,n){return F(this,e,t,!0,n)},l.prototype.writeDoubleBE=function(e,t,n){return F(this,e,t,!1,n)},l.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(i<1e3||!l.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;i.push(n)}else if(n<2048){if((t-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function $(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(U,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function q(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(6))},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var l,c=[],u=!1,p=-1;function f(){u&&l&&(u=!1,l.length?c=l.concat(c):p=-1,c.length&&d())}function d(){if(!u){var e=s(f);u=!0;for(var t=c.length;t;){for(l=c,c=[];++p1)for(var n=1;n=0?e.substr(t).toLowerCase():""},t.getHash=function(e){var t=e.indexOf("#");return t>=0?e.substr(t):"#"},t.stripHash=function(e){var t=e.indexOf("#");return t>=0&&(e=e.substr(0,t)),e},t.isHttp=function(e){var t=s.getProtocol(e);return"http"===t||"https"===t||void 0===t&&r.browser},t.isFileSystemPath=function(e){if(r.browser)return!1;var t=s.getProtocol(e);return void 0===t||"file"===t},t.fromFileSystemPath=function(e){o&&(e=e.replace(/\\/g,"/")),e=encodeURI(e);for(var t=0;t0&&(p=e.exports.formatter.apply(null,s)),n&&n.message&&(p+=(p?" \n":"")+n.message);var f=new t(p);return l(f,n),c(f),u(f,r),f}}function l(e,t){!function(e,t){!function(e){if(!m)return!1;var t=Object.getOwnPropertyDescriptor(e,"stack");if(!t)return!1;return"function"==typeof t.get}(e)?e.stack=t?d(e.stack,t.stack):h(e.stack):t?function(e,t){var n=Object.getOwnPropertyDescriptor(e,"stack");Object.defineProperty(e,"stack",{get:function(){return d(n.get.apply(e),t.stack)},enumerable:!1,configurable:!0})}(e,t):(n=e,r=Object.getOwnPropertyDescriptor(n,"stack"),Object.defineProperty(n,"stack",{get:function(){return h(r.get.apply(n))},enumerable:!1,configurable:!0}));var n,r}(e,t),u(e,t)}function c(e){e.toJSON=p,e.inspect=f}function u(e,t){if(t&&"object"==typeof t)for(var n=Object.keys(t),r=0;r=0))try{e[o]=t[o]}catch(e){}}}function p(){var e={},t=Object.keys(this);t=t.concat(a);for(var n=0;n=0)return t.splice(n,1),t.join("\n")}return e}}e.exports=s(Error),e.exports.error=s(Error),e.exports.eval=s(EvalError),e.exports.range=s(RangeError),e.exports.reference=s(ReferenceError),e.exports.syntax=s(SyntaxError),e.exports.type=s(TypeError),e.exports.uri=s(URIError),e.exports.formatter=r;var m=!(!Object.getOwnPropertyDescriptor||!Object.defineProperty||"undefined"!=typeof navigator&&/Android/.test(navigator.userAgent))},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(217)},function(e,t){e.exports=!1},function(e,t,n){var r,o,i,a=n(156),s=n(3),l=n(7),c=n(20),u=n(13),p=n(53),f=n(39),d=s.WeakMap;if(a){var h=new d,m=h.get,g=h.has,y=h.set;r=function(e,t){return y.call(h,e,t),t},o=function(e){return m.call(h,e)||{}},i=function(e){return g.call(h,e)}}else{var v=p("state");f[v]=!0,r=function(e,t){return c(e,v,t),t},o=function(e){return u(e,v)?e[v]:{}},i=function(e){return u(e,v)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){var r=n(71),o=n(40);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(68),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){"use strict";var r=n(46),o=n(58),i=n(5);function a(e,t,n){var r=[];return e.include.forEach((function(e){n=a(e,t,n)})),e[t].forEach((function(e){n.forEach((function(t,n){t.tag===e.tag&&t.kind===e.kind&&r.push(n)})),n.push(e)})),n.filter((function(e,t){return-1===r.indexOf(t)}))}function s(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach((function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new o("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")})),this.compiledImplicit=a(this,"implicit",[]),this.compiledExplicit=a(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{}};function r(e){n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;ee.length)return;if(!(x instanceof o)){if(m&&b!=t.length-1){if(f.lastIndex=w,!(T=f.exec(e)))break;for(var k=T.index+(h?T[1].length:0),_=T.index+T[0].length,E=b,O=w,S=t.length;E=(O+=t[E].length)&&(++b,w=O);if(t[b]instanceof o)continue;j=E-b,x=e.slice(w,O),T.index-=w}else{f.lastIndex=0;var T=f.exec(x),j=1}if(T){h&&(g=T[1]?T[1].length:0);_=(k=T.index+g)+(T=T[0].slice(g)).length;var C=x.slice(0,k),A=x.slice(_),I=[b,j];C&&(++b,w+=C.length,I.push(C));var P=new o(c,d?r.tokenize(T,d):T,y,T,m);if(I.push(P),A&&I.push(A),Array.prototype.splice.apply(t,I),1!=j&&r.matchGrammar(e,t,n,b,w,!0,c),s)break}else if(s)break}}}}},tokenize:function(e,t){var n=[e],o=t.rest;if(o){for(var i in o)t[i]=o[i];delete t.rest}return r.matchGrammar(e,n,t,0,0,!1),n},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,i=0;o=n[i++];)o(t)}},Token:o};function o(e,t,n,r,o){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!o}if(e.Prism=r,o.stringify=function(e,t){if("string"==typeof e)return e;if(Array.isArray(e))return e.map((function(e){return o.stringify(e,t)})).join("");var n={type:e.type,content:o.stringify(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t};if(e.alias){var i=Array.isArray(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(n.classes,i)}r.hooks.run("wrap",n);var a=Object.keys(n.attributes).map((function(e){return e+'="'+(n.attributes[e]||"").replace(/"/g,""")+'"'})).join(" ");return"<"+n.tag+' class="'+n.classes.join(" ")+'"'+(a?" "+a:"")+">"+n.content+""},!e.document)return e.addEventListener?(r.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),o=n.language,i=n.code,a=n.immediateClose;e.postMessage(r.highlight(i,r.languages[o],o)),a&&e.close()}),!1),r):r;var i=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return i&&(r.filename=i.src,r.manual||i.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(r.highlightAll):window.setTimeout(r.highlightAll,16):document.addEventListener("DOMContentLoaded",r.highlightAll))),r}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=n),void 0!==t&&(t.Prism=n),n.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},n.languages.markup.tag.inside["attr-value"].inside.entity=n.languages.markup.entity,n.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(n.languages.markup.tag,"addInlined",{value:function(e,t){var r={};r["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:n.languages[t]},r.cdata=/^$/i;var o={"included-cdata":{pattern://i,inside:r}};o["language-"+t]={pattern:/[\s\S]+/,inside:n.languages[t]};var i={};i[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:o},n.languages.insertBefore("markup","cdata",i)}}),n.languages.xml=n.languages.extend("markup",{}),n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+t.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},n.tag))}(n),n.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},n.languages.javascript=n.languages.extend("clike",{"class-name":[n.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|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)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),n.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,n.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:n.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:n.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:n.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]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:n.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),n.languages.insertBefore("javascript","string",{"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:n.languages.javascript}},string:/[\s\S]+/}}}),n.languages.markup&&n.languages.markup.tag.addInlined("script","javascript"),n.languages.js=n.languages.javascript,"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(e){e=e||document;var t={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"};Array.prototype.slice.call(e.querySelectorAll("pre[data-src]")).forEach((function(e){if(!e.hasAttribute("data-src-loaded")){for(var r,o=e.getAttribute("data-src"),i=e,a=/\blang(?:uage)?-([\w-]+)\b/i;i&&!a.test(i.className);)i=i.parentNode;if(i&&(r=(e.className.match(a)||[,""])[1]),!r){var s=(o.match(/\.(\w+)$/)||[,""])[1];r=t[s]||s}var l=document.createElement("code");l.className="language-"+r,e.textContent="",l.textContent="Loading…",e.appendChild(l);var c=new XMLHttpRequest;c.open("GET",o,!0),c.onreadystatechange=function(){4==c.readyState&&(c.status<400&&c.responseText?(l.textContent=c.responseText,n.highlightElement(l),e.setAttribute("data-src-loaded","")):c.status>=400?l.textContent="✖ Error "+c.status+" while fetching file: "+c.statusText:l.textContent="✖ Error: File does not exist or is empty")},c.send(null)}})),n.plugins.toolbar&&n.plugins.toolbar.registerButton("download-file",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-src")&&t.hasAttribute("data-download-link")){var n=t.getAttribute("data-src"),r=document.createElement("a");return r.textContent=t.getAttribute("data-download-link-label")||"Download",r.setAttribute("download",""),r.href=n,r}}))},document.addEventListener("DOMContentLoaded",(function(){self.Prism.fileHighlight()})))}).call(this,n(6))},function(e,t,n){var r=n(3),o=n(66),i=n(30),a=r["__core-js_shared__"]||o("__core-js_shared__",{});(e.exports=function(e,t){return a[e]||(a[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.2.1",mode:i?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports={}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(25),o=n(3),i=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){var r=n(40);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports={}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){var r=n(44);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";function r(e){return null==e}e.exports.isNothing=r,e.exports.isObject=function(e){return"object"==typeof e&&null!==e},e.exports.toArray=function(e){return Array.isArray(e)?e:r(e)?[]:[e]},e.exports.repeat=function(e,t){var n,r="";for(n=0;n=0;r--){var o=e[r];"."===o?e.splice(r,1):".."===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r=-1&&!o;i--){var a=i>=0?arguments[i]:e.cwd();if("string"!=typeof a)throw new TypeError("Arguments to path.resolve must be strings");a&&(t=a+"/"+t,o="/"===a.charAt(0))}return(o?"/":"")+(t=n(r(t.split("/"),(function(e){return!!e})),!o).join("/"))||"."},t.normalize=function(e){var i=t.isAbsolute(e),a="/"===o(e,-1);return(e=n(r(e.split("/"),(function(e){return!!e})),!i).join("/"))||i||(e="."),e&&a&&(e+="/"),(i?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(r(e,(function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e})).join("/"))},t.relative=function(e,n){function r(e){for(var t=0;t=0&&""===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=t.resolve(e).substr(1),n=t.resolve(n).substr(1);for(var o=r(e.split("/")),i=r(n.split("/")),a=Math.min(o.length,i.length),s=a,l=0;l=1;--i)if(47===(t=e.charCodeAt(i))){if(!o){r=i;break}}else o=!1;return-1===r?n?"/":".":n&&1===r?"/":e.slice(0,r)},t.basename=function(e,t){var n=function(e){"string"!=typeof e&&(e+="");var t,n=0,r=-1,o=!0;for(t=e.length-1;t>=0;--t)if(47===e.charCodeAt(t)){if(!o){n=t+1;break}}else-1===r&&(o=!1,r=t+1);return-1===r?"":e.slice(n,r)}(e);return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},t.extname=function(e){"string"!=typeof e&&(e+="");for(var t=-1,n=0,r=-1,o=!0,i=0,a=e.length-1;a>=0;--a){var s=e.charCodeAt(a);if(47!==s)-1===r&&(o=!1,r=a+1),46===s?-1===t?t=a:1!==i&&(i=1):-1!==t&&(i=-1);else if(!o){n=a+1;break}}return-1===t||-1===r||0===i||1===i&&t===r-1&&t===n+1?"":e.slice(t,r)};var o="b"==="ab".substr(-1)?function(e,t,n){return e.substr(t,n)}:function(e,t,n){return t<0&&(t=e.length+t),e.substr(t,n)}}).call(this,n(12))},function(e,t,n){var r,o,i;o=[t],void 0===(i="function"==typeof(r=function(e){"use strict";e.__esModule=!0;var t={},n=Object.prototype.hasOwnProperty,r=function(e){var r=arguments.length<=1||void 0===arguments[1]?t:arguments[1],o=r.cache||{};return function(){for(var t=arguments.length,i=Array(t),a=0;a2?r:e).apply(void 0,o)}}e.memoize=a,e.debounce=s,e.bind=l,e.default={memoize:a,debounce:s,bind:l}})?r.apply(t,o):r)||(e.exports=i)},function(e,t,n){(function(t){!function(t){"use strict";var n={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}|~{3,})([^`~\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:g,table:g,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/};function r(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||k.defaults,this.rules=n.normal,this.options.pedantic?this.rules=n.pedantic:this.options.gfm&&(this.rules=n.gfm)}n._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,n._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,n.def=f(n.def).replace("label",n._label).replace("title",n._title).getRegex(),n.bullet=/(?:[*+-]|\d{1,9}\.)/,n.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,n.item=f(n.item,"gm").replace(/bull/g,n.bullet).getRegex(),n.list=f(n.list).replace(/bull/g,n.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+n.def.source+")").getRegex(),n._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",n._comment=//,n.html=f(n.html,"i").replace("comment",n._comment).replace("tag",n._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),n.paragraph=f(n._paragraph).replace("hr",n.hr).replace("heading"," {0,3}#{1,6} +").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}|~{3,})[^`\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",n._tag).getRegex(),n.blockquote=f(n.blockquote).replace("paragraph",n.paragraph).getRegex(),n.normal=y({},n),n.gfm=y({},n.normal,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),n.pedantic=y({},n.normal,{html:f("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",n._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:g,paragraph:f(n.normal._paragraph).replace("hr",n.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",n.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()}),r.rules=n,r.lex=function(e,t){return new r(t).lex(e)},r.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},r.prototype.token=function(e,t){var r,o,i,a,s,l,c,p,f,d,h,m,g,y,w,x;for(e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e)){var k=this.tokens[this.tokens.length-1];e=e.substring(i[0].length),k&&"paragraph"===k.type?k.text+="\n"+i[0].trimRight():(i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",codeBlockStyle:"indented",text:this.options.pedantic?i:b(i,"\n")}))}else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2]?i[2].trim():i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if((i=this.rules.nptable.exec(e))&&(l={type:"table",header:v(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]}).header.length===l.align.length){for(e=e.substring(i[0].length),h=0;h ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),c={type:"list_start",ordered:y=(a=i[2]).length>1,start:y?+a:"",loose:!1},this.tokens.push(c),p=[],r=!1,g=(i=i[0].match(this.rules.item)).length,h=0;h1?1===s.length:s.length>1||this.options.smartLists&&s!==a)&&(e=i.slice(h+1).join("\n")+e,h=g-1)),o=r||/\n\n(?!\s*$)/.test(l),h!==g-1&&(r="\n"===l.charAt(l.length-1),o||(o=r)),o&&(c.loose=!0),x=void 0,(w=/^\[[ xX]\] /.test(l))&&(x=" "!==l[1],l=l.replace(/^\[[ xX]\] +/,"")),f={type:"list_item_start",task:w,checked:x,loose:o},p.push(f),this.tokens.push(f),this.token(l,!1),this.tokens.push({type:"list_item_end"});if(c.loose)for(g=p.length,h=0;h?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:g,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:g,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\?@\\[^_{|}~",o.em=f(o.em).replace(/punctuation/g,o._punctuation).getRegex(),o._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,o._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,o._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,o.autolink=f(o.autolink).replace("scheme",o._scheme).replace("email",o._email).getRegex(),o._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,o.tag=f(o.tag).replace("comment",n._comment).replace("attribute",o._attribute).getRegex(),o._label=/(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,o._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,o._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,o.link=f(o.link).replace("label",o._label).replace("href",o._href).replace("title",o._title).getRegex(),o.reflink=f(o.reflink).replace("label",o._label).getRegex(),o.normal=y({},o),o.pedantic=y({},o.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:f(/^!?\[(label)\]\((.*?)\)/).replace("label",o._label).getRegex(),reflink:f(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",o._label).getRegex()}),o.gfm=y({},o.normal,{escape:f(o.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\/i.test(a[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(a[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(a[0])&&(this.inRawBlock=!1),e=e.substring(a[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(a[0]):u(a[0]):a[0];else if(a=this.rules.link.exec(e)){var c=w(a[2],"()");if(c>-1){var p=4+a[1].length+c;a[2]=a[2].substring(0,c),a[0]=a[0].substring(0,p).trim(),a[3]=""}e=e.substring(a[0].length),this.inLink=!0,r=a[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r))?(r=t[1],o=t[3]):o="":o=a[3]?a[3].slice(1,-1):"",r=r.trim().replace(/^<([\s\S]*)>$/,"$1"),l+=this.outputLink(a,{href:i.escapes(r),title:i.escapes(o)}),this.inLink=!1}else if((a=this.rules.reflink.exec(e))||(a=this.rules.nolink.exec(e))){if(e=e.substring(a[0].length),t=(a[2]||a[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){l+=a[0].charAt(0),e=a[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(a,t),this.inLink=!1}else if(a=this.rules.strong.exec(e))e=e.substring(a[0].length),l+=this.renderer.strong(this.output(a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.em.exec(e))e=e.substring(a[0].length),l+=this.renderer.em(this.output(a[6]||a[5]||a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.code.exec(e))e=e.substring(a[0].length),l+=this.renderer.codespan(u(a[2].trim(),!0));else if(a=this.rules.br.exec(e))e=e.substring(a[0].length),l+=this.renderer.br();else if(a=this.rules.del.exec(e))e=e.substring(a[0].length),l+=this.renderer.del(this.output(a[1]));else if(a=this.rules.autolink.exec(e))e=e.substring(a[0].length),r="@"===a[2]?"mailto:"+(n=u(this.mangle(a[1]))):n=u(a[1]),l+=this.renderer.link(r,null,n);else if(this.inLink||!(a=this.rules.url.exec(e))){if(a=this.rules.text.exec(e))e=e.substring(a[0].length),this.inRawBlock?l+=this.renderer.text(this.options.sanitize?this.options.sanitizer?this.options.sanitizer(a[0]):u(a[0]):a[0]):l+=this.renderer.text(u(this.smartypants(a[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===a[2])r="mailto:"+(n=u(a[0]));else{do{s=a[0],a[0]=this.rules._backpedal.exec(a[0])[0]}while(s!==a[0]);n=u(a[0]),r="www."===a[1]?"http://"+n:n}e=e.substring(a[0].length),l+=this.renderer.link(r,null,n)}return l},i.escapes=function(e){return e?e.replace(i.rules._escapes,"$1"):e},i.prototype.outputLink=function(e,t){var n=t.href,r=t.title?u(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,u(e[1]))},i.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},i.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,o=0;o.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},a.prototype.code=function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var o=this.options.highlight(e,r);null!=o&&o!==e&&(n=!0,e=o)}return r?'
'+(n?e:u(e,!0))+"
\n":"
"+(n?e:u(e,!0))+"
"},a.prototype.blockquote=function(e){return"
\n"+e+"
\n"},a.prototype.html=function(e){return e},a.prototype.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},a.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},a.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},a.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},a.prototype.checkbox=function(e){return" "},a.prototype.paragraph=function(e){return"

    "+e+"

    \n"},a.prototype.table=function(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
    \n"},a.prototype.tablerow=function(e){return"\n"+e+"\n"},a.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},a.prototype.strong=function(e){return""+e+""},a.prototype.em=function(e){return""+e+""},a.prototype.codespan=function(e){return""+e+""},a.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},a.prototype.del=function(e){return""+e+""},a.prototype.link=function(e,t,n){if(null===(e=d(this.options.sanitize,this.options.baseUrl,e)))return n;var r='
    "},a.prototype.image=function(e,t,n){if(null===(e=d(this.options.sanitize,this.options.baseUrl,e)))return n;var r=''+n+'":">"},a.prototype.text=function(e){return e},s.prototype.strong=s.prototype.em=s.prototype.codespan=s.prototype.del=s.prototype.text=function(e){return e},s.prototype.link=s.prototype.image=function(e,t,n){return""+n},s.prototype.br=function(){return""},l.parse=function(e,t){return new l(t).parse(e)},l.prototype.parse=function(e){this.inline=new i(e.links,this.options),this.inlineText=new i(e.links,y({},this.options,{renderer:new s})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},l.prototype.next=function(){return this.token=this.tokens.pop(),this.token},l.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},l.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},l.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,p(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,o="",i="";for(n="",e=0;e?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do{this.seen[n]++,t=n+"-"+this.seen[n]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},u.escapeTest=/[&<>"']/,u.escapeReplace=/[&<>"']/g,u.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},u.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,u.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var h={},m=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function g(){}function y(e){for(var t,n,r=1;r=0&&"\\"===n[o];)r=!r;return r?"|":" |"})).split(/ \|/),r=0;if(n.length>t)n.splice(t);else for(;n.lengthAn error occurred:

    "+u(e.message+"",!0)+"
    ";throw e}}g.exec=g,k.options=k.setOptions=function(e){return y(k.defaults,e),k},k.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new a,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,xhtml:!1}},k.defaults=k.getDefaults(),k.Parser=l,k.parser=l.parse,k.Renderer=a,k.TextRenderer=s,k.Lexer=r,k.lexer=r.lex,k.InlineLexer=i,k.inlineLexer=i.output,k.Slugger=c,k.parse=k,e.exports=k}(this||"undefined"!=typeof window&&window)}).call(this,n(6))},function(e,t,n){var r=n(7);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var r=n(37),o=n(54),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+r).toString(36)}},function(e,t,n){var r=n(18),o=n(70),i=n(38),a=n(32),s=n(52),l=n(13),c=n(94),u=Object.getOwnPropertyDescriptor;t.f=r?u:function(e,t){if(e=a(e),t=s(t,!0),c)try{return u(e,t)}catch(e){}if(l(e,t))return i(!o.f.call(e,t),e[t])}},function(e,t,n){var r=n(19),o=n(164),i=n(73),a=n(39),s=n(103),l=n(67),c=n(53)("IE_PROTO"),u=function(){},p=function(){var e,t=l("iframe"),n=i.length;for(t.style.display="none",s.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write("