From c9d73fe00f40749dafa72eddd109422685471083 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 5 Dec 2024 11:17:34 +0100 Subject: [PATCH 1/3] feat: Bookmark feature Resolves #1487 --- start-client/dev/api.mock.json | 1532 +++++++++++++---- start-client/src/components/Application.js | 18 +- .../src/components/common/builder/Fields.js | 56 +- .../src/components/common/builder/Loading.js | 5 +- .../src/components/common/favorite/Add.js | 185 ++ .../components/common/favorite/Favorite.js | 26 + .../src/components/common/favorite/Modal.js | 191 ++ .../src/components/common/favorite/Utils.js | 16 + .../src/components/common/favorite/index.js | 1 + .../src/components/common/form/Button.js | 7 +- .../src/components/common/history/Modal.js | 24 +- .../src/components/common/icons/Icons.js | 66 + .../src/components/common/icons/index.js | 3 + .../src/components/common/layout/SideLeft.js | 53 +- start-client/src/components/reducer/App.js | 73 +- start-client/src/styles/_dark.scss | 26 +- start-client/src/styles/_main.scss | 23 +- start-client/src/styles/_responsive.scss | 2 +- start-client/src/styles/favorite.scss | 197 +++ start-client/src/styles/history.scss | 31 + start-client/webpack.common.js | 11 +- start-client/webpack.prod.js | 2 +- 22 files changed, 2131 insertions(+), 417 deletions(-) create mode 100644 start-client/src/components/common/favorite/Add.js create mode 100644 start-client/src/components/common/favorite/Favorite.js create mode 100644 start-client/src/components/common/favorite/Modal.js create mode 100644 start-client/src/components/common/favorite/Utils.js create mode 100644 start-client/src/components/common/favorite/index.js create mode 100644 start-client/src/styles/favorite.scss diff --git a/start-client/dev/api.mock.json b/start-client/dev/api.mock.json index de9d03c893..66d86adc4b 100644 --- a/start-client/dev/api.mock.json +++ b/start-client/dev/api.mock.json @@ -1,21 +1,25 @@ { "_links": { - "maven-project": { - "href": "https://start.spring.io/starter.zip?type=maven-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", - "templated": true - }, - "maven-build": { - "href": "https://start.spring.io/pom.xml?type=maven-build{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", - "templated": true - }, "gradle-project": { "href": "https://start.spring.io/starter.zip?type=gradle-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true }, + "gradle-project-kotlin": { + "href": "https://start.spring.io/starter.zip?type=gradle-project-kotlin{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "templated": true + }, "gradle-build": { "href": "https://start.spring.io/build.gradle?type=gradle-build{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true }, + "maven-project": { + "href": "https://start.spring.io/starter.zip?type=maven-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "templated": true + }, + "maven-build": { + "href": "https://start.spring.io/pom.xml?type=maven-build{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "templated": true + }, "dependencies": { "href": "https://start.spring.io/dependencies{?bootVersion}", "templated": true @@ -27,13 +31,23 @@ { "name": "Developer Tools", "values": [ + { + "id": "native", + "name": "GraalVM Native Support", + "description": "Support for compiling Spring applications to native executables using the GraalVM native-image compiler." + }, + { + "id": "dgs-codegen", + "name": "GraphQL DGS Code Generation", + "description": "Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files." + }, { "id": "devtools", "name": "Spring Boot DevTools", "description": "Provides fast application restarts, LiveReload, and configurations for enhanced development experience.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using-boot-devtools", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/using/devtools.html", "templated": true } } @@ -46,13 +60,35 @@ { "id": "configuration-processor", "name": "Spring Configuration Processor", - "description": "Generate metadata for developers to offer contextual help and “code completion” when working with custom configuration keys (ex.application.properties/.yml files).", + "description": "Generate metadata for developers to offer contextual help and \"code completion\" when working with custom configuration keys (ex.application.properties/.yml files).", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/specification/configuration-metadata/annotation-processor.html", + "templated": true + } + } + }, + { + "id": "docker-compose", + "name": "Docker Compose Support", + "description": "Provides docker compose support for enhanced development experience.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#configuration-metadata-annotation-processor", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/features/dev-services.html#features.dev-services.docker-compose", "templated": true } } + }, + { + "id": "modulith", + "name": "Spring Modulith", + "description": "Support for building modular monolithic applications.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-modulith/reference/" + } + } } ] }, @@ -79,7 +115,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-developing-web-applications", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html", "templated": true } } @@ -87,7 +123,32 @@ { "id": "webflux", "name": "Spring Reactive Web", - "description": "Build reactive web applications with Spring WebFlux and Netty." + "description": "Build reactive web applications with Spring WebFlux and Netty.", + "_links": { + "guide": { + "href": "https://spring.io/guides/gs/reactive-rest-service/", + "title": "Building a Reactive RESTful Web Service" + }, + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/reactive.html", + "templated": true + } + } + }, + { + "id": "graphql", + "name": "Spring for GraphQL", + "description": "Build GraphQL applications with Spring for GraphQL and GraphQL Java.", + "_links": { + "guide": { + "href": "https://spring.io/guides/gs/graphql-server/", + "title": "Building a GraphQL service" + }, + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-graphql.html", + "templated": true + } + } }, { "id": "data-rest", @@ -109,7 +170,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-use-exposing-spring-data-repositories-rest-endpoint", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-access.html#howto.data-access.exposing-spring-data-repositories-as-rest", "templated": true } } @@ -117,11 +178,16 @@ { "id": "session", "name": "Spring Session", - "description": "Provides an API and implementations for managing user session information." + "description": "Provides an API and implementations for managing user session information.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-session/reference/" + } + } }, { - "id": "data-rest-hal", - "name": "Rest Repositories HAL Browser", + "id": "data-rest-explorer", + "name": "Rest Repositories HAL Explorer", "description": "Browsing Spring Data REST repositories in your browser." }, { @@ -134,7 +200,7 @@ "title": "Building a Hypermedia-Driven RESTful Web Service" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-hateoas", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-hateoas.html", "templated": true } } @@ -149,7 +215,7 @@ "title": "Producing a SOAP web service" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-webservices", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/webservices.html", "templated": true } } @@ -160,7 +226,7 @@ "description": "Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jersey", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.jersey", "templated": true } } @@ -168,13 +234,41 @@ { "id": "vaadin", "name": "Vaadin", - "description": "Java framework for building rich client apps based on Web components.", + "description": "The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "guide": { "href": "https://spring.io/guides/gs/crud-with-vaadin/", "title": "Creating CRUD UI with Vaadin" }, - "reference": { "href": "https://vaadin.com/docs" } + "reference": { + "href": "https://vaadin.com/docs" + } + } + }, + { + "id": "netflix-dgs", + "name": "Netflix DGS", + "description": "Build GraphQL applications with Netflix DGS and Spring for GraphQL.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://netflix.github.io/dgs/" + } + } + }, + { + "id": "htmx", + "name": "htmx", + "description": "Build modern user interfaces with the simplicity and power of hypertext.", + "versionRange": "[3.3.0,3.4.0-M1)", + "_links": { + "reference": { + "href": "https://github.com/wimdeblauwe/htmx-spring-boot" + }, + "guide": { + "href": "https://www.youtube.com/watch?v=j-rfPoXe5aE" + } } } ] @@ -192,7 +286,7 @@ "title": "Handling Form Submission" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", "templated": true } } @@ -203,7 +297,7 @@ "description": "Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", "templated": true } } @@ -211,10 +305,10 @@ { "id": "mustache", "name": "Mustache", - "description": "Logic-less Templates. There are no if statements, else clauses, or for loops. Instead there are only tags.", + "description": "Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", "templated": true } } @@ -225,10 +319,20 @@ "description": "Groovy templating engine.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", "templated": true } } + }, + { + "id": "jte", + "name": "JTE", + "description": "Secure and lightweight template engine for Java and Kotlin.", + "_links": { + "reference": { + "href": "https://jte.gg/" + } + } } ] }, @@ -255,7 +359,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html", "templated": true } } @@ -266,7 +370,18 @@ "description": "Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-client", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.client", + "templated": true + } + } + }, + { + "id": "oauth2-authorization-server", + "name": "OAuth2 Authorization Server", + "description": "Spring Boot integration for Spring Authorization Server.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.authorization-server", "templated": true } } @@ -275,10 +390,9 @@ "id": "oauth2-resource-server", "name": "OAuth2 Resource Server", "description": "Spring Boot integration for Spring Security's OAuth2 resource server features.", - "versionRange": "2.1.0.M2", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-server", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.server", "templated": true } } @@ -289,7 +403,7 @@ "description": "Makes it easier to build Spring based applications that use the Lightweight Directory Access Protocol.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-ldap", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap", "templated": true } } @@ -298,7 +412,7 @@ "id": "okta", "name": "Okta", "description": "Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC.", - "versionRange": "2.1.2.RELEASE", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "guide": [ { @@ -315,7 +429,8 @@ } ], "reference": { - "href": "https://github.com/okta/okta-spring-boot/blob/master/README.md" + "href": "https://github.com/okta/okta-spring-boot#readme", + "title": "Okta Spring Boot documentation" } } } @@ -340,7 +455,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-sql", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html", "templated": true } } @@ -355,7 +470,7 @@ "title": "Accessing Data with JPA" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jpa-and-spring-data", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jpa-and-spring-data", "templated": true } } @@ -364,37 +479,41 @@ "id": "data-jdbc", "name": "Spring Data JDBC", "description": "Persist data in SQL stores with plain JDBC using Spring Data.", - "versionRange": "2.1.0.RELEASE", "_links": { "guide": { "href": "https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics", "title": "Using Spring Data JDBC" }, "reference": { - "href": "https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/" + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jdbc", + "templated": true } } }, { "id": "data-r2dbc", - "name": "Spring Data R2DBC [Experimental]", + "name": "Spring Data R2DBC", "description": "Provides Reactive Relational Database Connectivity to persist data in SQL stores using Spring Data in reactive applications.", - "versionRange": "2.2.0.M6", "_links": { "guide": { - "href": "https://github.com/spring-projects-experimental/spring-boot-r2dbc/tree/master/spring-boot-example-h2", - "title": "R2DBC example" + "href": "https://spring.io/guides/gs/accessing-data-r2dbc/", + "title": "Accessing data with R2DBC" }, "reference": { - "href": "https://docs.spring.io/spring-data/r2dbc/docs/1.0.x/reference/html/#reference" + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.r2dbc", + "templated": true }, - "home": { "href": "https://r2dbc.io", "title": "R2DBC Homepage" } + "home": { + "href": "https://r2dbc.io", + "title": "R2DBC Homepage" + } } }, { "id": "mybatis", "name": "MyBatis Framework", "description": "Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { "href": "https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start", @@ -411,7 +530,7 @@ "description": "Liquibase database migration and source control library.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.liquibase", "templated": true } } @@ -422,7 +541,7 @@ "description": "Version control for your database so you can migrate from any version (incl. an empty database) to the latest version of the schema.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.flyway", "templated": true } } @@ -433,7 +552,7 @@ "description": "Generate Java code from your database and build type safe SQL queries through a fluent API.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jooq", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jooq", "templated": true } } @@ -441,8 +560,7 @@ { "id": "db2", "name": "IBM DB2 Driver", - "description": "A JDBC driver that provides access to IBM DB2.", - "versionRange": "2.2.0.M6" + "description": "A JDBC driver that provides access to IBM DB2." }, { "id": "derby", @@ -459,6 +577,11 @@ "name": "HyperSQL Database", "description": "Lightweight 100% Java SQL Database Engine." }, + { + "id": "mariadb", + "name": "MariaDB Driver", + "description": "MariaDB JDBC and R2DBC driver." + }, { "id": "sqlserver", "name": "MS SQL Server Driver", @@ -467,7 +590,7 @@ { "id": "mysql", "name": "MySQL Driver", - "description": "MySQL JDBC and R2DBC driver.", + "description": "MySQL JDBC driver.", "_links": { "guide": { "href": "https://spring.io/guides/gs/accessing-data-mysql/", @@ -478,8 +601,7 @@ { "id": "oracle", "name": "Oracle Driver", - "description": "A JDBC driver that provides access to Oracle.", - "versionRange": "2.2.0.RC1" + "description": "A JDBC driver that provides access to Oracle." }, { "id": "postgresql", @@ -501,7 +623,7 @@ "title": "Messaging with Redis" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis", "templated": true } } @@ -516,7 +638,7 @@ "title": "Messaging with Redis" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis", "templated": true } } @@ -531,7 +653,7 @@ "title": "Accessing Data with MongoDB" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb", "templated": true } } @@ -541,8 +663,12 @@ "name": "Spring Data Reactive MongoDB", "description": "Provides asynchronous stream processing with non-blocking back pressure for MongoDB.", "_links": { + "guide": { + "href": "https://spring.io/guides/gs/accessing-data-mongodb/", + "title": "Accessing Data with MongoDB" + }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb", "templated": true } } @@ -553,18 +679,7 @@ "description": "A distributed, RESTful search and analytics engine with Spring Data Elasticsearch.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-elasticsearch", - "templated": true - } - } - }, - { - "id": "data-solr", - "name": "Spring Data for Apache Solr", - "description": "Apache Solr is an open source enterprise search platform built on Apache Lucene.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-solr", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.elasticsearch", "templated": true } } @@ -574,8 +689,11 @@ "name": "Spring Data for Apache Cassandra", "description": "A free and open-source, distributed, NoSQL database management system that offers high-scalability and high-performance.", "_links": { + "guide": { + "href": "https://spring.io/guides/gs/accessing-data-cassandra/" + }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra", "templated": true } } @@ -585,28 +703,12 @@ "name": "Spring Data Reactive for Apache Cassandra", "description": "Access Cassandra NoSQL Database in a reactive fashion.", "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra", - "templated": true - } - } - }, - { - "id": "geode", - "name": "Spring for Apache Geode", - "description": "Apache Geode is a data management platform that helps users build real-time, highly concurrent, highly performant and reliable Spring Boot applications at scale that is compatible with Pivotal Cloud Cache.", - "versionRange": "2.2.0.M5", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot-data-geode-build/current/reference/html5/" - }, "guide": { - "href": "https://github.com/spring-projects/spring-boot-data-geode/tree/master/spring-geode-samples", - "title": "Using Spring for Apache Geode" + "href": "https://spring.io/guides/gs/accessing-data-cassandra/" }, - "other": { - "href": "https://docs.spring.io/spring-boot-data-geode-build/current/reference/html5/#geode-gemfire-switch", - "title": "Switch from Apache Geode to Pivotal Cloud Cache" + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra", + "templated": true } } }, @@ -616,7 +718,7 @@ "description": "NoSQL document-oriented database that offers in memory-first architecture, geo-distributed deployments, and workload isolation.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase", "templated": true } } @@ -627,7 +729,7 @@ "description": "Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase", "templated": true } } @@ -642,7 +744,7 @@ "title": "Accessing Data with Neo4j" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-neo4j", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.neo4j", "templated": true } } @@ -662,7 +764,7 @@ "title": "Integrating Data" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-integration", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/spring-integration.html", "templated": true } } @@ -677,18 +779,28 @@ "title": "Messaging with RabbitMQ" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-amqp", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/amqp.html", "templated": true } } }, + { + "id": "amqp-streams", + "name": "Spring for RabbitMQ Streams", + "description": "Building stream processing applications with RabbitMQ.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-amqp/reference/stream.html" + } + } + }, { "id": "kafka", "name": "Spring for Apache Kafka", "description": "Publish, subscribe, store, and process streams of records.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-kafka", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/kafka.html", "templated": true } } @@ -704,11 +816,11 @@ }, "reference": [ { - "href": "https://docs.spring.io/spring-kafka/docs/current/reference/html/_reference.html#kafka-streams", + "href": "https://docs.spring.io/spring-kafka/reference/streams.html", "title": "Apache Kafka Streams Support" }, { - "href": "https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream", + "href": "https://docs.spring.io/spring-cloud-stream/reference/kafka/kafka-streams-binder/usage.html", "title": "Apache Kafka Streams Binding Capabilities of Spring Cloud Stream" } ] @@ -724,7 +836,7 @@ "title": "Java Message Service API via Apache ActiveMQ Classic." }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-activemq", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.activemq", "templated": true } } @@ -739,7 +851,29 @@ "title": "Messaging with JMS" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-artemis", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.artemis", + "templated": true + } + } + }, + { + "id": "pulsar", + "name": "Spring for Apache Pulsar", + "description": "Build messaging applications with Apache Pulsar", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html", + "templated": true + } + } + }, + { + "id": "pulsar-reactive", + "name": "Spring for Apache Pulsar (Reactive)", + "description": "Build reactive messaging applications with Apache Pulsar", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html", "templated": true } } @@ -747,14 +881,14 @@ { "id": "websocket", "name": "WebSocket", - "description": "Build WebSocket applications with SockJS and STOMP.", + "description": "Build Servlet-based WebSocket applications with SockJS and STOMP.", "_links": { "guide": { "href": "https://spring.io/guides/gs/messaging-stomp-websocket/", "title": "Using WebSocket to build an interactive web application" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-websockets", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/websockets.html", "templated": true } } @@ -763,16 +897,20 @@ "id": "rsocket", "name": "RSocket", "description": "RSocket.io applications with Spring Messaging and Netty.", - "versionRange": "2.2.0.M2" + "_links": { + "reference": { + "href": "https://rsocket.io/" + } + } }, { "id": "camel", "name": "Apache Camel", - "description": "Apache Camel lets you create the Enterprise Integration Patterns to implement routing and mediation rules a Java based Domain Specific Language via Spring.", - "versionRange": "[2.0.0.M1,2.2.0.M1)", + "description": "Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { - "href": "https://camel.apache.org/spring-boot", + "href": "https://camel.apache.org/camel-spring-boot/latest/spring-boot.html", "title": "Using Apache Camel with Spring Boot" } } @@ -780,22 +918,19 @@ { "id": "solace", "name": "Solace PubSub+", - "description": "Connect to a Solace PubSub+ Advanced Event Broker using the Solace JMS support to send and receive messages.", - "versionRange": "2.1.0.RELEASE", + "description": "Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "reference": [ { - "href": "https://solace.dev", - "title": "Solace Developer Portal" + "href": "https://www.solace.dev/start-spring-io-help/", + "title": "Getting started with Solace and Spring" }, { - "href": "https://github.com/SolaceProducts/solace-jms-spring-boot" + "href": "https://solace.dev", + "title": "Solace Developer Portal" } - ], - "guide": { - "href": "https://github.com/SolaceProducts/solace-jms-spring-boot/tree/master/solace-jms-sample-app", - "title": "Solace sample application using JMS." - } + ] } } ] @@ -813,7 +948,21 @@ "title": "Creating a Batch Service" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-batch-applications", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/batch.html", + "templated": true + } + } + }, + { + "id": "validation", + "name": "Validation", + "description": "Bean Validation with Hibernate validator.", + "_links": { + "guide": { + "href": "https://spring.io/guides/gs/validating-form-input/" + }, + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/validation.html", "templated": true } } @@ -824,7 +973,7 @@ "description": "Send email using Java Mail and Spring Framework's JavaMailSender.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-email", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/email.html", "templated": true } } @@ -832,11 +981,17 @@ { "id": "quartz", "name": "Quartz Scheduler", - "description": "Schedule jobs using Quartz." + "description": "Schedule jobs using Quartz.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/quartz.html", + "templated": true + } + } }, { "id": "cache", - "name": "Spring cache abstraction", + "name": "Spring Cache Abstraction", "description": "Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store.", "_links": { "guide": { @@ -844,10 +999,21 @@ "title": "Caching Data with Spring" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-caching", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/caching.html", "templated": true } } + }, + { + "id": "spring-shell", + "name": "Spring Shell", + "description": "Build command line applications with spring.", + "versionRange": "[3.3.0,3.4.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-shell/reference/index.html" + } + } } ] }, @@ -864,16 +1030,27 @@ "title": "Building a RESTful Web Service with Spring Boot Actuator" }, "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#production-ready", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/index.html", + "templated": true + } + } + }, + { + "id": "sbom-cyclone-dx", + "name": "CycloneDX SBOM support", + "description": "Creates a Software Bill of Materials in CycloneDX format.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/endpoints.html#actuator.endpoints.sbom", "templated": true } } }, { "id": "codecentric-spring-boot-admin-client", - "name": "Spring Boot Admin (Client)", - "description": "Required for your application to register with a Spring Boot Admin Server instance.", - "versionRange": "[2.0.0.RELEASE,2.2.0.M1)", + "name": "codecentric's Spring Boot Admin (Client)", + "description": "Required for your application to register with a Codecentric's Spring Boot Admin Server instance.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "reference": { "href": "https://codecentric.github.io/spring-boot-admin/current/#getting-started" @@ -882,165 +1059,290 @@ }, { "id": "codecentric-spring-boot-admin-server", - "name": "Spring Boot Admin (Server)", + "name": "codecentric's Spring Boot Admin (Server)", "description": "A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints.", - "versionRange": "[2.0.0.RELEASE,2.2.0.M1)", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "reference": { "href": "https://codecentric.github.io/spring-boot-admin/current/#getting-started" } } + }, + { + "id": "sentry", + "name": "Sentry", + "description": "Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously.", + "versionRange": "[3.3.0,3.3.0-M1)", + "_links": { + "guide": { + "href": "https://docs.sentry.io/platforms/java/guides/spring-boot/", + "title": "Getting Started with Sentry" + }, + "reference": { + "href": "https://docs.sentry.io/platforms/java/" + } + } } ] }, { - "name": "Testing", + "name": "Observability", "values": [ { - "id": "restdocs", - "name": "Spring REST Docs", - "description": "Document RESTful services by combining hand-written with Asciidoctor and auto-generated snippets produced with Spring MVC Test." + "id": "datadog", + "name": "Datadog", + "description": "Publish Micrometer metrics to Datadog, a dimensional time-series SaaS with built-in dashboarding and alerting.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.datadog", + "templated": true + } + } }, { - "id": "cloud-contract-verifier", - "name": "Contract Verifier", - "description": "Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development.", + "id": "dynatrace", + "name": "Dynatrace", + "description": "Publish Micrometer metrics to Dynatrace, a platform featuring observability, AIOps, application security and analytics.", "_links": { - "guide": { - "href": "https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html#_spring_cloud_contract_verifier_setup", - "title": "Spring Cloud Contract Verifier Setup" + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.dynatrace", + "templated": true } } }, { - "id": "cloud-contract-stub-runner", - "name": "Contract Stub Runner", - "description": "Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests." + "id": "influx", + "name": "Influx", + "description": "Publish Micrometer metrics to InfluxDB, a dimensional time-series server that support real-time stream processing of data.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.influx", + "templated": true + } + } }, { - "id": "unboundid-ldap", - "name": "Embedded LDAP Server", - "description": "Provides a platform neutral way for running a LDAP server in unit tests.", + "id": "graphite", + "name": "Graphite", + "description": "Publish Micrometer metrics to Graphite, a hierarchical metrics system backed by a fixed-size database.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/html/boot-features-nosql.html#boot-features-ldap-embedded", + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.graphite", "templated": true } } }, { - "id": "flapdoodle-mongo", - "name": "Embedded MongoDB Database", - "description": "Provides a platform neutral way for running MongoDB in unit tests." - } - ] - }, - { - "name": "Spring Cloud", - "values": [ + "id": "new-relic", + "name": "New Relic", + "description": "Publish Micrometer metrics to New Relic, a SaaS offering with a full UI and a query language called NRQL.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.newrelic", + "templated": true + } + } + }, { - "id": "cloud-starter", - "name": "Cloud Bootstrap", - "description": "Non-specific Spring Cloud features, unrelated to external libraries or integrations (e.g. Bootstrap context and @RefreshScope).", + "id": "otlp-metrics", + "name": "OTLP for metrics", + "description": "Publish Micrometer metrics to an OpenTelemetry Protocol (OTLP) capable backend.", "_links": { "reference": { - "href": "https://spring.io/projects/spring-cloud-commons" + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.otlp", + "templated": true } } }, { - "id": "cloud-function", - "name": "Function", - "description": "Promotes the implementation of business logic via functions and supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS).", + "id": "prometheus", + "name": "Prometheus", + "description": "Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations.", "_links": { "reference": { - "href": "https://cloud.spring.io/spring-cloud-function/" - }, - "sample": { - "href": "https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples", - "title": "Various sample apps using Spring Cloud Function" + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.prometheus", + "templated": true } } }, { - "id": "cloud-task", - "name": "Task", - "description": "Allows a user to develop and run short lived microservices using Spring Cloud. Run them locally, in the cloud, and on Spring Cloud Data Flow." - } - ] - }, - { - "name": "Spring Cloud Security", - "values": [ + "id": "distributed-tracing", + "name": "Distributed Tracing", + "description": "Enable span and trace IDs in logs." + }, { - "id": "cloud-security", - "name": "Cloud Security", - "description": "A declarative model which can be heavily configured externally (or centrally) lends itself to the implementation of large systems of co-operating, remote components, usually with a central indentity management service." + "id": "wavefront", + "name": "Wavefront", + "description": "Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack." }, { - "id": "cloud-oauth2", - "name": "Cloud OAuth2", - "description": "OAuth2 and distributed application patterns with spring-cloud-security." + "id": "zipkin", + "name": "Zipkin", + "description": "Enable and expose span and trace IDs to Zipkin." } ] }, { - "name": "Spring Cloud Tools", + "name": "Testing", "values": [ { - "id": "cloud-connectors", - "name": "Cloud Connectors", - "description": "Simplifies the process of connecting to services and gaining operating environment awareness in cloud platforms such as Cloud Foundry and Heroku." + "id": "restdocs", + "name": "Spring REST Docs", + "description": "Document RESTful services by combining hand-written with Asciidoctor and auto-generated snippets produced with Spring MVC Test.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/" + } + } }, { - "id": "open-service-broker", - "name": "Open Service Broker", - "description": "Framework for building Spring Boot apps that implement the Open Service Broker API, which can deliver services to applications running within cloud native platforms such as Cloud Foundry, Kubernetes and OpenShift.", + "id": "testcontainers", + "name": "Testcontainers", + "description": "Provide lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-cloud-open-service-broker/docs/current/reference/html5/" - }, - "guide": { - "href": "https://github.com/spring-cloud-samples/bookstore-service-broker", - "title": "Using Spring Cloud Open Service Broker" + "href": "https://java.testcontainers.org/" } } - } - ] - }, - { - "name": "Spring Cloud Config", - "values": [ - { - "id": "cloud-config-client", - "name": "Config Client", - "description": "Client that connects to a Spring Cloud Config Server to fetch the application's configuration." }, { - "id": "cloud-config-server", - "name": "Config Server", - "description": "Central management for configuration via Git, SVN, or HashiCorp Vault.", + "id": "cloud-contract-verifier", + "name": "Contract Verifier", + "description": "Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-contract/reference/" + } + } + }, + { + "id": "cloud-contract-stub-runner", + "name": "Contract Stub Runner", + "description": "Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-contract/reference/project-features-stubrunner.html" + } + } + }, + { + "id": "unboundid-ldap", + "name": "Embedded LDAP Server", + "description": "Provides a platform neutral way for running a LDAP server in unit tests.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap.embedded", + "templated": true + } + } + } + ] + }, + { + "name": "Spring Cloud", + "values": [ + { + "id": "cloud-starter", + "name": "Cloud Bootstrap", + "description": "Non-specific Spring Cloud features, unrelated to external libraries or integrations (e.g. Bootstrap context and @RefreshScope).", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/application-context-services.html" + } + } + }, + { + "id": "cloud-function", + "name": "Function", + "description": "Promotes the implementation of business logic via functions and supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS).", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-function/reference/" + }, + "sample": { + "href": "https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-samples", + "title": "Various sample apps using Spring Cloud Function" + } + } + }, + { + "id": "cloud-task", + "name": "Task", + "description": "Allows a user to develop and run short lived microservices using Spring Cloud. Run them locally, in the cloud, and on Spring Cloud Data Flow.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-task/reference/" + } + } + } + ] + }, + { + "name": "Spring Cloud Config", + "values": [ + { + "id": "cloud-config-client", + "name": "Config Client", + "description": "Client that connects to a Spring Cloud Config Server to fetch the application's configuration.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-config/reference/client.html" + } + } + }, + { + "id": "cloud-config-server", + "name": "Config Server", + "description": "Central management for configuration via Git, SVN, or HashiCorp Vault.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { "href": "https://spring.io/guides/gs/centralized-configuration/", "title": "Centralized Configuration" + }, + "reference": { + "href": "https://docs.spring.io/spring-cloud-config/reference/server.html" } } }, { "id": "cloud-starter-vault-config", "name": "Vault Configuration", - "description": "Provides client-side support for externalized configuration in a distributed system. Using HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments." + "description": "Provides client-side support for externalized configuration in a distributed system. Using HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-vault/reference/" + } + } }, { "id": "cloud-starter-zookeeper-config", "name": "Apache Zookeeper Configuration", - "description": "Enable and configure common patterns inside your application and build large distributed systems with Apache Zookeeper based components. The provided patterns include Service Discovery and Configuration." + "description": "Enable and configure common patterns inside your application and build large distributed systems with Apache Zookeeper based components. The provided patterns include Service Discovery and Configuration.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-zookeeper/reference/config.html" + } + } }, { "id": "cloud-starter-consul-config", "name": "Consul Configuration", - "description": "Enable and configure the common patterns inside your application and build large distributed systems with Hashicorp’s Consul. The patterns provided include Service Discovery, Distributed Configuration and Control Bus." + "description": "Enable and configure the common patterns inside your application and build large distributed systems with Hashicorp’s Consul. The patterns provided include Service Discovery, Distributed Configuration and Control Bus.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-consul/reference/" + } + } } ] }, @@ -1050,33 +1352,54 @@ { "id": "cloud-eureka", "name": "Eureka Discovery Client", - "description": "a REST based service for locating services for the purpose of load balancing and failover of middle-tier servers." + "description": "A REST based service for locating services for the purpose of load balancing and failover of middle-tier servers.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "guide": { + "href": "https://spring.io/guides/gs/service-registration-and-discovery/", + "title": "Service Registration and Discovery with Eureka and Spring Cloud" + }, + "reference": { + "href": "https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#_service_discovery_eureka_clients" + } + } }, { "id": "cloud-eureka-server", "name": "Eureka Server", "description": "spring-cloud-netflix Eureka Server.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { "href": "https://spring.io/guides/gs/service-registration-and-discovery/", - "title": "Service Registration and Discovery" + "title": "Service Registration and Discovery with Eureka and Spring Cloud" + }, + "reference": { + "href": "https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#spring-cloud-eureka-server" } } }, { "id": "cloud-starter-zookeeper-discovery", "name": "Apache Zookeeper Discovery", - "description": "Service discovery with Apache Zookeeper." - }, - { - "id": "cloud-cloudfoundry-discovery", - "name": "Cloud Foundry Discovery", - "description": "Service discovery with Cloud Foundry." + "description": "Service discovery with Apache Zookeeper.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-zookeeper/reference/discovery.html" + } + } }, { "id": "cloud-starter-consul-discovery", "name": "Consul Discovery", - "description": "Service discovery with Hashicorp Consul." + "description": "Service discovery with Hashicorp Consul.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-consul/reference/discovery.html" + } + } } ] }, @@ -1084,21 +1407,25 @@ "name": "Spring Cloud Routing", "values": [ { - "id": "cloud-zuul", - "name": "Zuul", - "description": "Intelligent and programmable routing with Spring Cloud Netflix Zuul.", + "id": "cloud-gateway", + "name": "Gateway", + "description": "Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { - "guide": { - "href": "https://spring.io/guides/gs/routing-and-filtering/", - "title": "Routing and Filtering" + "reference": { + "href": "https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway-server-mvc.html" } } }, { - "id": "cloud-gateway", - "name": "Gateway", - "description": "Provides a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as security, monitoring/metrics, and resiliency.", + "id": "cloud-gateway-reactive", + "name": "Reactive Gateway", + "description": "Provides a simple, yet effective way to route to APIs in reactive applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway.html" + }, "guide": { "href": "https://github.com/spring-cloud-samples/spring-cloud-gateway-sample", "title": "Using Spring Cloud Gateway" @@ -1106,66 +1433,50 @@ } }, { - "id": "cloud-ribbon", - "name": "Ribbon", - "description": "Client side load balancing with Spring Cloud Netflix and Ribbon.", + "id": "cloud-feign", + "name": "OpenFeign", + "description": "Declarative REST Client. OpenFeign creates a dynamic implementation of an interface decorated with JAX-RS or Spring MVC annotations.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { - "guide": { - "href": "https://spring.io/guides/gs/client-side-load-balancing/", - "title": "Client Side Load Balancing with Ribbon and Spring Cloud" + "sample": { + "href": "https://github.com/spring-cloud-samples/feign-eureka", + "title": "Declarative REST calls with Spring Cloud OpenFeign sample" + }, + "reference": { + "href": "https://docs.spring.io/spring-cloud-openfeign/reference/" } } }, { - "id": "cloud-feign", - "name": "OpenFeign", - "description": "Declarative REST Client. OpenFeign creates a dynamic implementation of an interface decorated with JAX-RS or Spring MVC annotations." - } - ] - }, - { - "name": "Spring Cloud Circuit Breaker", - "values": [ - { - "id": "cloud-hystrix", - "name": "Hystrix", - "description": "Circuit breaker with Spring Cloud Netflix Hystrix.", + "id": "cloud-loadbalancer", + "name": "Cloud LoadBalancer", + "description": "Client-side load-balancing with Spring Cloud LoadBalancer.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { - "href": "https://spring.io/guides/gs/circuit-breaker/", - "title": "Circuit Breaker" + "href": "https://spring.io/guides/gs/spring-cloud-loadbalancer/", + "title": "Client-side load-balancing with Spring Cloud LoadBalancer" + }, + "reference": { + "href": "https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html" } } - }, - { - "id": "cloud-hystrix-dashboard", - "name": "Hystrix Dashboard", - "description": "Circuit breaker dashboard with Spring Cloud Netflix Hystrix." - }, - { - "id": "cloud-turbine", - "name": "Turbine", - "description": "Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and server-sent events." - }, - { - "id": "cloud-turbine-stream", - "name": "Turbine Stream", - "description": "Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and Spring Cloud Stream (requires a binder, e.g. Apache Kafka or RabbitMQ)." } ] }, { - "name": "Spring Cloud Tracing", + "name": "Spring Cloud Circuit Breaker", "values": [ { - "id": "cloud-starter-sleuth", - "name": "Sleuth", - "description": "Distributed tracing via logs with Spring Cloud Sleuth." - }, - { - "id": "cloud-starter-zipkin", - "name": "Zipkin Client", - "description": "Distributed tracing with an existing Zipkin installation and Spring Cloud Sleuth Zipkin." + "id": "cloud-resilience4j", + "name": "Resilience4J", + "description": "Spring Cloud Circuit breaker with Resilience4j as the underlying implementation.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html" + } + } } ] }, @@ -1175,73 +1486,51 @@ { "id": "cloud-bus", "name": "Cloud Bus", - "description": "Links nodes of a distributed system with a lightweight message broker which can used to broadcast state changes or other management instructions (requires a binder, e.g. Apache Kafka or RabbitMQ)." + "description": "Links nodes of a distributed system with a lightweight message broker which can used to broadcast state changes or other management instructions (requires a binder, e.g. Apache Kafka or RabbitMQ).", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-bus/reference/" + } + } }, { "id": "cloud-stream", "name": "Cloud Stream", - "description": "Framework for building highly scalable event-driven microservices connected with shared messaging systems (requires a binder, e.g. Apache Kafka or RabbitMQ)." - }, - { - "id": "reactive-cloud-stream", - "name": "Reactive Cloud Stream", - "description": "Reactive messaging microservices with Spring Cloud Stream (requires a binder, e.g. Apache Kafka or RabbitMQ).", - "versionRange": "[2.0.0.RELEASE,2.2.0.M1)" + "description": "Framework for building highly scalable event-driven microservices connected with shared messaging systems (requires a binder, e.g. Apache Kafka, Apache Pulsar, RabbitMQ, or Solace PubSub+).", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-cloud-stream/reference/" + } + } } ] }, { - "name": "Pivotal Cloud Foundry", + "name": "VMware Tanzu Application Service", "values": [ { "id": "scs-config-client", - "name": "Config Client (PCF)", - "description": "Config client on Pivotal Cloud Foundry.", + "name": "Config Client (TAS)", + "description": "Config client on VMware Tanzu Application Service.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "reference": { - "href": "https://docs.pivotal.io/spring-cloud-services/" + "href": "https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html" } } }, { "id": "scs-service-registry", - "name": "Service Registry (PCF)", - "description": "Eureka service discovery client on Pivotal Cloud Foundry.", + "name": "Service Registry (TAS)", + "description": "Eureka service discovery client on VMware Tanzu Application Service.", + "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "reference": { - "href": "https://docs.pivotal.io/spring-cloud-services/" + "href": "https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html" } } - }, - { - "id": "scs-circuit-breaker", - "name": "Circuit Breaker (PCF)", - "description": "Hystrix circuit breaker client on Pivotal Cloud Foundry.", - "_links": { - "reference": { - "href": "https://docs.pivotal.io/spring-cloud-services/" - } - } - } - ] - }, - { - "name": "Amazon Web Services", - "values": [ - { - "id": "cloud-aws", - "name": "AWS Core", - "description": "AWS native services from Spring Cloud for AWS." - }, - { - "id": "cloud-aws-jdbc", - "name": "AWS RDS", - "description": "Relational databases on AWS with RDS and Spring Cloud AWS JDBC." - }, - { - "id": "cloud-aws-messaging", - "name": "AWS Simple Queue Service", - "description": "Messaging on AWS with SQS and Spring Cloud AWS Messaging." } ] }, @@ -1251,10 +1540,20 @@ { "id": "azure-support", "name": "Azure Support", - "description": "Auto-configuration for Azure Services (Service Bus, Storage, Active Directory, Cosmos DB, Key Vault, and more).", + "description": "Auto-configuration for Azure Services (Service Bus, Storage, Active Directory, Key Vault, and more).", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { + "guide": { + "href": "https://spring.io/guides/gs/spring-boot-for-azure/", + "title": "Deploying a Spring Boot app to Azure" + }, "reference": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot" + "href": "https://aka.ms/spring/msdocs/developer-guide", + "title": "Spring Cloud Azure developer guide" + }, + "sample": { + "href": "https://aka.ms/spring/samples", + "title": "Azure Samples" } } }, @@ -1262,88 +1561,476 @@ "id": "azure-active-directory", "name": "Azure Active Directory", "description": "Spring Security integration with Azure Active Directory for authentication.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "guide": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-sample", - "title": "Using Active Directory" + "href": "https://aka.ms/spring/msdocs/aad", + "title": "Securing a Java Web App with the Spring Boot Starter for Azure Active Directory" }, "reference": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-active-directory-spring-boot-starter" + "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#spring-security-with-azure-active-directory" + }, + "sample": { + "href": "https://aka.ms/spring/samples/latest/aad", + "title": "Azure Active Directory Sample" } } }, { - "id": "azure-keyvault-secrets", - "name": "Azure Key Vault", - "description": "Manage application secrets and keys.", + "id": "azure-cosmos-db", + "name": "Azure Cosmos DB", + "description": "Fully managed NoSQL database service for modern app development, including Spring Data support.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "guide": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-keyvault-secrets-spring-boot-sample", - "title": "Using Key Vault" + "href": "https://aka.ms/spring/msdocs/cosmos", + "title": "How to use Spring Boot Starter with Azure Cosmos DB SQL API" }, "reference": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-keyvault-secrets-spring-boot-starter" + "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#spring-data-support" + }, + "sample": { + "href": "https://aka.ms/spring/samples/latest/cosmos", + "title": "Azure Cosmos DB Sample" + } + } + }, + { + "id": "azure-keyvault", + "name": "Azure Key Vault", + "description": "All key vault features are supported, e.g. manage application secrets and certificates.", + "versionRange": "[3.3.0,3.4.0-M1)", + "_links": { + "guide": [ + { + "href": "https://aka.ms/spring/msdocs/keyvault", + "title": "Read Secrets from Azure Key Vault in a Spring Boot Application" + }, + { + "href": "https://aka.ms/spring/msdocs/keyvault/certificates", + "title": "Securing Spring Boot Applications with Azure Key Vault Certificates" + } + ], + "reference": { + "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#secret-management" + }, + "sample": { + "href": "https://aka.ms/spring/samples/latest/keyvault", + "title": "Azure Key Vault Sample" } } }, { "id": "azure-storage", "name": "Azure Storage", - "description": "Azure Storage service integration.", + "description": "All Storage features are supported, e.g. blob, fileshare and queue.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "guide": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-storage-spring-boot-sample", - "title": "Using Azure Storage" + "href": "https://aka.ms/spring/msdocs/storage", + "title": "How to use the Spring Boot starter for Azure Storage" }, "reference": { - "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-storage-spring-boot-starter" + "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#resource-handling" + }, + "sample": { + "href": "https://aka.ms/spring/samples/latest/storage", + "title": "Azure Storage Sample" } } } ] }, { - "name": "Google Cloud Platform", + "name": "Google Cloud", "values": [ { "id": "cloud-gcp", - "name": "GCP Support", - "description": "Contains auto-configuration support for every Spring Cloud GCP integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath.", + "name": "Google Cloud Support", + "description": "Contains auto-configuration support for every Google Cloud integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "reference": { - "href": "https://cloud.spring.io/spring-cloud-gcp/reference/html/" + "href": "https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html" }, "guide": { - "href": "https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples", - "title": "GCP Samples" + "href": "https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples", + "title": "Google Cloud Samples" } } }, { "id": "cloud-gcp-pubsub", - "name": "GCP Messaging", - "description": "Adds the GCP Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box.", + "name": "Google Cloud Messaging", + "description": "Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "reference": { - "href": "https://cloud.spring.io/spring-cloud-gcp/reference/html/#spring-integration" + "href": "https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-pubsub" }, "guide": { - "href": "https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample", - "title": "GCP Pub/Sub Sample" + "href": "https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample", + "title": "Google Cloud Pub/Sub Sample" } } }, { "id": "cloud-gcp-storage", - "name": "GCP Storage", - "description": "Adds the GCP Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box.", + "name": "Google Cloud Storage", + "description": "Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box.", + "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "reference": { - "href": "https://cloud.spring.io/spring-cloud-gcp/reference/html/#spring-resources" + "href": "https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-storage" }, "guide": { - "href": "https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample", - "title": "GCP Storage Sample" + "href": "https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample" + } + } + } + ] + }, + { + "name": "AI", + "values": [ + { + "id": "spring-ai-anthropic", + "name": "Anthropic Claude", + "description": "Spring AI support for Anthropic Claude AI models.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/chat/anthropic-chat.html" + } + } + }, + { + "id": "spring-ai-azure-openai", + "name": "Azure OpenAI", + "description": "Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/chat/azure-openai-chat.html" + } + } + }, + { + "id": "spring-ai-vectordb-azure", + "name": "Azure AI Search", + "description": "Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html" + } + } + }, + { + "id": "spring-ai-bedrock", + "name": "Amazon Bedrock", + "description": "Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html" + } + } + }, + { + "id": "spring-ai-bedrock-converse", + "name": "Amazon Bedrock Converse", + "description": "Spring AI support for Amazon Bedrock Converse. It provides a unified interface for conversational AI models with enhanced capabilities including function/tool calling, multimodal inputs, and streaming responses.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/bedrock-converse.html" + } + } + }, + { + "id": "spring-ai-vectordb-cassandra", + "name": "Apache Cassandra Vector Database", + "description": "Spring AI vector database support for Apache Cassandra.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/apache-cassandra.html" + } + } + }, + { + "id": "spring-ai-vectordb-chroma", + "name": "Chroma Vector Database", + "description": "Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html" + } + } + }, + { + "id": "spring-ai-vectordb-elasticsearch", + "name": "Elasticsearch Vector Database", + "description": "Spring AI vector database support for Elasticsearch.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html" + } + } + }, + { + "id": "spring-ai-vectordb-milvus", + "name": "Milvus Vector Database", + "description": "Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html" + } + } + }, + { + "id": "spring-ai-mistral", + "name": "Mistral AI", + "description": "Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/chat/mistralai-chat.html" + } + } + }, + { + "id": "spring-ai-vectordb-mongodb-atlas", + "name": "MongoDB Atlas Vector Database", + "description": "Spring AI vector database support for MongoDB Atlas. Is is a fully managed cloud database service that provides an easy way to deploy, operate, and scale a MongoDB database in the cloud.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html" + } + } + }, + { + "id": "spring-ai-vectordb-neo4j", + "name": "Neo4j Vector Database", + "description": "Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html" + } + } + }, + { + "id": "spring-ai-ollama", + "name": "Ollama", + "description": "Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html" + } + } + }, + { + "id": "spring-ai-openai", + "name": "OpenAI", + "description": "Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html" + } + } + }, + { + "id": "spring-ai-vectordb-oracle", + "name": "Oracle Vector Database", + "description": "Spring AI vector database support for Oracle. Enables storing, indexing and searching vector embeddings in Oracle Database 23ai.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/oracle.html" + } + } + }, + { + "id": "spring-ai-vectordb-pgvector", + "name": "PGvector Vector Database", + "description": "Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html" + } + } + }, + { + "id": "spring-ai-vectordb-pinecone", + "name": "Pinecone Vector Database", + "description": "Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html" + } + } + }, + { + "id": "spring-ai-postgresml", + "name": "PostgresML", + "description": "Spring AI support for the PostgresML text embeddings models.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html" + } + } + }, + { + "id": "spring-ai-vectordb-redis", + "name": "Redis Search and Query Vector Database", + "description": "Spring AI vector database support for Redis Search and Query. It extends the core features of Redis OSS and allows you to use Redis as a vector database.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html" + } + } + }, + { + "id": "spring-ai-stabilityai", + "name": "Stability AI", + "description": "Spring AI support for Stability AI's text to image generation model.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/image/stabilityai-image.html" + } + } + }, + { + "id": "spring-ai-transformers", + "name": "Transformers (ONNX) Embeddings", + "description": "Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html" + } + } + }, + { + "id": "spring-ai-vertexai-gemini", + "name": "Vertex AI Gemini", + "description": "Spring AI support for Google Vertex Gemini chat. Doesn't support embeddings.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/chat/vertexai-gemini-chat.html" + } + } + }, + { + "id": "spring-ai-vertexai-embeddings", + "name": "Vertex AI Embeddings", + "description": "Spring AI support for Google Vertex text and multimodal embedding models.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": [ + { + "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-text.html", + "title": "Text embedding reference" + }, + { + "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-multimodal.html", + "title": "Multimodal embedding reference" + } + ] + } + }, + { + "id": "spring-ai-vectordb-qdrant", + "name": "Qdrant Vector Database", + "description": "Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html" + } + } + }, + { + "id": "spring-ai-vectordb-typesense", + "name": "Typesense Vector Database", + "description": "Spring AI vector database support for Typesense.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/typesense.html" + } + } + }, + { + "id": "spring-ai-vectordb-weaviate", + "name": "Weaviate Vector Database", + "description": "Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html" + } + } + }, + { + "id": "spring-ai-markdown-document-reader", + "name": "Markdown Document Reader", + "description": "Spring AI Markdown document reader. It allows to load Markdown documents, converting them into a list of Spring AI Document objects.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_markdown" + } + } + }, + { + "id": "spring-ai-tika-document-reader", + "name": "Tika Document Reader", + "description": "Spring AI Tika document reader. It uses Apache Tika to extract text from a variety of document formats, such as PDF, DOC/DOCX, PPT/PPTX, and HTML. The documents are converted into a list of Spring AI Document objects.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_tika_docx_pptx_html" + } + } + }, + { + "id": "spring-ai-pdf-document-reader", + "name": "PDF Document Reader", + "description": "Spring AI PDF document reader. It uses Apache PdfBox to extract text from PDF documents and converting them into a list of Spring AI Document objects.", + "versionRange": "[3.3.0,3.5.0-M1)", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_pdf_page" + } + } + }, + { + "id": "timefold-solver", + "name": "Timefold Solver", + "description": "AI solver to optimize operations and scheduling.", + "versionRange": "[3.3.0,3.4.0-M1)", + "_links": { + "reference": { + "href": "https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart" + }, + "sample": { + "href": "https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/java/spring-boot-integration", + "title": "Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students" } } } @@ -1353,75 +2040,156 @@ }, "type": { "type": "action", - "default": "maven-project", + "default": "gradle-project", "values": [ { - "id": "maven-project", - "name": "Maven Project", - "description": "Generate a Maven based project archive.", + "id": "gradle-project", + "name": "Gradle - Groovy", + "description": "Generate a Gradle based project archive using the Groovy DSL.", "action": "/starter.zip", - "tags": { "build": "maven", "format": "project" } - }, - { - "id": "maven-build", - "name": "Maven POM", - "description": "Generate a Maven pom.xml.", - "action": "/pom.xml", - "tags": { "build": "maven", "format": "build" } + "tags": { + "build": "gradle", + "dialect": "groovy", + "format": "project" + } }, { - "id": "gradle-project", - "name": "Gradle Project", - "description": "Generate a Gradle based project archive.", + "id": "gradle-project-kotlin", + "name": "Gradle - Kotlin", + "description": "Generate a Gradle based project archive using the Kotlin DSL.", "action": "/starter.zip", - "tags": { "build": "gradle", "format": "project" } + "tags": { + "build": "gradle", + "dialect": "kotlin", + "format": "project" + } }, { "id": "gradle-build", "name": "Gradle Config", "description": "Generate a Gradle build file.", "action": "/build.gradle", - "tags": { "build": "gradle", "format": "build" } + "tags": { + "build": "gradle", + "format": "build" + } + }, + { + "id": "maven-project", + "name": "Maven", + "description": "Generate a Maven based project archive.", + "action": "/starter.zip", + "tags": { + "build": "maven", + "format": "project" + } + }, + { + "id": "maven-build", + "name": "Maven POM", + "description": "Generate a Maven pom.xml.", + "action": "/pom.xml", + "tags": { + "build": "maven", + "format": "build" + } } ] }, "packaging": { "type": "single-select", "default": "jar", - "values": [{ "id": "jar", "name": "Jar" }, { "id": "war", "name": "War" }] + "values": [ + { + "id": "jar", + "name": "Jar" + }, + { + "id": "war", + "name": "War" + } + ] }, "javaVersion": { "type": "single-select", - "default": "1.8", + "default": "17", "values": [ - { "id": "13", "name": "13" }, - { "id": "11", "name": "11" }, - { "id": "1.8", "name": "8" } + { + "id": "23", + "name": "23" + }, + { + "id": "21", + "name": "21" + }, + { + "id": "17", + "name": "17" + } ] }, "language": { "type": "single-select", "default": "java", "values": [ - { "id": "java", "name": "Java" }, - { "id": "kotlin", "name": "Kotlin" }, - { "id": "groovy", "name": "Groovy" } + { + "id": "java", + "name": "Java" + }, + { + "id": "kotlin", + "name": "Kotlin" + }, + { + "id": "groovy", + "name": "Groovy" + } ] }, "bootVersion": { "type": "single-select", - "default": "2.2.0.RELEASE", + "default": "3.4.0", "values": [ - { "id": "2.2.1.BUILD-SNAPSHOT", "name": "2.2.1 (SNAPSHOT)" }, - { "id": "2.2.0.RELEASE", "name": "2.2.0" }, - { "id": "2.1.10.BUILD-SNAPSHOT", "name": "2.1.10 (SNAPSHOT)" }, - { "id": "2.1.9.RELEASE", "name": "2.1.9" } + { + "id": "3.4.1-SNAPSHOT", + "name": "3.4.1 (SNAPSHOT)" + }, + { + "id": "3.4.0", + "name": "3.4.0" + }, + { + "id": "3.3.7-SNAPSHOT", + "name": "3.3.7 (SNAPSHOT)" + }, + { + "id": "3.3.6", + "name": "3.3.6" + } ] }, - "groupId": { "type": "text", "default": "com.example" }, - "artifactId": { "type": "text", "default": "demo" }, - "version": { "type": "text", "default": "0.0.1-SNAPSHOT" }, - "name": { "type": "text", "default": "demo" }, - "description": { "type": "text", "default": "Demo project for Spring Boot" }, - "packageName": { "type": "text", "default": "com.example.demo" } + "groupId": { + "type": "text", + "default": "com.example" + }, + "artifactId": { + "type": "text", + "default": "demo" + }, + "version": { + "type": "text", + "default": "0.0.1-SNAPSHOT" + }, + "name": { + "type": "text", + "default": "demo" + }, + "description": { + "type": "text", + "default": "Demo project for Spring Boot" + }, + "packageName": { + "type": "text", + "default": "com.example.demo" + } } diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index 0add014ec4..594035c058 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -25,6 +25,7 @@ const Explore = lazy(() => import('./common/explore/Explore')) const Share = lazy(() => import('./common/share/Share')) const History = lazy(() => import('./common/history/History')) const HotKeys = lazy(() => import('./common/builder/HotKeys')) +const Favorite = lazy(() => import('./common/favorite/Favorite')) export default function Application() { const { @@ -34,6 +35,9 @@ export default function Application() { share: shareOpen, explore: exploreOpen, history: historyOpen, + favorite: favoriteOpen, + favoriteAdd: favoriteAddOpen, + favoriteOptions, list, dependencies, } = useContext(AppContext) @@ -73,7 +77,9 @@ export default function Application() { share: false, explore: false, nav: false, - history: false, + history: favoriteOptions.back === 'history', + favorite: favoriteOptions.back === 'favorite', + favoriteAdd: false, }, }) } @@ -120,6 +126,10 @@ export default function Application() { dispatch({ type: 'UPDATE', payload: { share: true } }) } + const onFavoriteAdd = () => { + dispatch({ type: 'UPDATE', payload: { favoriteAdd: true } }) + } + return ( <> @@ -157,6 +167,7 @@ export default function Application() { onSubmit={onSubmit} onShare={onShare} onExplore={onExplore} + onFavoriteAdd={onFavoriteAdd} refExplore={buttonExplore} refSubmit={buttonSubmit} refDependency={buttonDependency} @@ -177,6 +188,11 @@ export default function Application() { onClose={onEscape} /> + ) diff --git a/start-client/src/components/common/builder/Fields.js b/start-client/src/components/common/builder/Fields.js index 9b94940eca..6f07e804a3 100644 --- a/start-client/src/components/common/builder/Fields.js +++ b/start-client/src/components/common/builder/Fields.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types' import get from 'lodash/get' -import React, { useContext } from 'react' +import React, { useContext, useRef, useState, useEffect } from 'react' import Actions from './Actions' import Control from './Control' @@ -18,12 +18,15 @@ function Fields({ onSubmit, onExplore, onShare, + onFavoriteAdd, refExplore, refSubmit, refDependency, generating, }) { + const wrapper = useRef(null) const windowsUtils = useWindowsUtils() + const [dropdown, setDropdown] = useState(false) const { config, dispatch, dependencies } = useContext(AppContext) const { values, @@ -34,6 +37,19 @@ function Fields({ dispatchInitializr({ type: 'UPDATE', payload: args }) } + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + setDropdown(false) + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, []) + return ( <>
@@ -183,9 +199,40 @@ function Fields({ > Explore - + + + + {dropdown && ( +
+ + +
+ )} +
) @@ -196,6 +243,7 @@ Fields.propTypes = { onSubmit: PropTypes.func.isRequired, onExplore: PropTypes.func.isRequired, onShare: PropTypes.func.isRequired, + onFavoriteAdd: PropTypes.func.isRequired, refExplore: PropTypes.oneOfType([ PropTypes.func, PropTypes.shape({ current: PropTypes.instanceOf(Element) }), diff --git a/start-client/src/components/common/builder/Loading.js b/start-client/src/components/common/builder/Loading.js index e61fee269e..8b8222a96b 100644 --- a/start-client/src/components/common/builder/Loading.js +++ b/start-client/src/components/common/builder/Loading.js @@ -12,8 +12,9 @@ export default function Loading() {
- - + + +
diff --git a/start-client/src/components/common/favorite/Add.js b/start-client/src/components/common/favorite/Add.js new file mode 100644 index 0000000000..b36f080c22 --- /dev/null +++ b/start-client/src/components/common/favorite/Add.js @@ -0,0 +1,185 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext, useState } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import queryString from 'query-string' +import { toast } from 'react-toastify' +import FieldInput from '../builder/FieldInput' +import { Button } from '../form' +import { AppContext } from '../../reducer/App' +import { InitializrContext } from '../../reducer/Initializr' +import { + getLabelFromList, + getLabelFromDepsList, + getBookmarkDefaultName, +} from './Utils' + +function FavoriteItem({ value }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
+ + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList(get(config, 'lists.dependencies'), dep) + ) + .join(', ')} + + + )} + + +
+ ) +} + +FavoriteItem.propTypes = { + value: PropTypes.string.isRequired, +} + +function Add({ open, onClose }) { + const wrapper = useRef(null) + const { share } = useContext(InitializrContext) + const { dispatch, favoriteOptions } = useContext(AppContext) + const [name, setName] = useState() + const input = useRef(null) + + const title = get(favoriteOptions, 'title', '') || 'Bookmark' + const button = get(favoriteOptions, 'button', '') || 'Save' + const value = get(favoriteOptions, 'favorite.value', '') || share + const nameFav = get(favoriteOptions, 'favorite.name', '') + + useEffect(() => { + setName(nameFav || `${getBookmarkDefaultName()}`) + }, [setName, open, nameFav]) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + if (get(input, 'current')) { + get(input, 'current').focus() + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + const onSubmit = e => { + e.preventDefault() + if (!get(favoriteOptions, 'button', '')) { + dispatch({ type: 'ADD_FAVORITE', payload: { values: value, name } }) + toast.success('Project bookmarked') + } else { + dispatch({ + type: 'UPDATE_FAVORITE', + payload: { name, favorite: favoriteOptions.favorite }, + }) + } + onClose() + } + + return ( + + {open && ( + +
+
+
+
+

{title}

+
+
+ + { + setName(`${event.target.value}`) + }} + /> +
+
+ + +
+
+
+
+
+ )} +
+ ) +} + +Add.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Add diff --git a/start-client/src/components/common/favorite/Favorite.js b/start-client/src/components/common/favorite/Favorite.js new file mode 100644 index 0000000000..2116f98dfb --- /dev/null +++ b/start-client/src/components/common/favorite/Favorite.js @@ -0,0 +1,26 @@ +import '../../../styles/favorite.scss' + +import PropTypes from 'prop-types' +import React from 'react' + +import Modal from './Modal' +import Add from './Add' +import { Overlay } from '../form' + +function Favorite({ open, add, onClose }) { + return ( + <> + + + + + ) +} + +Favorite.propTypes = { + open: PropTypes.bool.isRequired, + add: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Favorite diff --git a/start-client/src/components/common/favorite/Modal.js b/start-client/src/components/common/favorite/Modal.js new file mode 100644 index 0000000000..a587c6c8dd --- /dev/null +++ b/start-client/src/components/common/favorite/Modal.js @@ -0,0 +1,191 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import queryString from 'query-string' +import { AppContext } from '../../reducer/App' +import { getLabelFromList, getLabelFromDepsList } from './Utils' +import { IconEdit, IconDelete } from '../icons' + +function FavoriteItem({ name, value, onClose, onRemove, onUpdate }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
  • + { + onClose() + }} + > + {name} + + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList( + get(config, 'lists.dependencies'), + dep + ) + ) + .join(', ')} + + + )} + + + + + +
  • + ) +} + +FavoriteItem.propTypes = { + name: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onRemove: PropTypes.func.isRequired, + onUpdate: PropTypes.func.isRequired, +} + +function Modal({ open, onClose }) { + const wrapper = useRef(null) + const { favorites, dispatch } = useContext(AppContext) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + const onRemove = favorite => { + dispatch({ type: 'REMOVE_FAVORITE', payload: favorite }) + } + + const onUpdate = favorite => { + dispatch({ + type: 'UPDATE', + payload: { + favorite: false, + favoriteAdd: true, + favoriteOptions: { + title: 'Edit bookmark', + button: 'Update', + back: 'favorite', + favorite, + }, + }, + }) + } + + return ( + + {open && ( + +
    +
    +
    +

    Bookmarks

    +
    +
    +
    + {favorites.map(favorite => ( + { + onRemove(favorite) + }} + onUpdate={() => { + onUpdate(favorite) + }} + /> + ))} +
    +
    + +
    +
    +
    + )} +
    + ) +} + +Modal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Modal diff --git a/start-client/src/components/common/favorite/Utils.js b/start-client/src/components/common/favorite/Utils.js new file mode 100644 index 0000000000..624bc782e0 --- /dev/null +++ b/start-client/src/components/common/favorite/Utils.js @@ -0,0 +1,16 @@ +import { DateTime } from 'luxon' + +export function getLabelFromList(list, key) { + return list.find(item => item.key === key)?.text || key +} + +export function getLabelFromDepsList(list, key) { + return list.find(item => item.id === key)?.name || key +} + +export function getBookmarkDefaultName() { + const date = DateTime.now() + return `Bookmark ${date.toLocaleString( + DateTime.DATE_SHORT + )} ${date.toLocaleString(DateTime.TIME_24_SIMPLE)}` +} diff --git a/start-client/src/components/common/favorite/index.js b/start-client/src/components/common/favorite/index.js new file mode 100644 index 0000000000..ab8695c9c6 --- /dev/null +++ b/start-client/src/components/common/favorite/index.js @@ -0,0 +1 @@ +export { default as Favorite } from './Favorite' diff --git a/start-client/src/components/common/form/Button.js b/start-client/src/components/common/form/Button.js index 20b08218b6..f70e2a5dbd 100644 --- a/start-client/src/components/common/form/Button.js +++ b/start-client/src/components/common/form/Button.js @@ -6,13 +6,16 @@ function Button({ onClick, children, variant, + className, hotkey, refButton, disabled, }) { return ( ) } diff --git a/start-client/src/components/common/icons/Icons.js b/start-client/src/components/common/icons/Icons.js index 9318ca56f1..60db8713f5 100644 --- a/start-client/src/components/common/icons/Icons.js +++ b/start-client/src/components/common/icons/Icons.js @@ -399,3 +399,69 @@ export function IconHistory() { ) } + +export function IconFavorite() { + return ( + + ) +} + +export function IconDelete() { + return ( + + ) +} + +export function IconEdit() { + return ( + + ) +} diff --git a/start-client/src/components/common/icons/index.js b/start-client/src/components/common/icons/index.js index 7fa600b408..8ae64b986c 100644 --- a/start-client/src/components/common/icons/index.js +++ b/start-client/src/components/common/icons/index.js @@ -17,5 +17,8 @@ export { IconMoon } from './Icons' export { IconRemove } from './Icons' export { IconEnter } from './Icons' export { IconHistory } from './Icons' +export { IconFavorite } from './Icons' +export { IconEdit } from './Icons' +export { IconDelete } from './Icons' export { IconSpring } from './IconSpring' diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index 12596f1eda..b20e9a454b 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -5,14 +5,14 @@ import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' import Header from './Header' import { AppContext } from '../../reducer/App' -import { IconGithub, IconHistory } from '../icons' +import { IconGithub, IconHistory, IconFavorite } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) const [lock, setLock] = useState(false) const wrapper = useRef(null) - const { nav, histories, dispatch } = useContext(AppContext) + const { nav, histories, dispatch, favorites } = useContext(AppContext) useEffect(() => { if (get(wrapper, 'current') && nav) { @@ -61,20 +61,43 @@ function SideLeft() { - {!isOpen && !lock && histories.length > 0 && ( + {!isOpen && !lock && ( <> -
    - + {favorites.length > 0 && ( + <> +
    + + + )} + {histories.length > 0 && ( + <> +
    + + + )} )}
    diff --git a/start-client/src/components/reducer/App.js b/start-client/src/components/reducer/App.js index 6f5763ff8e..fb36a5f153 100644 --- a/start-client/src/components/reducer/App.js +++ b/start-client/src/components/reducer/App.js @@ -13,6 +13,8 @@ export const defaultAppContext = { explore: false, share: false, history: false, + favorite: false, + favoriteAdd: false, nav: false, list: false, theme: 'light', @@ -22,7 +24,14 @@ export const defaultAppContext = { list: [], groups: [], }, + favoriteOptions: { + title: '', + button: '', + favorite: null, + back: '', + }, histories: [], + favorites: [], } const localStorage = @@ -80,6 +89,14 @@ export function reducer(state, action) { if (key === 'theme') { localStorage.setItem('springtheme', value) } + if (key === 'favoriteAdd' && !value) { + newState.favoriteOptions = { + title: '', + button: '', + favorite: null, + back: '', + } + } return key }) return newState @@ -110,7 +127,18 @@ export function reducer(state, action) { const histories = localStorage.getItem('histories') ? JSON.parse(localStorage.getItem('histories')) : [] - return { ...state, complete: true, config: json, dependencies, histories } + + const favorites = localStorage.getItem('favorites') + ? JSON.parse(localStorage.getItem('favorites')) + : [] + return { + ...state, + complete: true, + config: json, + dependencies, + histories, + favorites, + } } case 'ADD_HISTORY': { const newHistory = get(action, 'payload') @@ -128,6 +156,49 @@ export function reducer(state, action) { localStorage.setItem('histories', JSON.stringify([])) return { ...state, histories: [] } } + case 'ADD_FAVORITE': { + const favorites = [ + { + date: new Date().toISOString(), + name: get(action, 'payload.name'), + value: get(action, 'payload.values'), + }, + ...state.favorites, + ] + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } + case 'UPDATE_FAVORITE': { + const favoriteToUpdate = get(action, 'payload.favorite') + const favorites = state.favorites.map(item => { + if ( + item.name === favoriteToUpdate.name && + item.date === favoriteToUpdate.date && + item.value === favoriteToUpdate.value + ) { + return { + ...item, + name: get(action, 'payload.name'), + } + } + return item + }) + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } + case 'REMOVE_FAVORITE': { + const favoriteToRemove = get(action, 'payload') + const favorites = state.favorites.filter( + item => + !( + item.name === favoriteToRemove.name && + item.date === favoriteToRemove.date && + item.value === favoriteToRemove.value + ) + ) + localStorage.setItem('favorites', JSON.stringify(favorites)) + return { ...state, favorites } + } default: return state } diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 6b00b3cfb0..91d96ae387 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -401,16 +401,34 @@ body.dark { background: $dark-background; } - .modal-share .modal-header { - background: $dark-background; - border-bottom: 1px solid $dark-border; + .modal-share, + .modal-add-favorite, + .modal-favorite { + .modal-header { + background: $dark-background; + border-bottom: 1px solid $dark-border; + } } - .modal-history-container { + .modal-history-container, + .modal-favorite-container, + .modal-add-favorite-container { border: 1px solid $dark-border; } .modal-content { background: $dark-background; } + .modal-add-favorite .favorite-desc { + background: $dark-background-secondary; + color: $dark-color; + } + .modal-favorite button.edit, + .modal-favorite button.remove, + .modal-share .modal-content button.favorite { + color: white; + } + .actions .button.clicked { + color: #000; + } .modal-content .list a.item { background: $dark-background-secondary; color: $dark-color; diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index 3151915409..7b21087917 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -582,13 +582,32 @@ button.button { span { padding: 0.9rem 1.5rem 0.8rem; } + &.clicked { + color: white; + &:before { + opacity: 1; + } + } &:focus { box-shadow: 0 0 0 4px darken($light-border, 6); } - &:last-child { + &.last-child { margin-right: 0; } } + .dropdown { + position: relative; + .dropdown-items { + position: absolute; + bottom: 35px; + left: -50px; + text-align: center; + .button { + margin: 4px 0; + width: 160px; + } + } + } } .colset-main { @@ -1320,7 +1339,7 @@ ul.dependencies-list { width: 249.42px; } &-share { - width: 119px; + width: 62.3px; } &-dep { width: 241.8px; diff --git a/start-client/src/styles/_responsive.scss b/start-client/src/styles/_responsive.scss index 3ebe0d3953..827ac116dc 100644 --- a/start-client/src/styles/_responsive.scss +++ b/start-client/src/styles/_responsive.scss @@ -244,7 +244,7 @@ width: 88.55px; } .placeholder-button-share { - width: 82.77px; + width: 33px; } .placeholder-button-download { width: 108.73px; diff --git a/start-client/src/styles/favorite.scss b/start-client/src/styles/favorite.scss new file mode 100644 index 0000000000..ba82f2002d --- /dev/null +++ b/start-client/src/styles/favorite.scss @@ -0,0 +1,197 @@ +@import 'variables'; +@import 'mixins'; + +$w_arrow: 12px; +$w: 1000px; +$w2: 500px; + +.modal-add-favorite, +.modal-favorite { + z-index: 10000; + position: fixed; + top: 50px; + left: 0; + right: 0; + + .modal-favorite-container, + .modal-add-favorite-container { + max-width: $w; + margin: 0 auto; + background: white; + } + + .modal-add-favorite-container { + max-width: $w2; + } + + @include transition(all $spring-transition-duration); + &:before { + $h: 60px; + content: ' '; + height: $h; + width: $w; + position: absolute; + bottom: -$h; + left: 0; + } + .modal-content { + padding: $spring-8points * 3; + padding-top: $spring-8points; + padding-bottom: $spring-8points * 2; + max-height: 70vh; + overflow: auto; + .list { + .name { + font-weight: bold; + display: block; + } + ul { + padding: 0; + margin: 0 0 10px; + } + li { + position: relative; + list-style: none; + padding: 1px 0; + margin: 0; + } + a.item { + display: block; + position: relative; + background: $light-background-seconday; + border-radius: 3px; + text-decoration: none; + padding: 5px 10px; + color: $light-color; + padding-right: 80px; + &:hover { + background: lighten($light-background-seconday, 2); + a { + opacity: 1; + } + } + } + .time { + width: 80px; + } + .time, + .desc, + .main, + .deps { + display: block; + } + } + } + .modal-header { + position: relative; + padding: 6px $spring-8points * 2 2px; + border-bottom: 1px solid #ebebeb; + h1 { + font-size: $spring-8points * 2.5; + line-height: $spring-8points * 2.5; + font-weight: 600; + } + .button { + position: absolute; + top: 11px; + right: 11px; + font-size: $spring-font-size - 3; + line-height: 0.7rem; + margin-right: 0; + } + } + .modal-action { + text-align: center; + border-top: 1px solid $light-border; + padding: 16px 0 8px; + } + button.remove, + button.edit { + $size: 38px; + display: block; + position: absolute; + width: $size; + right: 10px; + top: 50%; + margin-top: -(calc($size / 2)); + border: 0 none; + cursor: pointer; + background: transparent; + opacity: 0.4; + @include outline; + @include transition(all 150ms); + .a-content { + display: block; + outline: none; + box-shadow: none; + padding: 8px; + } + svg { + display: block; + } + &:hover { + opacity: 0.8; + } + &:focus { + opacity: 1; + } + } + button.edit { + $size: 32px; + right: 45px; + width: $size; + margin-top: -(calc($size / 2)); + svg { + .st0 { + fill: #000; + } + } + } +} + +.modal-enter { + opacity: 0; +} + +.modal-enter-active { + opacity: 1; + transition: all 300ms; +} + +.modal-exit { + opacity: 1; +} + +.modal-exit-active { + opacity: 0; + transition: all 300ms; +} + +.modal-add-favorite { + .control-inline { + flex: none; + display: block; + label { + text-align: left; + flex: none; + display: block; + } + .input { + margin: 0; + } + } + .modal-action { + padding: 16px 0 16px; + } + .favorite-desc { + background: $light-background-seconday; + padding: 8px; + margin: 8px 0; + border-radius: 3px; + .deps { + display: block; + } + } +} + +@import 'responsive'; diff --git a/start-client/src/styles/history.scss b/start-client/src/styles/history.scss index 9d1ace6786..cfde1e9156 100644 --- a/start-client/src/styles/history.scss +++ b/start-client/src/styles/history.scss @@ -46,6 +46,7 @@ $w: 1000px; list-style: none; padding: 1px 0; margin: 0; + position: relative; } a.item { position: relative; @@ -73,6 +74,36 @@ $w: 1000px; display: block; } } + button.favorite { + $size: 42px; + display: block; + position: absolute; + width: $size; + right: 10px; + top: 50%; + margin-top: -(calc($size / 2)-4); + border: 0 none; + cursor: pointer; + background: transparent; + opacity: 0.4; + @include outline; + @include transition(all 150ms); + .a-content { + display: block; + outline: none; + box-shadow: none; + padding: 8px; + } + svg { + display: block; + } + &:hover { + opacity: 0.8; + } + &:focus { + opacity: 1; + } + } } .modal-header { position: relative; diff --git a/start-client/webpack.common.js b/start-client/webpack.common.js index aed7ad0ac7..582bf9f0bc 100644 --- a/start-client/webpack.common.js +++ b/start-client/webpack.common.js @@ -50,7 +50,16 @@ const config = { }, { test: /\.s[ac]ss$/i, - use: ['style-loader', 'css-loader', 'sass-loader'], + use: [ + 'style-loader', + 'css-loader', + { + loader: 'sass-loader', + options: { + warnRuleAsWarning: false, + }, + }, + ], }, { test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, diff --git a/start-client/webpack.prod.js b/start-client/webpack.prod.js index e255d8e928..15c96637ac 100644 --- a/start-client/webpack.prod.js +++ b/start-client/webpack.prod.js @@ -25,7 +25,7 @@ const config = { plugins: [ new BundleAnalyzerPlugin({ analyzerMode: 'static', - openAnalyzer: true, + openAnalyzer: false, generateStatsFile: true, statsFilename: '../analysis/stats.json', reportFilename: '../analysis/bundle-analyzer.html', From efeb097f1080e22bfbbed4f0c7d3fe1ad9845aee Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 5 Dec 2024 11:29:08 +0100 Subject: [PATCH 2/3] Fix mock --- start-client/dev/api.mock.json | 1525 ++++++++------------------------ 1 file changed, 380 insertions(+), 1145 deletions(-) diff --git a/start-client/dev/api.mock.json b/start-client/dev/api.mock.json index 66d86adc4b..da16d3ef3e 100644 --- a/start-client/dev/api.mock.json +++ b/start-client/dev/api.mock.json @@ -1,17 +1,5 @@ { "_links": { - "gradle-project": { - "href": "https://start.spring.io/starter.zip?type=gradle-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", - "templated": true - }, - "gradle-project-kotlin": { - "href": "https://start.spring.io/starter.zip?type=gradle-project-kotlin{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", - "templated": true - }, - "gradle-build": { - "href": "https://start.spring.io/build.gradle?type=gradle-build{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", - "templated": true - }, "maven-project": { "href": "https://start.spring.io/starter.zip?type=maven-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true @@ -20,6 +8,14 @@ "href": "https://start.spring.io/pom.xml?type=maven-build{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", "templated": true }, + "gradle-project": { + "href": "https://start.spring.io/starter.zip?type=gradle-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "templated": true + }, + "gradle-build": { + "href": "https://start.spring.io/build.gradle?type=gradle-build{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}", + "templated": true + }, "dependencies": { "href": "https://start.spring.io/dependencies{?bootVersion}", "templated": true @@ -31,23 +27,13 @@ { "name": "Developer Tools", "values": [ - { - "id": "native", - "name": "GraalVM Native Support", - "description": "Support for compiling Spring applications to native executables using the GraalVM native-image compiler." - }, - { - "id": "dgs-codegen", - "name": "GraphQL DGS Code Generation", - "description": "Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files." - }, { "id": "devtools", "name": "Spring Boot DevTools", "description": "Provides fast application restarts, LiveReload, and configurations for enhanced development experience.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/using/devtools.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using-boot-devtools", "templated": true } } @@ -60,35 +46,13 @@ { "id": "configuration-processor", "name": "Spring Configuration Processor", - "description": "Generate metadata for developers to offer contextual help and \"code completion\" when working with custom configuration keys (ex.application.properties/.yml files).", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/specification/configuration-metadata/annotation-processor.html", - "templated": true - } - } - }, - { - "id": "docker-compose", - "name": "Docker Compose Support", - "description": "Provides docker compose support for enhanced development experience.", + "description": "Generate metadata for developers to offer contextual help and “code completion” when working with custom configuration keys (ex.application.properties/.yml files).", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/features/dev-services.html#features.dev-services.docker-compose", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#configuration-metadata-annotation-processor", "templated": true } } - }, - { - "id": "modulith", - "name": "Spring Modulith", - "description": "Support for building modular monolithic applications.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-modulith/reference/" - } - } } ] }, @@ -115,7 +79,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-developing-web-applications", "templated": true } } @@ -123,32 +87,7 @@ { "id": "webflux", "name": "Spring Reactive Web", - "description": "Build reactive web applications with Spring WebFlux and Netty.", - "_links": { - "guide": { - "href": "https://spring.io/guides/gs/reactive-rest-service/", - "title": "Building a Reactive RESTful Web Service" - }, - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/reactive.html", - "templated": true - } - } - }, - { - "id": "graphql", - "name": "Spring for GraphQL", - "description": "Build GraphQL applications with Spring for GraphQL and GraphQL Java.", - "_links": { - "guide": { - "href": "https://spring.io/guides/gs/graphql-server/", - "title": "Building a GraphQL service" - }, - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-graphql.html", - "templated": true - } - } + "description": "Build reactive web applications with Spring WebFlux and Netty." }, { "id": "data-rest", @@ -170,7 +109,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-access.html#howto.data-access.exposing-spring-data-repositories-as-rest", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-use-exposing-spring-data-repositories-rest-endpoint", "templated": true } } @@ -178,16 +117,11 @@ { "id": "session", "name": "Spring Session", - "description": "Provides an API and implementations for managing user session information.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-session/reference/" - } - } + "description": "Provides an API and implementations for managing user session information." }, { - "id": "data-rest-explorer", - "name": "Rest Repositories HAL Explorer", + "id": "data-rest-hal", + "name": "Rest Repositories HAL Browser", "description": "Browsing Spring Data REST repositories in your browser." }, { @@ -200,7 +134,7 @@ "title": "Building a Hypermedia-Driven RESTful Web Service" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-hateoas.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-hateoas", "templated": true } } @@ -215,7 +149,7 @@ "title": "Producing a SOAP web service" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/webservices.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-webservices", "templated": true } } @@ -226,7 +160,7 @@ "description": "Framework for developing RESTful Web Services in Java that provides support for JAX-RS APIs.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.jersey", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jersey", "templated": true } } @@ -234,41 +168,13 @@ { "id": "vaadin", "name": "Vaadin", - "description": "The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla.", - "versionRange": "[3.3.0,3.4.0-M1)", + "description": "Java framework for building rich client apps based on Web components.", "_links": { "guide": { "href": "https://spring.io/guides/gs/crud-with-vaadin/", "title": "Creating CRUD UI with Vaadin" }, - "reference": { - "href": "https://vaadin.com/docs" - } - } - }, - { - "id": "netflix-dgs", - "name": "Netflix DGS", - "description": "Build GraphQL applications with Netflix DGS and Spring for GraphQL.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://netflix.github.io/dgs/" - } - } - }, - { - "id": "htmx", - "name": "htmx", - "description": "Build modern user interfaces with the simplicity and power of hypertext.", - "versionRange": "[3.3.0,3.4.0-M1)", - "_links": { - "reference": { - "href": "https://github.com/wimdeblauwe/htmx-spring-boot" - }, - "guide": { - "href": "https://www.youtube.com/watch?v=j-rfPoXe5aE" - } + "reference": { "href": "https://vaadin.com/docs" } } } ] @@ -286,7 +192,7 @@ "title": "Handling Form Submission" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", "templated": true } } @@ -297,7 +203,7 @@ "description": "Java library to generate text output (HTML web pages, e-mails, configuration files, source code, etc.) based on templates and changing data.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", "templated": true } } @@ -305,10 +211,10 @@ { "id": "mustache", "name": "Mustache", - "description": "Logic-less templates for both web and standalone environments. There are no if statements, else clauses, or for loops. Instead there are only tags.", + "description": "Logic-less Templates. There are no if statements, else clauses, or for loops. Instead there are only tags.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", "templated": true } } @@ -319,20 +225,10 @@ "description": "Groovy templating engine.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/servlet.html#web.servlet.spring-mvc.template-engines", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines", "templated": true } } - }, - { - "id": "jte", - "name": "JTE", - "description": "Secure and lightweight template engine for Java and Kotlin.", - "_links": { - "reference": { - "href": "https://jte.gg/" - } - } } ] }, @@ -359,7 +255,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security", "templated": true } } @@ -370,18 +266,7 @@ "description": "Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.client", - "templated": true - } - } - }, - { - "id": "oauth2-authorization-server", - "name": "OAuth2 Authorization Server", - "description": "Spring Boot integration for Spring Authorization Server.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.authorization-server", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-client", "templated": true } } @@ -390,9 +275,10 @@ "id": "oauth2-resource-server", "name": "OAuth2 Resource Server", "description": "Spring Boot integration for Spring Security's OAuth2 resource server features.", + "versionRange": "2.1.0.M2", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/web/spring-security.html#web.security.oauth2.server", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-server", "templated": true } } @@ -403,7 +289,7 @@ "description": "Makes it easier to build Spring based applications that use the Lightweight Directory Access Protocol.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-ldap", "templated": true } } @@ -412,7 +298,7 @@ "id": "okta", "name": "Okta", "description": "Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC.", - "versionRange": "[3.3.0,3.4.0-M1)", + "versionRange": "2.1.2.RELEASE", "_links": { "guide": [ { @@ -429,8 +315,7 @@ } ], "reference": { - "href": "https://github.com/okta/okta-spring-boot#readme", - "title": "Okta Spring Boot documentation" + "href": "https://github.com/okta/okta-spring-boot/blob/master/README.md" } } } @@ -455,7 +340,7 @@ } ], "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-sql", "templated": true } } @@ -470,7 +355,7 @@ "title": "Accessing Data with JPA" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jpa-and-spring-data", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jpa-and-spring-data", "templated": true } } @@ -479,41 +364,37 @@ "id": "data-jdbc", "name": "Spring Data JDBC", "description": "Persist data in SQL stores with plain JDBC using Spring Data.", + "versionRange": "2.1.0.RELEASE", "_links": { "guide": { "href": "https://github.com/spring-projects/spring-data-examples/tree/master/jdbc/basics", "title": "Using Spring Data JDBC" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jdbc", - "templated": true + "href": "https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/" } } }, { "id": "data-r2dbc", - "name": "Spring Data R2DBC", + "name": "Spring Data R2DBC [Experimental]", "description": "Provides Reactive Relational Database Connectivity to persist data in SQL stores using Spring Data in reactive applications.", + "versionRange": "2.2.0.M6", "_links": { "guide": { - "href": "https://spring.io/guides/gs/accessing-data-r2dbc/", - "title": "Accessing data with R2DBC" + "href": "https://github.com/spring-projects-experimental/spring-boot-r2dbc/tree/master/spring-boot-example-h2", + "title": "R2DBC example" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.r2dbc", - "templated": true + "href": "https://docs.spring.io/spring-data/r2dbc/docs/1.0.x/reference/html/#reference" }, - "home": { - "href": "https://r2dbc.io", - "title": "R2DBC Homepage" - } + "home": { "href": "https://r2dbc.io", "title": "R2DBC Homepage" } } }, { "id": "mybatis", "name": "MyBatis Framework", "description": "Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations.", - "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { "href": "https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start", @@ -530,7 +411,7 @@ "description": "Liquibase database migration and source control library.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.liquibase", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup", "templated": true } } @@ -541,7 +422,7 @@ "description": "Version control for your database so you can migrate from any version (incl. an empty database) to the latest version of the schema.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/data-initialization.html#howto.data-initialization.migration-tool.flyway", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup", "templated": true } } @@ -552,7 +433,7 @@ "description": "Generate Java code from your database and build type safe SQL queries through a fluent API.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/sql.html#data.sql.jooq", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jooq", "templated": true } } @@ -560,7 +441,8 @@ { "id": "db2", "name": "IBM DB2 Driver", - "description": "A JDBC driver that provides access to IBM DB2." + "description": "A JDBC driver that provides access to IBM DB2.", + "versionRange": "2.2.0.M6" }, { "id": "derby", @@ -577,11 +459,6 @@ "name": "HyperSQL Database", "description": "Lightweight 100% Java SQL Database Engine." }, - { - "id": "mariadb", - "name": "MariaDB Driver", - "description": "MariaDB JDBC and R2DBC driver." - }, { "id": "sqlserver", "name": "MS SQL Server Driver", @@ -590,7 +467,7 @@ { "id": "mysql", "name": "MySQL Driver", - "description": "MySQL JDBC driver.", + "description": "MySQL JDBC and R2DBC driver.", "_links": { "guide": { "href": "https://spring.io/guides/gs/accessing-data-mysql/", @@ -601,7 +478,8 @@ { "id": "oracle", "name": "Oracle Driver", - "description": "A JDBC driver that provides access to Oracle." + "description": "A JDBC driver that provides access to Oracle.", + "versionRange": "2.2.0.RC1" }, { "id": "postgresql", @@ -623,7 +501,7 @@ "title": "Messaging with Redis" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis", "templated": true } } @@ -638,7 +516,7 @@ "title": "Messaging with Redis" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.redis", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis", "templated": true } } @@ -653,7 +531,7 @@ "title": "Accessing Data with MongoDB" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb", "templated": true } } @@ -663,12 +541,8 @@ "name": "Spring Data Reactive MongoDB", "description": "Provides asynchronous stream processing with non-blocking back pressure for MongoDB.", "_links": { - "guide": { - "href": "https://spring.io/guides/gs/accessing-data-mongodb/", - "title": "Accessing Data with MongoDB" - }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.mongodb", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb", "templated": true } } @@ -679,7 +553,18 @@ "description": "A distributed, RESTful search and analytics engine with Spring Data Elasticsearch.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.elasticsearch", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-elasticsearch", + "templated": true + } + } + }, + { + "id": "data-solr", + "name": "Spring Data for Apache Solr", + "description": "Apache Solr is an open source enterprise search platform built on Apache Lucene.", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-solr", "templated": true } } @@ -689,11 +574,8 @@ "name": "Spring Data for Apache Cassandra", "description": "A free and open-source, distributed, NoSQL database management system that offers high-scalability and high-performance.", "_links": { - "guide": { - "href": "https://spring.io/guides/gs/accessing-data-cassandra/" - }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra", "templated": true } } @@ -703,22 +585,38 @@ "name": "Spring Data Reactive for Apache Cassandra", "description": "Access Cassandra NoSQL Database in a reactive fashion.", "_links": { - "guide": { - "href": "https://spring.io/guides/gs/accessing-data-cassandra/" - }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.cassandra", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra", "templated": true } } }, + { + "id": "geode", + "name": "Spring for Apache Geode", + "description": "Apache Geode is a data management platform that helps users build real-time, highly concurrent, highly performant and reliable Spring Boot applications at scale that is compatible with Pivotal Cloud Cache.", + "versionRange": "2.2.0.M5", + "_links": { + "reference": { + "href": "https://docs.spring.io/spring-boot-data-geode-build/current/reference/html5/" + }, + "guide": { + "href": "https://github.com/spring-projects/spring-boot-data-geode/tree/master/spring-geode-samples", + "title": "Using Spring for Apache Geode" + }, + "other": { + "href": "https://docs.spring.io/spring-boot-data-geode-build/current/reference/html5/#geode-gemfire-switch", + "title": "Switch from Apache Geode to Pivotal Cloud Cache" + } + } + }, { "id": "data-couchbase", "name": "Spring Data Couchbase", "description": "NoSQL document-oriented database that offers in memory-first architecture, geo-distributed deployments, and workload isolation.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase", "templated": true } } @@ -729,7 +627,7 @@ "description": "Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.couchbase", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase", "templated": true } } @@ -744,7 +642,7 @@ "title": "Accessing Data with Neo4j" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.neo4j", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-neo4j", "templated": true } } @@ -764,7 +662,7 @@ "title": "Integrating Data" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/spring-integration.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-integration", "templated": true } } @@ -779,28 +677,18 @@ "title": "Messaging with RabbitMQ" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/amqp.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-amqp", "templated": true } } }, - { - "id": "amqp-streams", - "name": "Spring for RabbitMQ Streams", - "description": "Building stream processing applications with RabbitMQ.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-amqp/reference/stream.html" - } - } - }, { "id": "kafka", "name": "Spring for Apache Kafka", "description": "Publish, subscribe, store, and process streams of records.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/kafka.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-kafka", "templated": true } } @@ -816,11 +704,11 @@ }, "reference": [ { - "href": "https://docs.spring.io/spring-kafka/reference/streams.html", + "href": "https://docs.spring.io/spring-kafka/docs/current/reference/html/_reference.html#kafka-streams", "title": "Apache Kafka Streams Support" }, { - "href": "https://docs.spring.io/spring-cloud-stream/reference/kafka/kafka-streams-binder/usage.html", + "href": "https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream", "title": "Apache Kafka Streams Binding Capabilities of Spring Cloud Stream" } ] @@ -836,7 +724,7 @@ "title": "Java Message Service API via Apache ActiveMQ Classic." }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.activemq", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-activemq", "templated": true } } @@ -851,29 +739,7 @@ "title": "Messaging with JMS" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/jms.html#messaging.jms.artemis", - "templated": true - } - } - }, - { - "id": "pulsar", - "name": "Spring for Apache Pulsar", - "description": "Build messaging applications with Apache Pulsar", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html", - "templated": true - } - } - }, - { - "id": "pulsar-reactive", - "name": "Spring for Apache Pulsar (Reactive)", - "description": "Build reactive messaging applications with Apache Pulsar", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/pulsar.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-artemis", "templated": true } } @@ -881,14 +747,14 @@ { "id": "websocket", "name": "WebSocket", - "description": "Build Servlet-based WebSocket applications with SockJS and STOMP.", + "description": "Build WebSocket applications with SockJS and STOMP.", "_links": { "guide": { "href": "https://spring.io/guides/gs/messaging-stomp-websocket/", "title": "Using WebSocket to build an interactive web application" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/messaging/websockets.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-websockets", "templated": true } } @@ -897,20 +763,16 @@ "id": "rsocket", "name": "RSocket", "description": "RSocket.io applications with Spring Messaging and Netty.", - "_links": { - "reference": { - "href": "https://rsocket.io/" - } - } + "versionRange": "2.2.0.M2" }, { "id": "camel", "name": "Apache Camel", - "description": "Apache Camel is an open source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.", - "versionRange": "[3.3.0,3.5.0-M1)", + "description": "Apache Camel lets you create the Enterprise Integration Patterns to implement routing and mediation rules a Java based Domain Specific Language via Spring.", + "versionRange": "[2.0.0.M1,2.2.0.M1)", "_links": { "guide": { - "href": "https://camel.apache.org/camel-spring-boot/latest/spring-boot.html", + "href": "https://camel.apache.org/spring-boot", "title": "Using Apache Camel with Spring Boot" } } @@ -918,19 +780,22 @@ { "id": "solace", "name": "Solace PubSub+", - "description": "Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages", - "versionRange": "[3.3.0,3.4.0-M1)", + "description": "Connect to a Solace PubSub+ Advanced Event Broker using the Solace JMS support to send and receive messages.", + "versionRange": "2.1.0.RELEASE", "_links": { "reference": [ - { - "href": "https://www.solace.dev/start-spring-io-help/", - "title": "Getting started with Solace and Spring" - }, { "href": "https://solace.dev", "title": "Solace Developer Portal" + }, + { + "href": "https://github.com/SolaceProducts/solace-jms-spring-boot" } - ] + ], + "guide": { + "href": "https://github.com/SolaceProducts/solace-jms-spring-boot/tree/master/solace-jms-sample-app", + "title": "Solace sample application using JMS." + } } } ] @@ -948,21 +813,7 @@ "title": "Creating a Batch Service" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/how-to/batch.html", - "templated": true - } - } - }, - { - "id": "validation", - "name": "Validation", - "description": "Bean Validation with Hibernate validator.", - "_links": { - "guide": { - "href": "https://spring.io/guides/gs/validating-form-input/" - }, - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/validation.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-batch-applications", "templated": true } } @@ -973,7 +824,7 @@ "description": "Send email using Java Mail and Spring Framework's JavaMailSender.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/email.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-email", "templated": true } } @@ -981,17 +832,11 @@ { "id": "quartz", "name": "Quartz Scheduler", - "description": "Schedule jobs using Quartz.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/quartz.html", - "templated": true - } - } + "description": "Schedule jobs using Quartz." }, { "id": "cache", - "name": "Spring Cache Abstraction", + "name": "Spring cache abstraction", "description": "Provides cache-related operations, such as the ability to update the content of the cache, but does not provide the actual data store.", "_links": { "guide": { @@ -999,21 +844,10 @@ "title": "Caching Data with Spring" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/io/caching.html", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-caching", "templated": true } } - }, - { - "id": "spring-shell", - "name": "Spring Shell", - "description": "Build command line applications with spring.", - "versionRange": "[3.3.0,3.4.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-shell/reference/index.html" - } - } } ] }, @@ -1030,27 +864,16 @@ "title": "Building a RESTful Web Service with Spring Boot Actuator" }, "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/index.html", - "templated": true - } - } - }, - { - "id": "sbom-cyclone-dx", - "name": "CycloneDX SBOM support", - "description": "Creates a Software Bill of Materials in CycloneDX format.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/endpoints.html#actuator.endpoints.sbom", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#production-ready", "templated": true } } }, { "id": "codecentric-spring-boot-admin-client", - "name": "codecentric's Spring Boot Admin (Client)", - "description": "Required for your application to register with a Codecentric's Spring Boot Admin Server instance.", - "versionRange": "[3.3.0,3.5.0-M1)", + "name": "Spring Boot Admin (Client)", + "description": "Required for your application to register with a Spring Boot Admin Server instance.", + "versionRange": "[2.0.0.RELEASE,2.2.0.M1)", "_links": { "reference": { "href": "https://codecentric.github.io/spring-boot-admin/current/#getting-started" @@ -1059,290 +882,165 @@ }, { "id": "codecentric-spring-boot-admin-server", - "name": "codecentric's Spring Boot Admin (Server)", + "name": "Spring Boot Admin (Server)", "description": "A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints.", - "versionRange": "[3.3.0,3.5.0-M1)", + "versionRange": "[2.0.0.RELEASE,2.2.0.M1)", "_links": { "reference": { "href": "https://codecentric.github.io/spring-boot-admin/current/#getting-started" } } - }, - { - "id": "sentry", - "name": "Sentry", - "description": "Application performance monitoring and error tracking that help software teams see clearer, solve quicker, and learn continuously.", - "versionRange": "[3.3.0,3.3.0-M1)", - "_links": { - "guide": { - "href": "https://docs.sentry.io/platforms/java/guides/spring-boot/", - "title": "Getting Started with Sentry" - }, - "reference": { - "href": "https://docs.sentry.io/platforms/java/" - } - } } ] }, { - "name": "Observability", + "name": "Testing", "values": [ { - "id": "datadog", - "name": "Datadog", - "description": "Publish Micrometer metrics to Datadog, a dimensional time-series SaaS with built-in dashboarding and alerting.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.datadog", - "templated": true - } - } + "id": "restdocs", + "name": "Spring REST Docs", + "description": "Document RESTful services by combining hand-written with Asciidoctor and auto-generated snippets produced with Spring MVC Test." }, { - "id": "dynatrace", - "name": "Dynatrace", - "description": "Publish Micrometer metrics to Dynatrace, a platform featuring observability, AIOps, application security and analytics.", + "id": "cloud-contract-verifier", + "name": "Contract Verifier", + "description": "Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development.", "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.dynatrace", - "templated": true + "guide": { + "href": "https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html#_spring_cloud_contract_verifier_setup", + "title": "Spring Cloud Contract Verifier Setup" } } }, { - "id": "influx", - "name": "Influx", - "description": "Publish Micrometer metrics to InfluxDB, a dimensional time-series server that support real-time stream processing of data.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.influx", - "templated": true - } - } + "id": "cloud-contract-stub-runner", + "name": "Contract Stub Runner", + "description": "Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests." }, { - "id": "graphite", - "name": "Graphite", - "description": "Publish Micrometer metrics to Graphite, a hierarchical metrics system backed by a fixed-size database.", + "id": "unboundid-ldap", + "name": "Embedded LDAP Server", + "description": "Provides a platform neutral way for running a LDAP server in unit tests.", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.graphite", + "href": "https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/html/boot-features-nosql.html#boot-features-ldap-embedded", "templated": true } } }, { - "id": "new-relic", - "name": "New Relic", - "description": "Publish Micrometer metrics to New Relic, a SaaS offering with a full UI and a query language called NRQL.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.newrelic", - "templated": true - } - } - }, + "id": "flapdoodle-mongo", + "name": "Embedded MongoDB Database", + "description": "Provides a platform neutral way for running MongoDB in unit tests." + } + ] + }, + { + "name": "Spring Cloud", + "values": [ { - "id": "otlp-metrics", - "name": "OTLP for metrics", - "description": "Publish Micrometer metrics to an OpenTelemetry Protocol (OTLP) capable backend.", + "id": "cloud-starter", + "name": "Cloud Bootstrap", + "description": "Non-specific Spring Cloud features, unrelated to external libraries or integrations (e.g. Bootstrap context and @RefreshScope).", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.otlp", - "templated": true + "href": "https://spring.io/projects/spring-cloud-commons" } } }, { - "id": "prometheus", - "name": "Prometheus", - "description": "Expose Micrometer metrics in Prometheus format, an in-memory dimensional time series database with a simple built-in UI, a custom query language, and math operations.", + "id": "cloud-function", + "name": "Function", + "description": "Promotes the implementation of business logic via functions and supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS).", "_links": { "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/actuator/metrics.html#actuator.metrics.export.prometheus", - "templated": true + "href": "https://cloud.spring.io/spring-cloud-function/" + }, + "sample": { + "href": "https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples", + "title": "Various sample apps using Spring Cloud Function" } } }, { - "id": "distributed-tracing", - "name": "Distributed Tracing", - "description": "Enable span and trace IDs in logs." - }, + "id": "cloud-task", + "name": "Task", + "description": "Allows a user to develop and run short lived microservices using Spring Cloud. Run them locally, in the cloud, and on Spring Cloud Data Flow." + } + ] + }, + { + "name": "Spring Cloud Security", + "values": [ { - "id": "wavefront", - "name": "Wavefront", - "description": "Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack." + "id": "cloud-security", + "name": "Cloud Security", + "description": "A declarative model which can be heavily configured externally (or centrally) lends itself to the implementation of large systems of co-operating, remote components, usually with a central indentity management service." }, { - "id": "zipkin", - "name": "Zipkin", - "description": "Enable and expose span and trace IDs to Zipkin." + "id": "cloud-oauth2", + "name": "Cloud OAuth2", + "description": "OAuth2 and distributed application patterns with spring-cloud-security." } ] }, { - "name": "Testing", + "name": "Spring Cloud Tools", "values": [ { - "id": "restdocs", - "name": "Spring REST Docs", - "description": "Document RESTful services by combining hand-written with Asciidoctor and auto-generated snippets produced with Spring MVC Test.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/" - } - } + "id": "cloud-connectors", + "name": "Cloud Connectors", + "description": "Simplifies the process of connecting to services and gaining operating environment awareness in cloud platforms such as Cloud Foundry and Heroku." }, { - "id": "testcontainers", - "name": "Testcontainers", - "description": "Provide lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.", + "id": "open-service-broker", + "name": "Open Service Broker", + "description": "Framework for building Spring Boot apps that implement the Open Service Broker API, which can deliver services to applications running within cloud native platforms such as Cloud Foundry, Kubernetes and OpenShift.", "_links": { "reference": { - "href": "https://java.testcontainers.org/" - } - } - }, - { - "id": "cloud-contract-verifier", - "name": "Contract Verifier", - "description": "Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-contract/reference/" - } - } - }, - { - "id": "cloud-contract-stub-runner", - "name": "Contract Stub Runner", - "description": "Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-contract/reference/project-features-stubrunner.html" - } - } - }, - { - "id": "unboundid-ldap", - "name": "Embedded LDAP Server", - "description": "Provides a platform neutral way for running a LDAP server in unit tests.", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-boot/{bootVersion}/reference/data/nosql.html#data.nosql.ldap.embedded", - "templated": true - } - } - } - ] - }, - { - "name": "Spring Cloud", - "values": [ - { - "id": "cloud-starter", - "name": "Cloud Bootstrap", - "description": "Non-specific Spring Cloud features, unrelated to external libraries or integrations (e.g. Bootstrap context and @RefreshScope).", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/application-context-services.html" - } - } - }, - { - "id": "cloud-function", - "name": "Function", - "description": "Promotes the implementation of business logic via functions and supports a uniform programming model across serverless providers, as well as the ability to run standalone (locally or in a PaaS).", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-function/reference/" - }, - "sample": { - "href": "https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-samples", - "title": "Various sample apps using Spring Cloud Function" - } - } - }, - { - "id": "cloud-task", - "name": "Task", - "description": "Allows a user to develop and run short lived microservices using Spring Cloud. Run them locally, in the cloud, and on Spring Cloud Data Flow.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-task/reference/" - } - } - } - ] - }, - { - "name": "Spring Cloud Config", - "values": [ - { - "id": "cloud-config-client", - "name": "Config Client", - "description": "Client that connects to a Spring Cloud Config Server to fetch the application's configuration.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-config/reference/client.html" + "href": "https://docs.spring.io/spring-cloud-open-service-broker/docs/current/reference/html5/" + }, + "guide": { + "href": "https://github.com/spring-cloud-samples/bookstore-service-broker", + "title": "Using Spring Cloud Open Service Broker" } } + } + ] + }, + { + "name": "Spring Cloud Config", + "values": [ + { + "id": "cloud-config-client", + "name": "Config Client", + "description": "Client that connects to a Spring Cloud Config Server to fetch the application's configuration." }, { "id": "cloud-config-server", "name": "Config Server", "description": "Central management for configuration via Git, SVN, or HashiCorp Vault.", - "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { "href": "https://spring.io/guides/gs/centralized-configuration/", "title": "Centralized Configuration" - }, - "reference": { - "href": "https://docs.spring.io/spring-cloud-config/reference/server.html" } } }, { "id": "cloud-starter-vault-config", "name": "Vault Configuration", - "description": "Provides client-side support for externalized configuration in a distributed system. Using HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-vault/reference/" - } - } + "description": "Provides client-side support for externalized configuration in a distributed system. Using HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments." }, { "id": "cloud-starter-zookeeper-config", "name": "Apache Zookeeper Configuration", - "description": "Enable and configure common patterns inside your application and build large distributed systems with Apache Zookeeper based components. The provided patterns include Service Discovery and Configuration.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-zookeeper/reference/config.html" - } - } + "description": "Enable and configure common patterns inside your application and build large distributed systems with Apache Zookeeper based components. The provided patterns include Service Discovery and Configuration." }, { "id": "cloud-starter-consul-config", "name": "Consul Configuration", - "description": "Enable and configure the common patterns inside your application and build large distributed systems with Hashicorp’s Consul. The patterns provided include Service Discovery, Distributed Configuration and Control Bus.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-consul/reference/" - } - } + "description": "Enable and configure the common patterns inside your application and build large distributed systems with Hashicorp’s Consul. The patterns provided include Service Discovery, Distributed Configuration and Control Bus." } ] }, @@ -1352,54 +1050,33 @@ { "id": "cloud-eureka", "name": "Eureka Discovery Client", - "description": "A REST based service for locating services for the purpose of load balancing and failover of middle-tier servers.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "guide": { - "href": "https://spring.io/guides/gs/service-registration-and-discovery/", - "title": "Service Registration and Discovery with Eureka and Spring Cloud" - }, - "reference": { - "href": "https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#_service_discovery_eureka_clients" - } - } + "description": "a REST based service for locating services for the purpose of load balancing and failover of middle-tier servers." }, { "id": "cloud-eureka-server", "name": "Eureka Server", "description": "spring-cloud-netflix Eureka Server.", - "versionRange": "[3.3.0,3.5.0-M1)", "_links": { "guide": { "href": "https://spring.io/guides/gs/service-registration-and-discovery/", - "title": "Service Registration and Discovery with Eureka and Spring Cloud" - }, - "reference": { - "href": "https://docs.spring.io/spring-cloud-netflix/reference/spring-cloud-netflix.html#spring-cloud-eureka-server" + "title": "Service Registration and Discovery" } } }, { "id": "cloud-starter-zookeeper-discovery", "name": "Apache Zookeeper Discovery", - "description": "Service discovery with Apache Zookeeper.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-zookeeper/reference/discovery.html" - } - } + "description": "Service discovery with Apache Zookeeper." + }, + { + "id": "cloud-cloudfoundry-discovery", + "name": "Cloud Foundry Discovery", + "description": "Service discovery with Cloud Foundry." }, { "id": "cloud-starter-consul-discovery", "name": "Consul Discovery", - "description": "Service discovery with Hashicorp Consul.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-consul/reference/discovery.html" - } - } + "description": "Service discovery with Hashicorp Consul." } ] }, @@ -1407,25 +1084,21 @@ "name": "Spring Cloud Routing", "values": [ { - "id": "cloud-gateway", - "name": "Gateway", - "description": "Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency.", - "versionRange": "[3.3.0,3.5.0-M1)", + "id": "cloud-zuul", + "name": "Zuul", + "description": "Intelligent and programmable routing with Spring Cloud Netflix Zuul.", "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway-server-mvc.html" + "guide": { + "href": "https://spring.io/guides/gs/routing-and-filtering/", + "title": "Routing and Filtering" } } }, { - "id": "cloud-gateway-reactive", - "name": "Reactive Gateway", - "description": "Provides a simple, yet effective way to route to APIs in reactive applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency.", - "versionRange": "[3.3.0,3.5.0-M1)", + "id": "cloud-gateway", + "name": "Gateway", + "description": "Provides a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as security, monitoring/metrics, and resiliency.", "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway.html" - }, "guide": { "href": "https://github.com/spring-cloud-samples/spring-cloud-gateway-sample", "title": "Using Spring Cloud Gateway" @@ -1433,34 +1106,20 @@ } }, { - "id": "cloud-feign", - "name": "OpenFeign", - "description": "Declarative REST Client. OpenFeign creates a dynamic implementation of an interface decorated with JAX-RS or Spring MVC annotations.", - "versionRange": "[3.3.0,3.5.0-M1)", + "id": "cloud-ribbon", + "name": "Ribbon", + "description": "Client side load balancing with Spring Cloud Netflix and Ribbon.", "_links": { - "sample": { - "href": "https://github.com/spring-cloud-samples/feign-eureka", - "title": "Declarative REST calls with Spring Cloud OpenFeign sample" - }, - "reference": { - "href": "https://docs.spring.io/spring-cloud-openfeign/reference/" + "guide": { + "href": "https://spring.io/guides/gs/client-side-load-balancing/", + "title": "Client Side Load Balancing with Ribbon and Spring Cloud" } } }, { - "id": "cloud-loadbalancer", - "name": "Cloud LoadBalancer", - "description": "Client-side load-balancing with Spring Cloud LoadBalancer.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "guide": { - "href": "https://spring.io/guides/gs/spring-cloud-loadbalancer/", - "title": "Client-side load-balancing with Spring Cloud LoadBalancer" - }, - "reference": { - "href": "https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html" - } - } + "id": "cloud-feign", + "name": "OpenFeign", + "description": "Declarative REST Client. OpenFeign creates a dynamic implementation of an interface decorated with JAX-RS or Spring MVC annotations." } ] }, @@ -1468,15 +1127,45 @@ "name": "Spring Cloud Circuit Breaker", "values": [ { - "id": "cloud-resilience4j", - "name": "Resilience4J", - "description": "Spring Cloud Circuit breaker with Resilience4j as the underlying implementation.", - "versionRange": "[3.3.0,3.5.0-M1)", + "id": "cloud-hystrix", + "name": "Hystrix", + "description": "Circuit breaker with Spring Cloud Netflix Hystrix.", "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-circuitbreaker/reference/spring-cloud-circuitbreaker-resilience4j.html" + "guide": { + "href": "https://spring.io/guides/gs/circuit-breaker/", + "title": "Circuit Breaker" } } + }, + { + "id": "cloud-hystrix-dashboard", + "name": "Hystrix Dashboard", + "description": "Circuit breaker dashboard with Spring Cloud Netflix Hystrix." + }, + { + "id": "cloud-turbine", + "name": "Turbine", + "description": "Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and server-sent events." + }, + { + "id": "cloud-turbine-stream", + "name": "Turbine Stream", + "description": "Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and Spring Cloud Stream (requires a binder, e.g. Apache Kafka or RabbitMQ)." + } + ] + }, + { + "name": "Spring Cloud Tracing", + "values": [ + { + "id": "cloud-starter-sleuth", + "name": "Sleuth", + "description": "Distributed tracing via logs with Spring Cloud Sleuth." + }, + { + "id": "cloud-starter-zipkin", + "name": "Zipkin Client", + "description": "Distributed tracing with an existing Zipkin installation and Spring Cloud Sleuth Zipkin." } ] }, @@ -1486,51 +1175,73 @@ { "id": "cloud-bus", "name": "Cloud Bus", - "description": "Links nodes of a distributed system with a lightweight message broker which can used to broadcast state changes or other management instructions (requires a binder, e.g. Apache Kafka or RabbitMQ).", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-bus/reference/" - } - } + "description": "Links nodes of a distributed system with a lightweight message broker which can used to broadcast state changes or other management instructions (requires a binder, e.g. Apache Kafka or RabbitMQ)." }, { "id": "cloud-stream", "name": "Cloud Stream", - "description": "Framework for building highly scalable event-driven microservices connected with shared messaging systems (requires a binder, e.g. Apache Kafka, Apache Pulsar, RabbitMQ, or Solace PubSub+).", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-cloud-stream/reference/" - } - } + "description": "Framework for building highly scalable event-driven microservices connected with shared messaging systems (requires a binder, e.g. Apache Kafka or RabbitMQ)." + }, + { + "id": "reactive-cloud-stream", + "name": "Reactive Cloud Stream", + "description": "Reactive messaging microservices with Spring Cloud Stream (requires a binder, e.g. Apache Kafka or RabbitMQ).", + "versionRange": "[2.0.0.RELEASE,2.2.0.M1)" } ] }, { - "name": "VMware Tanzu Application Service", + "name": "Pivotal Cloud Foundry", "values": [ { "id": "scs-config-client", - "name": "Config Client (TAS)", - "description": "Config client on VMware Tanzu Application Service.", - "versionRange": "[3.3.0,3.5.0-M1)", + "name": "Config Client (PCF)", + "description": "Config client on Pivotal Cloud Foundry.", "_links": { "reference": { - "href": "https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html" + "href": "https://docs.pivotal.io/spring-cloud-services/" } } }, { "id": "scs-service-registry", - "name": "Service Registry (TAS)", - "description": "Eureka service discovery client on VMware Tanzu Application Service.", - "versionRange": "[3.3.0,3.5.0-M1)", + "name": "Service Registry (PCF)", + "description": "Eureka service discovery client on Pivotal Cloud Foundry.", "_links": { "reference": { - "href": "https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html" + "href": "https://docs.pivotal.io/spring-cloud-services/" } } + }, + { + "id": "scs-circuit-breaker", + "name": "Circuit Breaker (PCF)", + "description": "Hystrix circuit breaker client on Pivotal Cloud Foundry.", + "_links": { + "reference": { + "href": "https://docs.pivotal.io/spring-cloud-services/" + } + } + } + ] + }, + { + "name": "Amazon Web Services", + "values": [ + { + "id": "cloud-aws", + "name": "AWS Core", + "description": "AWS native services from Spring Cloud for AWS." + }, + { + "id": "cloud-aws-jdbc", + "name": "AWS RDS", + "description": "Relational databases on AWS with RDS and Spring Cloud AWS JDBC." + }, + { + "id": "cloud-aws-messaging", + "name": "AWS Simple Queue Service", + "description": "Messaging on AWS with SQS and Spring Cloud AWS Messaging." } ] }, @@ -1540,20 +1251,10 @@ { "id": "azure-support", "name": "Azure Support", - "description": "Auto-configuration for Azure Services (Service Bus, Storage, Active Directory, Key Vault, and more).", - "versionRange": "[3.3.0,3.4.0-M1)", + "description": "Auto-configuration for Azure Services (Service Bus, Storage, Active Directory, Cosmos DB, Key Vault, and more).", "_links": { - "guide": { - "href": "https://spring.io/guides/gs/spring-boot-for-azure/", - "title": "Deploying a Spring Boot app to Azure" - }, "reference": { - "href": "https://aka.ms/spring/msdocs/developer-guide", - "title": "Spring Cloud Azure developer guide" - }, - "sample": { - "href": "https://aka.ms/spring/samples", - "title": "Azure Samples" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot" } } }, @@ -1561,476 +1262,88 @@ "id": "azure-active-directory", "name": "Azure Active Directory", "description": "Spring Security integration with Azure Active Directory for authentication.", - "versionRange": "[3.3.0,3.4.0-M1)", "_links": { "guide": { - "href": "https://aka.ms/spring/msdocs/aad", - "title": "Securing a Java Web App with the Spring Boot Starter for Azure Active Directory" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-sample", + "title": "Using Active Directory" }, "reference": { - "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#spring-security-with-azure-active-directory" - }, - "sample": { - "href": "https://aka.ms/spring/samples/latest/aad", - "title": "Azure Active Directory Sample" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-active-directory-spring-boot-starter" } } }, { - "id": "azure-cosmos-db", - "name": "Azure Cosmos DB", - "description": "Fully managed NoSQL database service for modern app development, including Spring Data support.", - "versionRange": "[3.3.0,3.4.0-M1)", + "id": "azure-keyvault-secrets", + "name": "Azure Key Vault", + "description": "Manage application secrets and keys.", "_links": { "guide": { - "href": "https://aka.ms/spring/msdocs/cosmos", - "title": "How to use Spring Boot Starter with Azure Cosmos DB SQL API" - }, - "reference": { - "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#spring-data-support" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-keyvault-secrets-spring-boot-sample", + "title": "Using Key Vault" }, - "sample": { - "href": "https://aka.ms/spring/samples/latest/cosmos", - "title": "Azure Cosmos DB Sample" - } - } - }, - { - "id": "azure-keyvault", - "name": "Azure Key Vault", - "description": "All key vault features are supported, e.g. manage application secrets and certificates.", - "versionRange": "[3.3.0,3.4.0-M1)", - "_links": { - "guide": [ - { - "href": "https://aka.ms/spring/msdocs/keyvault", - "title": "Read Secrets from Azure Key Vault in a Spring Boot Application" - }, - { - "href": "https://aka.ms/spring/msdocs/keyvault/certificates", - "title": "Securing Spring Boot Applications with Azure Key Vault Certificates" - } - ], "reference": { - "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#secret-management" - }, - "sample": { - "href": "https://aka.ms/spring/samples/latest/keyvault", - "title": "Azure Key Vault Sample" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-keyvault-secrets-spring-boot-starter" } } }, { "id": "azure-storage", "name": "Azure Storage", - "description": "All Storage features are supported, e.g. blob, fileshare and queue.", - "versionRange": "[3.3.0,3.4.0-M1)", + "description": "Azure Storage service integration.", "_links": { "guide": { - "href": "https://aka.ms/spring/msdocs/storage", - "title": "How to use the Spring Boot starter for Azure Storage" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-storage-spring-boot-sample", + "title": "Using Azure Storage" }, "reference": { - "href": "https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#resource-handling" - }, - "sample": { - "href": "https://aka.ms/spring/samples/latest/storage", - "title": "Azure Storage Sample" + "href": "https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-storage-spring-boot-starter" } } } ] }, { - "name": "Google Cloud", + "name": "Google Cloud Platform", "values": [ { "id": "cloud-gcp", - "name": "Google Cloud Support", - "description": "Contains auto-configuration support for every Google Cloud integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath.", - "versionRange": "[3.3.0,3.4.0-M1)", + "name": "GCP Support", + "description": "Contains auto-configuration support for every Spring Cloud GCP integration. Most of the auto-configuration code is only enabled if other dependencies are added to the classpath.", "_links": { "reference": { - "href": "https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html" + "href": "https://cloud.spring.io/spring-cloud-gcp/reference/html/" }, "guide": { - "href": "https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples", - "title": "Google Cloud Samples" + "href": "https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples", + "title": "GCP Samples" } } }, { "id": "cloud-gcp-pubsub", - "name": "Google Cloud Messaging", - "description": "Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box.", - "versionRange": "[3.3.0,3.4.0-M1)", + "name": "GCP Messaging", + "description": "Adds the GCP Support entry and all the required dependencies so that the Google Cloud Pub/Sub integration work out of the box.", "_links": { "reference": { - "href": "https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-pubsub" + "href": "https://cloud.spring.io/spring-cloud-gcp/reference/html/#spring-integration" }, "guide": { - "href": "https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample", - "title": "Google Cloud Pub/Sub Sample" + "href": "https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample", + "title": "GCP Pub/Sub Sample" } } }, { "id": "cloud-gcp-storage", - "name": "Google Cloud Storage", - "description": "Adds the Google Cloud Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box.", - "versionRange": "[3.3.0,3.4.0-M1)", + "name": "GCP Storage", + "description": "Adds the GCP Support entry and all the required dependencies so that the Google Cloud Storage integration work out of the box.", "_links": { "reference": { - "href": "https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-storage" + "href": "https://cloud.spring.io/spring-cloud-gcp/reference/html/#spring-resources" }, "guide": { - "href": "https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample" - } - } - } - ] - }, - { - "name": "AI", - "values": [ - { - "id": "spring-ai-anthropic", - "name": "Anthropic Claude", - "description": "Spring AI support for Anthropic Claude AI models.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/chat/anthropic-chat.html" - } - } - }, - { - "id": "spring-ai-azure-openai", - "name": "Azure OpenAI", - "description": "Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/chat/azure-openai-chat.html" - } - } - }, - { - "id": "spring-ai-vectordb-azure", - "name": "Azure AI Search", - "description": "Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html" - } - } - }, - { - "id": "spring-ai-bedrock", - "name": "Amazon Bedrock", - "description": "Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html" - } - } - }, - { - "id": "spring-ai-bedrock-converse", - "name": "Amazon Bedrock Converse", - "description": "Spring AI support for Amazon Bedrock Converse. It provides a unified interface for conversational AI models with enhanced capabilities including function/tool calling, multimodal inputs, and streaming responses.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/bedrock-converse.html" - } - } - }, - { - "id": "spring-ai-vectordb-cassandra", - "name": "Apache Cassandra Vector Database", - "description": "Spring AI vector database support for Apache Cassandra.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/apache-cassandra.html" - } - } - }, - { - "id": "spring-ai-vectordb-chroma", - "name": "Chroma Vector Database", - "description": "Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html" - } - } - }, - { - "id": "spring-ai-vectordb-elasticsearch", - "name": "Elasticsearch Vector Database", - "description": "Spring AI vector database support for Elasticsearch.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html" - } - } - }, - { - "id": "spring-ai-vectordb-milvus", - "name": "Milvus Vector Database", - "description": "Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html" - } - } - }, - { - "id": "spring-ai-mistral", - "name": "Mistral AI", - "description": "Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/chat/mistralai-chat.html" - } - } - }, - { - "id": "spring-ai-vectordb-mongodb-atlas", - "name": "MongoDB Atlas Vector Database", - "description": "Spring AI vector database support for MongoDB Atlas. Is is a fully managed cloud database service that provides an easy way to deploy, operate, and scale a MongoDB database in the cloud.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html" - } - } - }, - { - "id": "spring-ai-vectordb-neo4j", - "name": "Neo4j Vector Database", - "description": "Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html" - } - } - }, - { - "id": "spring-ai-ollama", - "name": "Ollama", - "description": "Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html" - } - } - }, - { - "id": "spring-ai-openai", - "name": "OpenAI", - "description": "Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html" - } - } - }, - { - "id": "spring-ai-vectordb-oracle", - "name": "Oracle Vector Database", - "description": "Spring AI vector database support for Oracle. Enables storing, indexing and searching vector embeddings in Oracle Database 23ai.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/oracle.html" - } - } - }, - { - "id": "spring-ai-vectordb-pgvector", - "name": "PGvector Vector Database", - "description": "Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html" - } - } - }, - { - "id": "spring-ai-vectordb-pinecone", - "name": "Pinecone Vector Database", - "description": "Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html" - } - } - }, - { - "id": "spring-ai-postgresml", - "name": "PostgresML", - "description": "Spring AI support for the PostgresML text embeddings models.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html" - } - } - }, - { - "id": "spring-ai-vectordb-redis", - "name": "Redis Search and Query Vector Database", - "description": "Spring AI vector database support for Redis Search and Query. It extends the core features of Redis OSS and allows you to use Redis as a vector database.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html" - } - } - }, - { - "id": "spring-ai-stabilityai", - "name": "Stability AI", - "description": "Spring AI support for Stability AI's text to image generation model.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/image/stabilityai-image.html" - } - } - }, - { - "id": "spring-ai-transformers", - "name": "Transformers (ONNX) Embeddings", - "description": "Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html" - } - } - }, - { - "id": "spring-ai-vertexai-gemini", - "name": "Vertex AI Gemini", - "description": "Spring AI support for Google Vertex Gemini chat. Doesn't support embeddings.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/chat/vertexai-gemini-chat.html" - } - } - }, - { - "id": "spring-ai-vertexai-embeddings", - "name": "Vertex AI Embeddings", - "description": "Spring AI support for Google Vertex text and multimodal embedding models.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": [ - { - "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-text.html", - "title": "Text embedding reference" - }, - { - "href": "https://docs.spring.io/spring-ai/reference/api/embeddings/vertexai-embeddings-multimodal.html", - "title": "Multimodal embedding reference" - } - ] - } - }, - { - "id": "spring-ai-vectordb-qdrant", - "name": "Qdrant Vector Database", - "description": "Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html" - } - } - }, - { - "id": "spring-ai-vectordb-typesense", - "name": "Typesense Vector Database", - "description": "Spring AI vector database support for Typesense.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/typesense.html" - } - } - }, - { - "id": "spring-ai-vectordb-weaviate", - "name": "Weaviate Vector Database", - "description": "Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/vectordbs/weaviate.html" - } - } - }, - { - "id": "spring-ai-markdown-document-reader", - "name": "Markdown Document Reader", - "description": "Spring AI Markdown document reader. It allows to load Markdown documents, converting them into a list of Spring AI Document objects.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_markdown" - } - } - }, - { - "id": "spring-ai-tika-document-reader", - "name": "Tika Document Reader", - "description": "Spring AI Tika document reader. It uses Apache Tika to extract text from a variety of document formats, such as PDF, DOC/DOCX, PPT/PPTX, and HTML. The documents are converted into a list of Spring AI Document objects.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_tika_docx_pptx_html" - } - } - }, - { - "id": "spring-ai-pdf-document-reader", - "name": "PDF Document Reader", - "description": "Spring AI PDF document reader. It uses Apache PdfBox to extract text from PDF documents and converting them into a list of Spring AI Document objects.", - "versionRange": "[3.3.0,3.5.0-M1)", - "_links": { - "reference": { - "href": "https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html#_pdf_page" - } - } - }, - { - "id": "timefold-solver", - "name": "Timefold Solver", - "description": "AI solver to optimize operations and scheduling.", - "versionRange": "[3.3.0,3.4.0-M1)", - "_links": { - "reference": { - "href": "https://timefold.ai/docs/timefold-solver/latest/quickstart/spring-boot/spring-boot-quickstart#springBootJavaQuickStart" - }, - "sample": { - "href": "https://github.com/TimefoldAI/timefold-quickstarts/tree/stable/java/spring-boot-integration", - "title": "Timetabling sample. Assign lessons to timeslots and rooms to produce a better schedule for teachers and students" + "href": "https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample", + "title": "GCP Storage Sample" } } } @@ -2040,59 +1353,35 @@ }, "type": { "type": "action", - "default": "gradle-project", + "default": "maven-project", "values": [ { - "id": "gradle-project", - "name": "Gradle - Groovy", - "description": "Generate a Gradle based project archive using the Groovy DSL.", + "id": "maven-project", + "name": "Maven Project", + "description": "Generate a Maven based project archive.", "action": "/starter.zip", - "tags": { - "build": "gradle", - "dialect": "groovy", - "format": "project" - } + "tags": { "build": "maven", "format": "project" } }, { - "id": "gradle-project-kotlin", - "name": "Gradle - Kotlin", - "description": "Generate a Gradle based project archive using the Kotlin DSL.", + "id": "maven-build", + "name": "Maven POM", + "description": "Generate a Maven pom.xml.", + "action": "/pom.xml", + "tags": { "build": "maven", "format": "build" } + }, + { + "id": "gradle-project", + "name": "Gradle Project", + "description": "Generate a Gradle based project archive.", "action": "/starter.zip", - "tags": { - "build": "gradle", - "dialect": "kotlin", - "format": "project" - } + "tags": { "build": "gradle", "format": "project" } }, { "id": "gradle-build", "name": "Gradle Config", "description": "Generate a Gradle build file.", "action": "/build.gradle", - "tags": { - "build": "gradle", - "format": "build" - } - }, - { - "id": "maven-project", - "name": "Maven", - "description": "Generate a Maven based project archive.", - "action": "/starter.zip", - "tags": { - "build": "maven", - "format": "project" - } - }, - { - "id": "maven-build", - "name": "Maven POM", - "description": "Generate a Maven pom.xml.", - "action": "/pom.xml", - "tags": { - "build": "maven", - "format": "build" - } + "tags": { "build": "gradle", "format": "build" } } ] }, @@ -2100,96 +1389,42 @@ "type": "single-select", "default": "jar", "values": [ - { - "id": "jar", - "name": "Jar" - }, - { - "id": "war", - "name": "War" - } + { "id": "jar", "name": "Jar" }, + { "id": "war", "name": "War" } ] }, "javaVersion": { "type": "single-select", - "default": "17", + "default": "1.8", "values": [ - { - "id": "23", - "name": "23" - }, - { - "id": "21", - "name": "21" - }, - { - "id": "17", - "name": "17" - } + { "id": "13", "name": "13" }, + { "id": "11", "name": "11" }, + { "id": "1.8", "name": "8" } ] }, "language": { "type": "single-select", "default": "java", "values": [ - { - "id": "java", - "name": "Java" - }, - { - "id": "kotlin", - "name": "Kotlin" - }, - { - "id": "groovy", - "name": "Groovy" - } + { "id": "java", "name": "Java" }, + { "id": "kotlin", "name": "Kotlin" }, + { "id": "groovy", "name": "Groovy" } ] }, "bootVersion": { "type": "single-select", - "default": "3.4.0", + "default": "2.2.0.RELEASE", "values": [ - { - "id": "3.4.1-SNAPSHOT", - "name": "3.4.1 (SNAPSHOT)" - }, - { - "id": "3.4.0", - "name": "3.4.0" - }, - { - "id": "3.3.7-SNAPSHOT", - "name": "3.3.7 (SNAPSHOT)" - }, - { - "id": "3.3.6", - "name": "3.3.6" - } + { "id": "2.2.1.BUILD-SNAPSHOT", "name": "2.2.1 (SNAPSHOT)" }, + { "id": "2.2.0.RELEASE", "name": "2.2.0" }, + { "id": "2.1.10.BUILD-SNAPSHOT", "name": "2.1.10 (SNAPSHOT)" }, + { "id": "2.1.9.RELEASE", "name": "2.1.9" } ] }, - "groupId": { - "type": "text", - "default": "com.example" - }, - "artifactId": { - "type": "text", - "default": "demo" - }, - "version": { - "type": "text", - "default": "0.0.1-SNAPSHOT" - }, - "name": { - "type": "text", - "default": "demo" - }, - "description": { - "type": "text", - "default": "Demo project for Spring Boot" - }, - "packageName": { - "type": "text", - "default": "com.example.demo" - } + "groupId": { "type": "text", "default": "com.example" }, + "artifactId": { "type": "text", "default": "demo" }, + "version": { "type": "text", "default": "0.0.1-SNAPSHOT" }, + "name": { "type": "text", "default": "demo" }, + "description": { "type": "text", "default": "Demo project for Spring Boot" }, + "packageName": { "type": "text", "default": "com.example.demo" } } From 4f8830fea897c3496d78e863c82a427ccb807cd5 Mon Sep 17 00:00:00 2001 From: Damien Vitrac Date: Thu, 5 Dec 2024 11:36:30 +0100 Subject: [PATCH 3/3] Update Share wording --- start-client/src/components/common/builder/Fields.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start-client/src/components/common/builder/Fields.js b/start-client/src/components/common/builder/Fields.js index 6f07e804a3..76cc16f147 100644 --- a/start-client/src/components/common/builder/Fields.js +++ b/start-client/src/components/common/builder/Fields.js @@ -228,7 +228,7 @@ function Fields({ setDropdown(false) }} > - Share... + Share
    )}