diff --git a/.vitepress/config.ts b/.vitepress/config.ts index cecff5eee..442a237a6 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -21,8 +21,8 @@ if (!siteURL.pathname.endsWith('/')) siteURL.pathname += '/' const redirectLinks: Record = {} const latestVersions = { - java_services: '2.3.0', - java_cds4j: '2.3.1' + java_services: '2.4.0', + java_cds4j: '2.4.0' } const localSearchOptions = { diff --git a/about/features.md b/about/features.md index 27d54e70b..a848c28a0 100644 --- a/about/features.md +++ b/about/features.md @@ -39,12 +39,12 @@ Following is an index of the features currently covered by CAP, with status and | CLI commands | | |---------------------------------------------------------------------------------|----------------------------| -| [Jump-start cds-based projects](../get-started/in-a-nutshell#start-a-project) | `cds init ` | +| [Jump-start cds-based projects](../get-started/in-a-nutshell#jumpstart) | `cds init ` | | Add a feature to an existing project | `cds add ` | | [Add models from external sources](../guides/using-services#local-mocking) | `cds import ` | | [Compile cds models to different outputs](../node.js/cds-compile) | `cds compile ` | | [Run your services in local server](../node.js/cds-serve) | `cds serve ` | -| [Run and restart on file changes](../get-started/in-a-nutshell#start-a-project) | `cds watch` | +| [Run and restart on file changes](../get-started/in-a-nutshell#jumpstart) | `cds watch` | | [Read-eval-event loop](../node.js/cds-env#cli) | `cds repl` | | Inspect effective configuration | `cds env` | | Prepare for deployment | `cds build` | diff --git a/advanced/hybrid-testing.md b/advanced/hybrid-testing.md index 749b0f7d8..2f359dea3 100644 --- a/advanced/hybrid-testing.md +++ b/advanced/hybrid-testing.md @@ -28,7 +28,7 @@ cds bind -2 my-hana:my-hana-key Binds your local CAP application to the service key `my-hana-key` of the service instance `my-hana`, using your currently targeted Cloud Foundry space. The service instance `my-hana` is a _managed_ service. cds bind also supports Cloud Foundry _user-provided_ services. -[Got errors? See our troubleshooting for connection issues with SAP HANA Cloud.](../get-started/troubleshooting#deployment-fails-—-connection-failed-rte-89008-socket-closed-by-peer){.learn-more} +[Got errors? See our troubleshooting for connection issues with SAP HANA Cloud.](../get-started/troubleshooting#connection-failed-89008){.learn-more} [Learn how to bind to user-provided services on Cloud Foundry.](#binding-user-provided-services){.learn-more} Output: @@ -222,7 +222,7 @@ cds env get requires.db.credentials --profile hybrid --resolve-bindings Example output: -```json +```js { url: 'jdbc:sap://BDB9AC0F20CB46B494E6742047C4F99A.hana.eu10.hanacloud.ondemand.com:443?encrypt=true&validateCertificate=true¤tschema=BDB9AC0F20CB46B494E6742047C4F99A', host: 'bdb9ac0f20cb46b494e6742047c4f99a.hana.eu10.hanacloud.ondemand.com', diff --git a/cds/cdl.md b/cds/cdl.md index 96a4cfaf8..e477a4fd7 100644 --- a/cds/cdl.md +++ b/cds/cdl.md @@ -722,7 +722,7 @@ aspect OrderItems { #### Default Target Cardinality -If not otherwise specified, a managed composition of an aspect has the default target cardinality *to many*. +If not otherwise specified, a managed composition of an aspect has the default target cardinality *to-one*. #### For Many-to-many Relationships diff --git a/get-started/-using-mock-servers.md b/get-started/-using-mock-servers.md deleted file mode 100644 index 8ac4a6353..000000000 --- a/get-started/-using-mock-servers.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -shorty: Grow As You Go -synopsis: > - This section contains **best practices for speeding up development** by jump-starting projects - with zero setup, eliminating boilerplate code, and parallelizing work. -# status: released ---- - - -# Grow As You Go... - -{{$frontmatter?.synopsis}} - - - - -## Jump-Starting Projects {#jumpstart} - -Assuming that you've installed [_@sap/cds-dk_](jumpstart#setup), jump-starting a project in CAP is as simple as this: - -```sh -mkdir demo && cd demo # create a new project folder -cds watch # ask cds to watch for things to come -``` - - -###### Convention over Configuration - -Following the principles of *Convention over Configuration*, CAP provides defaults for many things that you'd have to configure in other frameworks. Stay within the confines of these defaults to benefit from things just working automatically. You can always override the defaults by adding your own configurations. - -###### Zero Setup - -The project folder is empty at the beginning, so there's really no setup required. No config files, no manifests whatsoever. The simple reason is that we don't need them in these early phases of a project. We may need some later on, for example, when we reach the step about [Deploying to the Cloud](../guides/deployment/), but there's no need to bother with this now. - -## Contracts First - -Most frequently, CAP projects are about creating services. Service definitions describe the API contract between a service provider and its consumers. To speed things up, you can quickly create an all-in-one service as follows: - -Copy and paste this into a file `srv/cat-service.cds`: - -```cds -@path:'/browse' -service CatalogService { - - entity Books { - key ID : UUID; - title : String; - descr : String; - author : Association to Authors; - } - - entity Authors { - key ID : UUID; - name : String; - books : Association to many Books on books.author=$self; - birth : Date; - death : Date; - } - -} -``` - - - -###### Prefer Top-Down Approaches - -Instead of following a bottom-up approach, starting from the data model, then putting services on top, then adding UIs, and so on, it's much better to apply a top-down approach as follows: - -1. Roughly sketch your application's usage and use-cases, for example, your UIs. -2. Capture required interfaces in [use case-oriented service definitions](#single-purposed-services). -3. Start building the actual UIs on top, ***and in parallel…*** -4. Have other teams working on the data models below. - -This ***(a)*** allows you to separate and parallelize work loads and ***(b)*** results in much better service interfaces than the one you'd get by using the bottom-up approach. - -
- -## Running Out of the Box - -When we save the file we created in the former step, the `cds` watcher in the terminal immediately reacts, showing this output: - -```sh -[cds](cds) - connect to datasource - sqlite::memory: -[cds](cds) - serving CatalogService at /browse -[cds](cds) - service definitions loaded from: - - srv/cat-service.cds - node_modules/@sap/cds/common.cds - -[cds](cds) - server listening on http://localhost:4004 ... (terminate with ^C) -[cds](cds) - launched in: 355.732ms -``` - -###### Full-Fledged OData Services - -Click the link [http://localhost:4004](http://localhost:4004), ... et voila, we are in contact with a full-fledged OData service (for example, see [$metadata](http://localhost:4004/browse/$metadata)​) in which we can even start [Fiori previews](http://localhost:4004/$fiori-preview/?service=CatalogService&entity=Books) to get idea of what a UI might look like. - -Let's do some **ad hoc tests**: - -* [Browse Books w/ author's name](http://localhost:4004/browse/Books?$select=ID,title&$expand=author($select=name)) -* [Browse Authors w/ written books](http://localhost:4004/browse/Authors?$expand=books) - -###### Served by Generic Providers - -What we see here are the effects of [Generic Providers](../guides/providing-services), which handle many things out of the box, such as compiling the CDS models into [OData](../advanced/odata) `$metadata` documents on the fly, as well automatically serving all CRUD requests, thereby handling all the OData protocol features such as `$batch`, up to complex choreographies such as [Fiori Draft](../advanced/fiori#draft-support). This saves us lots of work at this point and allows us to immediately go on with the next steps instead of implementing all of this in boilerplate code. - -[Learn more about generic providers.](../guides/providing-services){.learn-more} - -
- -## Mocking App Services {#with-mocks} - -Use `cds run --in-memory` to quickly start a lightweight Node.js server with *sqlite's* transient in-memory database instead of always deploying to and connecting to your target database. Do that not only in Node.js projects but also as a mock server in Java projects, for example, for frontend-related tasks, or as a mock up for remote services to integrate with. - -*Prerequisites* - -* API description of the mocked service -* CAP tools installed ([Create a Business Service with Node.js Using Visual Studio Code](https://developers.sap.com/tutorials/cp-apm-nodejs-create-service.html)) -* Node.js installed ([Official Node.js website](https://nodejs.org)) - -> The sample mock server created in the following steps is based on the mock server developed in the TechEd 2019 tutorial [Creating an SAP S/4HANA Extension with SAP Cloud Application Programming Model and SAP Cloud SDK](https://github.com/SAP-samples/cloud-cap-walkthroughs/tree/master/exercises-node/exercise04). - -###### Create a Project for the Mock Server - -1. Create an empty project for the mock server by executing `cds init mockserver` in the terminal. -2. Execute `code mockserver` to open the newly created project in VS Code. -3. Open the package.json file and add `"@sap/cds-dk": "^1.0.0"` as a dependency. Execute `npm i` to install all dependencies. - -###### Add Service API Definition - -1. Download the service API definition from the [SAP Business Accelerator Hub](https://api.sap.com/api/API_BUSINESS_PARTNER/overview) in EDMX format. -2. Import the downloaded API definition by running `cds import ~/Downloads/API_BUSINESS_PARTNER.edmx`. -This converts the EDMX service API definition to a Core Schema Notation (CSN) definition and places it into a local subfolder `srv/external`. - -###### Add a Dummy `services.cds` File - -1. In the `srv` folder, create a file named `services.cds`. -2. Add this line in the file: - -```cds -using { API_BUSINESS_PARTNER } from './external/API_BUSINESS_PARTNER'; -``` - -> Keep this file empty to serve imported APIs the default way. It can be used to tailor the mock server to your specific needs, for example, by adding or overriding certain definitions. - -###### Run the Mock Server - -1. Execute `cds run --with-mocks --in-memory` to start the mock server with in-memory database. - -Alternatively you can execute `cds watch`, which essentially is a shortcut to the same `cds run` command but also starts a monitor to restart the server automatically if sources are changed. -{.indent} - -###### Optionally Add Sample Data - -1. Create a new file `init.js` in the `srv` folder. -2. Paste the following code: - -```js -module.exports = (db)=>{ - const { A_BusinessPartnerAddress: Addresses } = db.entities( - 'API_BUSINESS_PARTNER' - ) - return cds.run ([ - INSERT.into(Addresses).columns( - 'BusinessPartner', - 'AddressID', - 'CityName', - 'StreetName' - ).rows( - [ '1003764', '28238', 'Walldorf', 'Dietmar-Hopp-Allee' ], - [ '1003765', '28241', 'Palo Alto', 'Hillview Avenue' ], - [ '1003766', '28244', 'Hallbergmoos', 'Zeppelinstraße' ], - [ '1003767', '28247', 'Potsdam', 'Konrad-Zuse-Ring' ] - ) - // add more INSERTs here, as appropriate - ]) -} -``` - -###### Mock Custom Responses - -To extend the mock server with custom logic, you can [create a custom handler](../guides/providing-services#custom-logic). To do so, create a `.js` file with the same name next to the imported service definition file, in our case `srv/external/API_BUSINESS_PARTNER.js`. Add the custom logic there: - -```js -module.exports = cds.service.impl (srv => { - // add your custom handlers here... -}) -``` - -###### Mock Error Cases - -To create error cases, explicitly return errors in a custom handler by using the [`req.error`](../node.js/events#req-error) or [`req.reject`](../node.js/events#req-reject) functions. For example, add the following code in the `API_BUSINESS_PARTNER.js` file: - -```js -module.exports = cds.service.impl(srv => { - srv.before('READ', 'A_BusinessPartnerAddress', req => { - const { BusinessPartner, AddressID:ID } = req.data - if (BusinessPartner === '1003764' && ID === '28238') - req.reject (500, 'Your error message.') - }) -}) -``` - -To trigger this error, use the following request: - -```http -GET http://localhost:4004/api-business-partner/A_BusinessPartnerAddress(BusinessPartner='1003764',AddressID='28238') -``` - -###### Reset Mock Data at Runtime - -To reset the mock data at runtime without restarting the mock server, define an [unbound action](../guides/providing-services#actions-functions). - -> When using `cds watch`, executing `rs` in the terminal with the running watch command will restart the mock server and reset the mock data without the need of an unbound action. - -Declare the action in the mock service definition. In `srv/services.cds` add the following code: - -```cds -extend service API_BUSINESS_PARTNER with { - action reset(); -} -``` - -In `srv/external/API_BUSINESS_PARTNER.js` add the implementation of the action: - -```js - srv.on('reset',async () => { - const db = await cds.connect.to('db') - await db.run(()=> require('../init')(db)) - }) -``` - -This will delete the data from the database and fill it with the initial data. - -Trigger the reset action with the following POST request: - -```http -GET http://localhost:4004/api-business-partner/reset -``` - -
- - -## Growing On... - -* [Domain Modeling](../guides/domain-modeling) -* [Providing](../guides/providing-services) -* [Events & Messaging](../guides/messaging/) -* [Using Generic Providers](../guides/providing-services#generic-providers) -* [Using Databases](../guides/databases) -* [Localization (i18n)](../guides/i18n) -* [Adding Localized Data](../guides/localized-data) -* [Adding Temporal Data](../guides/temporal-data) -* [Adding Authorization](../guides/authorization) -* [Adding Data Privacy](../guides/data-privacy/) -* [Using Multitenancy](../guides/deployment/as-saas) -* [Reuse & Compose](../guides/extensibility/composition) -* [SaaS Extensibility](../guides/extensibility/) -* [Serving OData APIs](../advanced/odata) -* [Serving SAP Fiori UIs](../advanced/fiori) -* [Deploying to the Cloud](../guides/deployment/) -* [Adding Audit Logging](../guides/data-privacy/audit-logging) -* [Using Monitoring](../advanced/monitoring) & Analytics -* Adding Tests -* [Using CI/CD](../guides/deployment/cicd) - -## Deploying to the Cloud - -CAP applications can be deployed to SAP BTP, Cloud Foundry environment. In the end, it's about deploying regular Node.js and/or Java applications, and about creating and binding appropriate service instances (see the [Cloud Foundry Developer Guide](https://docs.cloudfoundry.org/devguide/)). For more details, see [Deploying to the Cloud](../guides/deployment/). - - -
\ No newline at end of file diff --git a/get-started/in-a-nutshell.md b/get-started/in-a-nutshell.md index bd1364ff8..37da80be3 100644 --- a/get-started/in-a-nutshell.md +++ b/get-started/in-a-nutshell.md @@ -10,35 +10,36 @@ impl-variants: true # Getting Started in a Nutshell @@ -56,11 +57,7 @@ This guide is a step-by-step walkthrough to build a CAP application, using a min ## Preliminaries -1. **Prerequisite:** The following steps assume you've installed Node.js, Visual Studio Code, and `@sap/cds-dk` as described in the [_Setup_ section of the _Jumpstart_ guide](jumpstart#setup). - -2. **Hands-On Walkthrough:** The sections below describe a hands-on walkthrough, in which you'd create a new project and fill it with content step by step. - -3. **Option: Download from GitHub** – Instead of going for this hand-on step-by-step experience, you can get the final sample content from GitHub. If you choose to do so clone the repo as follows: +The sections below describe a hands-on walkthrough, in which you'd create a new project and fill it with content step by step. Alternatively, you can get the final sample content from GitHub as follows: ::: code-group @@ -76,14 +73,16 @@ git clone https://github.com/sap-samples/cloud-cap-samples-java bookshop ::: -> Just keep in mind that the sample code on GitHub is an already complete application showcasing a lot of features. So you might find more code in the app than in the code that is created in this step-by-step guide. +> When comparing the code from the *cap/samples* on GitHub to the snippets given in the sections below you will recognise additions showcasing enhanced features. So, what you find in there is a superset of what we describe in this getting started guide. -## 1. Jumpstart a Project { #start-a-project} +## Jumpstart a Project {#jumpstart} -1. Create a new project using `cds init` +**Prerequisite:** Assumed you've installed Node.js, `@sap/cds-dk`, and Visual Studio Code as described in the [_Jumpstart_ guide](jumpstart).... + +2. Create a new project using `cds init` ::: code-group ```sh [Node.js] @@ -94,19 +93,17 @@ git clone https://github.com/sap-samples/cloud-cap-samples-java bookshop ``` ::: -2. Open the project in VS Code +3. Open the project in VS Code ```sh code bookshop ``` ::: details **Note:** VS Code CLI on macOS needs extra setup - - Users on macOS must first run a command (*Shell Command: Install 'code' command in PATH*) to add the VS Code executable to the `PATH` environment variable. Read VS Code's [macOS setup guide](https://code.visualstudio.com/docs/setup/mac) for help. - + In order to start VSCode via the `code` CLI, users on macOS must first run a command (*Shell Command: Install 'code' command in PATH*) to add the VS Code executable to the `PATH` environment variable. Read VS Code's [macOS setup guide](https://code.visualstudio.com/docs/setup/mac) for help. ::: -3. Run `cds watch` in an [*Integrated Terminal*](https://code.visualstudio.com/docs/terminal/basics) +4. Run `cds watch` in an [*Integrated Terminal*](https://code.visualstudio.com/docs/terminal/basics) ::: code-group @@ -124,15 +121,15 @@ git clone https://github.com/sap-samples/cloud-cap-samples-java bookshop ```log [dev] cds w - + cds serve all --with-mocks --in-memory? live reload enabled for browsers - + ___________________________ - + No models found in db/,srv/,app/,schema,services. // [!code focus] Waiting for some to arrive... // [!code focus] - + ``` So, let's go on adding some CDS model as follows... @@ -141,7 +138,7 @@ git clone https://github.com/sap-samples/cloud-cap-samples-java bookshop -## 2. Capture Domain Models { #domain-models } +## Capture Domain Models {#domain-models} Let's feed our project by adding a simple domain model. Start by creating a file named _db/schema.cds_ (also indicated in the code box's label) and copy the following definitions into it: @@ -186,7 +183,7 @@ _Find this source also in `cap/samples` [for Node.js](https://github.com/sap-sam [Learn more about **CDS Modeling Languages**.](../cds/){ .learn-more} -### Deployed to Databases Automatically {#deployed-in-memory} +### Automatically Deployed to Databases {#deployed-in-memory}
@@ -210,7 +207,7 @@ compilation and reload of the CAP Java application. The embedded database of the ### Compiling Models (Optional) {#cli} -We can also test-compile models individually to check for validity and produce a parsed output in [CSN format](../cds/csn). For example, run this command in a new terminal: +We can optionally test-compile models individually to check for validity and produce a parsed output in [CSN format](../cds/csn). For example, run this command in a new terminal: ```sh cds db/schema.cds @@ -229,7 +226,7 @@ cds db/schema.cds -2 sql -## 3. Providing Services { #defining-services} +## Providing Services {#services} @@ -283,6 +280,7 @@ service CatalogService @(path:'/browse') { // [!code focus] [Learn more about **Defining Services**.](../guides/providing-services){ .learn-more} + ### Served to OData out of the box
@@ -298,13 +296,6 @@ This time `cds watch` reacted with additional output like this: As you can see, the two service definitions have been compiled and generic service providers have been constructed to serve requests on the listed endpoints _/admin_ and _/browse_. - -Open __ in your browser and see the generic _index.html_ page: - -![Generic welcome page generated by CAP that list all endpoints. Eases jumpstarting development and is not meant for productive use.](assets/in-a-nutshell/welcome.png){style="width:450px; box-shadow: 1px 1px 5px #888888"} {.impl .node} - -> User `alice` is a [default user with admin privileges](../node.js/authentication#mocked). Use it to access the _/admin_ service. You don't need to enter a password. -
@@ -330,16 +321,46 @@ Both services defined above contain security annotations that restrict access to ``` +
+ +::: tip + +CAP-based services are full-fledged OData services out of the box. Without adding any provider implementation code, they translate OData request into corresponding database requests, and return the results as OData responses. + +::: + +You can even use advanced query options, such as `$select`, `$expand`, `$search`, and many more. For example, try out this link: + +- http://localhost:4004/browse/Books?$search=Brontë&$select=title,author&$expand=currency($select=code,name,symbol)&$orderby=title + +[Learn more about **Serving OData Protocol**.](../advanced/odata){.learn-more} + + + +### Generic *index.html* Pages + -Open __ in your browser and see the generic _index.html_ page: +Open __ in your browser and see the generic _index.html_ page: + +
+ +![Generic welcome page generated by CAP that list all endpoints. Eases jumpstarting development and is not meant for productive use.](assets/in-a-nutshell/welcome.png){style="width:450px; box-shadow: 1px 1px 5px #888888"} + +> User `alice` is a [default user with admin privileges](../node.js/authentication#mocked). Use it to access the _/admin_ service. You don't need to enter a password. + +
+ +
-![Generic welcome page generated by CAP that list all endpoints. Eases jumpstarting development and is not meant for productive use.](assets/in-a-nutshell/welcome_java.png){style="width:450px; box-shadow: 1px 1px 5px #888888"} +Generic welcome page generated by CAP that list all endpoints. Eases jumpstarting development and is not meant for productive use. > User `authenticated` is a [prepared mock user](../java/security#mock-users) which will be authenticated by default. Use it to access the _/admin_ service. You don't need to enter a password.
+ + ### Compiling APIs (Optional) { #repl} You can also compile service definitions explicitly, for example to an [OData model](https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part3-csdl.html): @@ -351,7 +372,7 @@ cds srv/cat-service.cds -2 edmx Essentially, using a CLI, this invokes what happened automatically behind the scenes in the previous steps. While we don't really need such explicit compile steps, you can do this to test correctness on the model level, for example. -## 4. Using Databases {#databases} +## Using Databases {#databases} @@ -483,37 +504,31 @@ cds deploy --to hana [Learn more about deploying to SAP HANA.](../guides/databases){.learn-more .impl .node} -## 5. Adding/Serving UIs {#adding-serving-uis} +## Serving UIs {#uis} You can consume the provided services, for example, from UI frontends, using standard AJAX requests. Simply add an _index.html_ file into the _app/_ folder, to replace the generic index page. -### Vue.js UIs {#vue .impl .node} - -For example, you can [find a simple Vue.js app in **cap/samples**](https://github.com/sap-samples/cloud-cap-samples/tree/main/bookshop/app/vue), which demonstrates browsing and ordering books using OData requests to [the `CatalogService` API we defined above](#defining-services). {.impl .node} - -![Shows the famous bookshop catalog service in a simple Vue.js UI.](assets/in-a-nutshell/vue-app.png){style="margin:0" .impl .node .adapt} - - ### SAP Fiori UIs {#fiori} -Besides, being usable from any UI frontends using standard AJAX requests, CAP provides out-of-the-box support for SAP Fiori UIs, for example, with respect to SAP Fiori annotations and advanced features such as search, value helps and SAP Fiori draft. +CAP provides out-of-the-box support for SAP Fiori UIs, for example, with respect to SAP Fiori annotations and advanced features such as search, value helps and SAP Fiori Draft. ![Shows the famous bookshop catalog service in an SAP Fiori UI.](assets/in-a-nutshell/fiori-app.png){.mute-dark} [Learn more about **Serving Fiori UIs**.](../advanced/fiori){.learn-more} -### Using OData Protocol +### Vue.js UIs {#vue .impl .node} + +Besides Fiori UIs, CAP services can be consumed from any UI frontends using standard AJAX requests. +For example, you can [find a simple Vue.js app in **cap/samples**](https://github.com/sap-samples/cloud-cap-samples/tree/main/bookshop/app/vue), which demonstrates browsing and ordering books using OData requests to [the `CatalogService` API we defined above](#services). {.impl .node} -As CAP-based services are full-fledged OData services out of the box, you can use advanced -query options, such as `$select`, `$expand`, `$search`, and many more. +![Shows the famous bookshop catalog service in a simple Vue.js UI.](assets/in-a-nutshell/vue-app.png){style="margin:0" .impl .node .adapt} -[Learn more about **Serving OData Protocol**.](../advanced/odata){.learn-more} -## 6. Adding Custom Logic {#adding-custom-logic} +## Adding Custom Logic While the generic providers serve most CRUD requests out of the box, you can add custom code to deal with the specific domain logic of your application. diff --git a/get-started/jumpstart.md b/get-started/jumpstart.md index 8f0df6a7f..f8a80a990 100644 --- a/get-started/jumpstart.md +++ b/get-started/jumpstart.md @@ -40,8 +40,8 @@ Choose the **LTS** version, via the left-hand side button: ```sh npm add -g @sap/cds-dk +cds #> run the installed CLI ``` -[Running into problems? → See the troubleshooting guide.](troubleshooting#npm-installation){.learn-more} ### 3. Install Git @@ -103,12 +103,10 @@ Then open it in Visual Studio Code: code bookshop ``` -::: details **Note:** VS Code CLI on macOS needs extra setup - -Users on macOS must first run a command (*Shell Command: Install 'code' command in PATH*) to add the VS Code executable to the `PATH` environment variable. Find detailed instructions in [VS Code's macOS setup guide](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line). - -::: + ::: details **Note:** VS Code CLI on macOS needs extra setup + In order to start VSCode via the `code` CLI, users on macOS must first run a command (*Shell Command: Install 'code' command in PATH*) to add the VS Code executable to the `PATH` environment variable. Read VS Code's [macOS setup guide](https://code.visualstudio.com/docs/setup/mac) for help. + ::: ### Project Structure diff --git a/get-started/learning-sources.md b/get-started/learning-sources.md index 1ddf626ac..202e15a34 100644 --- a/get-started/learning-sources.md +++ b/get-started/learning-sources.md @@ -1,6 +1,17 @@ +--- +status: released + +--- + # Learning Sources -... coming soon ... +In here, we collected several interesting learning resources for you. Not all of them are maintained by the CAP team, not all of them cover CAP in its entirety but they are well prepared sources we can recommend for your learning. From the short description we provide for every resources, you're hopefully able to tell if that fits to the need you're currently having. + +::: tip Contributions Welcome... +We're just getting started with this page. Please help us in that endeavour by adding/proposing resources that helped you and also to improve the descriptions. + +::: + [[toc]] @@ -69,13 +80,17 @@ Available for: ### Incidents Mgmt {.github} +A reference sample application for CAP and the SAP BTP Developer Guide. + Available for: - [](https://github.com/cap-js/incidents-app) {._nodejs} -### SFlight Fiori {.github} +### SFlight Fiori App {.github} + +This sample is a CAP adaptation of the popular [SFLIGHT](https://blog.sap-press.com/what-is-sflight-and-the-flight-and-booking-data-model-for-abap) sample app in ABAP. It is a great source for how to add SAP Fiori applications to a CAP project, including adding UI test suites on various stacks. Available for: @@ -84,32 +99,50 @@ Available for: -### Star Wars {.github} +### Star Wars App {.github} + +SWAPI - the Star Wars API. This sample is based upon the sample at [swapi.dev](https://swapi.dev) which in turn was based upon [swapi.co](https://swapi.dev/about). The original source can be found at https://github.com/Juriy/swapi. + +The projects described above have fallen out of maintenance but still offered the opportunity for a fun yet challenging learning experience from a non-trivial data model. The many bi-directional, many-to-many relationships with the data provides a good basis for an SAP Cloud Application Programming Model and Fiori Draft UI sample. + +Available for: + +- [](https://github.com/SAP-samples/cloud-cap-hana-swapi) {._nodejs} ### BTP SaaS App {.github} -- https://github.com/SAP-samples/btp-cap-multitenant-saas +The Sustainable SaaS (SusaaS) sample application has been built in a partner collaboration to help interested developers, partners, and customers in developing multitenant Software as a Service applications using CAP and deploying them to the SAP Business Technology Platform (SAP BTP). + +- [](https://github.com/SAP-samples/btp-cap-multitenant-saas) {._nodejs} ## Tutorials -- By Enablement Teams -- TechEd Hands-Ons +- [TechEd 2023 Hands-On Session AD264 – Build Extensions with CAP](https://github.com/SAP-samples/teched2023-AD264/) +- [Build a Business Application Using CAP for Node.js](https://developers.sap.com/mission.cp-starter-extensions-cap.html) +- [Build a Business Application Using CAP for Java](https://developers.sap.com/mission.cap-java-app.html) +- [CAP Service Integration CodeJam](https://github.com/sap-samples/cap-service-integration-codejam) by DJ Adams ## Videos +- [Hybrid Testing and Alternative DBs](https://youtu.be/vqub4vJbZX8?si=j5ZkPR6vPb59iBBy)
by Thomas Jung +- [Consume External Services](https://youtu.be/rWQFbXFEr1M)
by Thomas Jung +- [Building a CAP app in 60 min](https://youtu.be/zoJ7umKZKB4)
by Martin Stenzig +- [Integrating an external API into a CAP service](https://youtu.be/T_rjax3VY2E)
by DJ Adams -## Blogs +## Blogs +- [Surviving and Thriving with the SAP Cloud Application Programming Model](https://blogs.sap.com/tag/captricks/)
by Max Streifeneder (2023) +- [Multitenant SaaS applications on SAP BTP using CAP? Tried-and-True!](https://blogs.sap.com/2022/10/19/multitenant-saas-applications-on-sap-btp-using-cap-tried-and-true/)
by Martin Frick (2022) -## Courses + diff --git a/get-started/troubleshooting.md b/get-started/troubleshooting.md index 8f9ae6acc..32b80d474 100644 --- a/get-started/troubleshooting.md +++ b/get-started/troubleshooting.md @@ -17,23 +17,9 @@ uacp: This page is linked from the Help Portal at https://help.sap.com/products/ ## General { #cds} -### How Do I Resolve Installation Issues with Node.js and NPM? { #npm-installation} - -##### Check the registry settings of your npm configuration - -Make sure that you don't have old registry entries anymore for `@sap:registry` in your _.npmrc_. Just execute: - -```sh -npm config delete "@sap:registry" -``` - -Type `npm config list` to check the configuration, which is stored in a file _.npmrc_ in the user's home directory. There, no `@sap:registry` should appear. - -[Learn more about the move to **npmjs.org** in the blog post by DJ Adams.](https://blogs.sap.com/2020/07/02/sap-npm-packages-now-on-npmjs.org/){.learn-more} - ##### Check the Node.js version { #node-version} -Make sure you run the latest long-term support (LTS) version of Node.js with an even number like `16`. Refrain from using odd versions, for which some modules with native parts will have no support and thus might even fail to install. Check version with: +Make sure you run the latest long-term support (LTS) version of Node.js with an even number like `20`. Refrain from using odd versions, for which some modules with native parts will have no support and thus might even fail to install. Check version with: ```sh node -v @@ -124,7 +110,7 @@ cds.on('served', ()=>{ }) ``` -It is important to note that by Node.js `emit` are synchronous operations, so, **avoid _any_ `await` operations** in there, as that might lead to race conditions. In particular, when registering additional event handlers with a service, as shown in the snippet above, this could lead to very heard to detect and resolve issues with handler registrations. So, for example, don't do this: +It is important to note that by Node.js `emit` are synchronous operations, so, **avoid _any_ `await` operations** in there, as that might lead to race conditions. In particular, when registering additional event handlers with a service, as shown in the snippet above, this could lead to very hard to detect and resolve issues with handler registrations. So, for example, don't do this: #### DON'T: @@ -138,17 +124,17 @@ cds.on('served', async ()=>{ ### My app isn't showing up in Dynatrace Make sure that: -- Your app's start script is `cds run` instead of `npx cds run`. +- Your app's start script is `cds-serve` instead of `npx cds run`. - You have the dependency `@dynatrace/oneagent-sdk` in your _package.json_. ### Why are requests occasionally rejected with "Acquiring client from pool timed out" or "ResourceRequest timed out"? -This error indicates, that the settings of the pool containing the database clients don't match the application's needs. There are two possible root causes. +This error indicates database client pool settings don't match the application's requirements. There are two possible root causes: | | Explanation | | --- | ---- | | _Root Cause 1_ | The maximum number of database clients in the pool is reached and additional requests wait too long for the next client. -| _Root Cause 2_ | The amount of time for creating a new connection to the database takes too long. +| _Root Cause 2_ | The creation of a new connection to the database takes too long. | _Solution_ | Adapt `max` or `acquireTimeoutMillis` with more appropriate values, according to the [documentation](../node.js/databases#databaseservice-configuration). Always make sure that database transactions are either committed or rolled back. This can work in two ways: @@ -202,6 +188,16 @@ module.exports = cds.server A new option `privilegedUser()` can be leveraged when [defining](../java/request-contexts#defining-requestcontext) your own `RequestContext`. Adding this introduces a user, which passes all authorization restrictions. This is useful for scenarios, where a restricted service should be called through the [local service consumption API](../java/consumption-api) either in a request thread regardless of the original user's authorizations or in a background thread. +### Why do I get a "User should not exist" error during build time? + +| | Explanation | +| --- | ---- | +| _Root Cause_ | You've [explicitly configured a mock](../java/security#explicitly-defined-mock-users) user with a name that is already used by a [preconfigured mock user](../java/security#preconfigured-mock-users). +| _Solution_ | Rename the mock user and build your project again. + + + + ### How can I expose custom REST APIs with CAP? From time to time you might want to expose additional REST APIs in your CAP application, that aren't covered through CAPs existing protocol adapters (for example, OData V4). A common example for this might be a CSV file upload or another type of custom REST endpoint. @@ -324,37 +320,6 @@ You can apply this solution also when using the `cds-mtx` library. You can eithe - On trial landscapes, you need to use `hanatrial` instead of `hana` as service type: `cf create-service hanatrial ...` - When using the `cds-mtx` library with more than one SAP HANA database mapped to your Cloud Foundry space, you can add the service creation parameters via the environment variable `CDS_MTX_PROVISIONING_CONTAINER="{\"provisioning_parameters\":{\"database_id\":\"XXX\"}}"`, where `XXX` represents the ID of the database instance. You can also pass the ID of the database with the subscription request. -### I get errors with response code 429 from the service-manager service when subscribing a tenant -> This is valid for the 'old' MTX Services package `@sap/cds-mtx`. - -You can reduce the number of request by adapting the configuration of the `@sap/instance-manager` library. See also [`@sap/instance-manager` documentation](https://www.npmjs.com/package/@sap/instance-manager). - ```json - "cds": { - "mtx": { - "provisioning": { - "instancemanageroptions": { - "polling_interval_millis": 3000 - } - } - } - } - ``` - -### I get errors with response code 429 from the service-manager service when running a tenant upgrade for all tenants -> This is valid for the 'old' MTX Services package `@sap/cds-mtx`. - -You can disable the database clustering for the update. - ```json - "cds": { - "mtx": { - "jobs": { - "clusterbydb": false - } - } - } - ``` - This setting requires at least `@sap/cds-mtx@2.6.2`. - ### How Do I Resolve Deployment Errors? @@ -411,7 +376,7 @@ You can disable the database clustering for the update. | _Root Cause_ | Your configuration isn't properly set. | | _Solution_ | Configure your project as described in [Using Databases](../guides/databases). -#### Deployment fails — _Connection failed (RTE:[89008] Socket closed by peer_ +#### Deployment fails — _Connection failed (RTE:[89008] Socket closed by peer_ {#connection-failed-89008} | | Explanation | | --- | ---- | @@ -420,7 +385,7 @@ You can disable the database clustering for the update.
-#### Deployment fails — _Connection failed (RTE:[89013] Socket closed by peer_ +#### Deployment fails — _Connection failed (RTE:[89013] Socket closed by peer_ {#connection-failed-89013} | | Explanation | | --- | ---- | @@ -655,6 +620,34 @@ Alternatively, without login: cds extend … -s ``` +### I get errors with response code 429 from the service-manager service when subscribing a tenant + +You can reduce the number of request by adapting the configuration of the `@sap/instance-manager` library. See also [`@sap/instance-manager` documentation](https://www.npmjs.com/package/@sap/instance-manager). + ```json + "cds": { + "mtx": { + "provisioning": { + "instancemanageroptions": { + "polling_interval_millis": 3000 + } + } + } + } + ``` + +### I get errors with response code 429 from the service-manager service when running a tenant upgrade for all tenants + +You can disable the database clustering for the update. + ```json + "cds": { + "mtx": { + "jobs": { + "clusterbydb": false + } + } + } + ``` +This setting requires at least `@sap/cds-mtx@2.6.2`. ## CAP on Kyma diff --git a/guides/authorization.md b/guides/authorization.md index 6cc40aab8..7c7c0c358 100644 --- a/guides/authorization.md +++ b/guides/authorization.md @@ -112,14 +112,14 @@ For XSUAA or IAS authentication, the request user is attached with the pseudo ro ::: #### internal-user -Pseudo-role `internal-user` allows to define application endpoints that can be accessed exclusively by the own PaaS tenant (technical communication). The advantage is that similar to `system-user` no technical CAP roles need to be defined to protect such internal endpoints. However, in contrast to `system-user`, the endpoints protected by this pseudo-role do not allow requests from any external technical clients. Hence is suitable for **technical intra-application communication**, see [Security > Application Zone](../guides/security/overview#application-zone). +Pseudo-role `internal-user` allows to define application endpoints that can be accessed exclusively by the own PaaS tenant (technical communication). The advantage is that similar to `system-user` no technical CAP roles need to be defined to protect such internal endpoints. However, in contrast to `system-user`, the endpoints protected by this pseudo-role do not allow requests from any external technical clients. Hence is suitable for **technical intra-application communication**, see [Security > Application Zone](../guides/security/overview#application-zone). ::: tip For XSUAA or IAS authentication, the request user is attached with the pseudo role `internal-user` if the presented JWT token has been issued with grant type `client_credentials` or `client_x509` on basis of the **identical** XSUAA or IAS service instance. ::: ::: warning -All technical clients that have access to the application's XSUAA or IAS service instance can call your service endpoints as `internal-user`. +All technical clients that have access to the application's XSUAA or IAS service instance can call your service endpoints as `internal-user`. **Refrain from sharing this service instance with untrusted clients**, for instance by passing services keys or [SAP BTP Destination Service](https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/create-destinations-from-scratch) instances. ::: @@ -857,6 +857,7 @@ If generic enforcement doesn't fit your needs, you can override or adapt it with - [Authorization Enforcement in Node.js](../node.js/authentication#enforcement) - [Enforcement API & Custom Handlers in Java](../java/security#enforcement-api) +
## Role Assignments with XSUAA { #xsuaa-configuration} diff --git a/guides/databases-sqlite.md b/guides/databases-sqlite.md index a2fc4ea1c..749e325a8 100644 --- a/guides/databases-sqlite.md +++ b/guides/databases-sqlite.md @@ -121,7 +121,7 @@ Finally, configure the DB connection in the non-productive `default` profile: ```yaml --- spring: - profiles: default + config.activate.on-profile: default sql: init: mode: always @@ -206,7 +206,7 @@ Finally, configure the DB connection - ideally in a dedicated `sqlite` profile: ```yaml --- spring: - profiles: sqlite + config.activate.on-profile: sqlite datasource: url: "jdbc:sqlite:sqlite.db" driver-class-name: org.sqlite.JDBC diff --git a/guides/domain-modeling.md b/guides/domain-modeling.md index 2997b849d..171086bd1 100644 --- a/guides/domain-modeling.md +++ b/guides/domain-modeling.md @@ -2,6 +2,7 @@ synopsis: > Most projects start with capturing the essential objects of their domain in a respective domain model. Find here an introduction to the basics of domain modeling with CDS, complemented with recommended best practices. +redirect_from: guides/domain-models status: released --- @@ -15,7 +16,7 @@ Domain Models capture the static, data-related aspects of a problem domain in te ### Capture Intent — *What, not How!* -CDS focuses on *conceptual modelling*: we want to capure intent, not imperative implementations — that is: What, not How. Not only does that keep domain models concise and comprehensible, it also allows us to provide optimized generic implementations. +CDS focuses on *conceptual modelling*: we want to capture intent, not imperative implementations — that is: What, not How. Not only does that keep domain models concise and comprehensible, it also allows us to provide optimized generic implementations. For example, given an entity definition like that: diff --git a/guides/using-services.md b/guides/using-services.md index 898e6dedd..2ce26edf4 100644 --- a/guides/using-services.md +++ b/guides/using-services.md @@ -92,7 +92,7 @@ The user picks a supplier from the list. That list is coming [from the remote sy It should be also possible to search for suppliers and show the associated risks by extending the remote supplier service [with the local risk service](#extend-a-remote-by-a-local-service) and its risks. -## ① Get and Import an External Service API { #external-service-api } +## Get and Import an External Service API { #external-service-api } To communicate to remote services, CAP needs to know their definitions. Having the definitions in your project allows you to mock them during design time. @@ -236,7 +236,7 @@ To work with remote services, add the following dependency to your Maven project
-## ② Local Mocking {#local-mocking} +## Local Mocking {#local-mocking} When developing your application, you can mock the remote service. @@ -469,7 +469,7 @@ For example: [Try out the example application.](https://github.com/SAP-samples/cloud-cap-risk-management/tree/ext-service-s4hc-suppliers-ui-java){.learn-more} -## ③ Execute Queries {#execute-queries} +## Execute Queries {#execute-queries} You can send requests to remote services using CAP's powerful querying API. @@ -596,7 +596,7 @@ For Java, you can use the `HttpClient` API to implement your custom requests. Th [Learn more about using destinations.](#use-destinations-with-java){.learn-more} -## ④ Integrate and Extend {#integrate-and-extend} +## Integrate and Extend {#integrate-and-extend} By creating projections on remote service entities and using associations, you can create services that combine data from your local service and remote services. @@ -923,7 +923,7 @@ The following matrix can help you to find the best approach for your scenario: > 4 Depends on the connectivity and performance of the remote system.
-## ⑤ Connect and Deploy {#connect-and-deploy} +## Connect and Deploy {#connect-and-deploy} + + +# Transactional Outbox + +Usually the emit of messages should be delayed until the main transaction succeeded. Otherwise recipients will also receive messages in case of a rollback. +To solve this problem, an outbox is used internally to defer the emit of messages until the success of the current transaction. + + + + + +## Persistent Outbox (Default) {#persistent-outbox} + +Using the persistent outbox, the to-be-emitted message is stored in a database table first. The same database transaction is used +as for other operations, therefore transactional consistency is guaranteed. + +The persistent outbox is globally enabled for all deferrable services (for example for [cds.MessagingService](messaging) and `cds.AuditLogService`). +You can set the global outbox configuration, the defaults are: + +```json +{ + "requires": { + "outbox": { + "kind": "persistent-outbox", + "maxAttempts": 20, + "chunkSize": 100, + "storeLastError": true, + "parallel": true + } + } +} +``` + +The optional parameters are: + +- `maxAttempts` (default `20`): The number of unsuccessful emits until the message is ignored. It will still remain in the database table. +- `chunkSize` (default `100`): The number of messages which are read from the database table in one go. +- `storeLastError` (default `true`): Specifies if error information of the last failed emit should be stored in the outbox table. +- `parallel` (default `true`): Specifies if messages are sent in parallel (faster but the order isn't guaranteed). + + +Once the transaction succeeds, the messages are read from the database table and emitted. If an emit was successful, the respective message +is deleted from the database table. If not, there will be retries after (exponentially growing) waiting times. +After a maximum number of attempts, the message is ignored for processing and remains in the database table which +therefore also acts as a dead letter queue. +There is only one active message processor per service, tenant and app instance, hence there won't be +duplicate emits except in the unlikely case of an app crash right after the emit and before the deletion of the +message entry. +::: tip +Some errors during the emit are identified as unrecoverable, for example in [SAP Event Mesh](../guides/messaging/event-mesh) if the used topic is forbidden. +The respective message is then updated and the `attempts` field is set to `maxAttempts` to prevent further processing. +[Programming errors](./best-practices#error-types) crash the server instance and must be fixed. +::: + + +Your database model is automatically extended by the entity `cds.outbox.Messages`, as follows: + +```cds +using cuid from '@sap/cds/common'; + +namespace cds.outbox; + +entity Messages : cuid { + timestamp: Timestamp; + target: String; + msg: LargeString; + attempts: Integer default 0; + partition: Integer default 0; + lastError: LargeString; + lastAttemptTimestamp: Timestamp @cds.on.update : $now; +} +``` +::: tip +In your CDS model, you can refer to the entity `cds.outbox.Messages` using the path `@sap/cds/srv/outbox`, +for example to expose it in a service. +::: + +::: warning +- If the app crashes, another emit for the respective tenant and service is necessary to restart the message processing. +- The user id is stored to recreate the correct context. +::: + +To overwrite the outbox configuration for a particular service, you can specify the `outbox` option. + +Example: + +```json +{ + "requires": { + "messaging": { + "kind": "enterprise-messaging", + "outbox": { + "maxAttempts": 10, + "chunkSize": 10 + } + } + } +} +``` + +## In-Memory Outbox + +Messages are emitted when the current transaction is successful. Until then, messages are only kept in memory. +This is similar to the following code if done manually: +```js +cds.context.on('succeeded', () => this.emit(msg)) +``` +::: warning +The message is lost if its emit fails, there is no retry mechanism. +The app will crash if the error is identified as unrecoverable, for example in [SAP Event Mesh](../guides/messaging/event-mesh) if the used topic is forbidden. +::: + +## Immediate Emit + +To disable deferred emitting for a particular service, you can set the `outbox` option of your service to `false`: + +```json +{ + "requires": { + "messaging": { + "kind": "enterprise-messaging", + "outbox": false + } + } +} +``` + +## Troubleshooting + +### Delete Entries in the Outbox Table + +To manually delete entries in the table `cds.outbox.Messages`, you can either +expose it in a service or programmatically modify it using the `cds.outbox.Messages` +entity: + +```js +const db = await cds.connect.to('db') +const { Messages } = db.entities('cds.outbox') +await DELETE.from(Messages) +``` + +### Outbox Table Not Found + +If the outbox table is not found on the database, this can be caused by insufficient configuration data in _package.json_. + +In case you have overwritten `requires.db.model` there, make sure to add the outbox model path `@sap/cds/srv/outbox`: + +```jsonc +"requires": { + "db": { ... + "model": [..., "@sap/cds/srv/outbox"] + } +} +``` + +The following is only relevant if you're using @sap/cds version < 6.7.0 and you've configured `options.model` in custom build tasks. +Add the model path accordingly: + +```jsonc +"build": { + "tasks": [{ ... + "options": { "model": [..., "@sap/cds/srv/outbox"] } + }] +} +``` + +Note that model configuration isn't required for CAP projects using the [standard project layout](../get-started/jumpstart#project-structure) that contain the folders `db`, `srv`, and `app`. In this case, you can delete the entire `model` configuration. diff --git a/package-lock.json b/package-lock.json index 998c6a07d..c016b1c91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@cap-js/docs", - "version": "0.20.0", + "version": "0.25.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@cap-js/docs", - "version": "0.20.0", + "version": "0.25.0", "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@types/adm-zip": ">=0.5.0", @@ -19,7 +19,7 @@ "markdownlint-cli": ">=0.35.0", "markdownlint-rule-search-replace": "^1.1.1", "sass": "^1.62.1", - "vitepress": "^1.0.0-rc.20" + "vitepress": "^1.0.0-rc.25" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -324,54 +324,55 @@ } }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.7.tgz", - "integrity": "sha512-Mw7J0RAWGpEup/+eIePw3wi+OlMGNicrD1r9OhdgIgO6sHEi01ibS/RzNNbC7UziLaYEHi8+WfLyGzmp1ZISrQ==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.9.tgz", + "integrity": "sha512-ebfrf5Zaw33bcqT80Qrkv7IGT7GI/CDp15bSk2EUmdORzk1SCKZl6L4vUo3NLMmxVwYioS+OQmsW8E88sJNyGg==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.24", - "@cspell/dict-cpp": "^5.0.5", + "@cspell/dict-companies": "^3.0.27", + "@cspell/dict-cpp": "^5.0.9", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.10", + "@cspell/dict-css": "^4.0.12", "@cspell/dict-dart": "^2.0.3", "@cspell/dict-django": "^4.1.0", "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.8", + "@cspell/dict-en_us": "^4.3.11", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.1", + "@cspell/dict-filetypes": "^3.0.2", "@cspell/dict-fonts": "^4.0.0", - "@cspell/dict-fsharp": "^1.0.0", + "@cspell/dict-fsharp": "^1.0.1", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.3", + "@cspell/dict-golang": "^6.0.4", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", "@cspell/dict-java": "^5.0.6", - "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-k8s": "^1.0.2", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", - "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-lua": "^4.0.2", + "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", - "@cspell/dict-npm": "^5.0.10", - "@cspell/dict-php": "^4.0.3", + "@cspell/dict-npm": "^5.0.12", + "@cspell/dict-php": "^4.0.4", "@cspell/dict-powershell": "^5.0.2", - "@cspell/dict-public-licenses": "^2.0.4", - "@cspell/dict-python": "^4.1.9", + "@cspell/dict-public-licenses": "^2.0.5", + "@cspell/dict-python": "^4.1.10", "@cspell/dict-r": "^2.0.1", - "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.2", - "@cspell/dict-sql": "^2.1.1", + "@cspell/dict-software-terms": "^3.3.9", + "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", "@cspell/dict-typescript": "^3.1.2", @@ -382,30 +383,30 @@ } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.7.tgz", - "integrity": "sha512-bogUQKKZWLttZtxFKjpzHuliIha/ByV2km18gm8dA2uB3IrzD1UJy4sCE8lnaodm6n3VtjnViSkQ5XIVU3gAKQ==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.9.tgz", + "integrity": "sha512-QHsem5OZXshFX+Wdlx3VpdPi9WS7KgoBMGGJ4zQZ3lp81Rb1tRj0Ij/98whq882QOmAVQfr+uOHANHLnyPr0LQ==", "dev": true, "dependencies": { - "@cspell/cspell-types": "7.3.7" + "@cspell/cspell-types": "7.3.9" }, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-pipe": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.7.tgz", - "integrity": "sha512-ZO8v3EwGhjUvhPo1S48+CKv7EPXMoYF7LGERB34K8EXFByb9+J74ojMYj9UgLRV68lFTrDFde3bHoZPPVS1FsA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.9.tgz", + "integrity": "sha512-gKYTHcryKOaTmr6t+M5h1sZnQ42eHeumBJejovphipXfdivedUnuYyQrrQGFAlUKzfEOWcOPME1nm17xsaX5Ww==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-resolver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.7.tgz", - "integrity": "sha512-WWZcTI5f2cCjr1yRDTMkcVg7Meil3s+0aaKcLCDTGQf9J2UWWjpqDJ6M6keYei3paAjxW2Pk03IRNNwdA3+igQ==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.9.tgz", + "integrity": "sha512-2slYAGvi7EFLKyJ5hrYBNaFT2iyOEQM1pEIzm+PDuhNJE/9wuBY5pBVqIgFSPz53vsQvW9GJThNY8h1/2EH3ZA==", "dev": true, "dependencies": { "global-dirs": "^3.0.1" @@ -415,18 +416,18 @@ } }, "node_modules/@cspell/cspell-service-bus": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.7.tgz", - "integrity": "sha512-pnDOFpjht7dZYydMygcf0brCSk5BGRvbeWRH6MaMhd+3CdyzyEvtZG3IbBQVNyVvDTA2c/K3rljOAo8y3/lpnw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.9.tgz", + "integrity": "sha512-VyfK3qWtJZag4Fe/x1Oh/tqCNVGKGlQ2ArX1fVdmTVGQtZcbXuMKdZI80t4b8SGtzGINHufAdakpu3xucX/FrQ==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.7.tgz", - "integrity": "sha512-zM2BuZJ3UUgPwF78bssggi8X20nmW3a95EmbNJKfbO6Zf2ui7UMzeP3BwpCZk30A/EixGlFhLf6Xd+eBT/DQqw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.9.tgz", + "integrity": "sha512-p7s8yEV6ASz0HjiArH11yjNj3vXzK2Ep94GrpdtYJxSxFC2w1mXAVUaJB/5+jC4+1YeYsmcBFTXmZ1rGMyTv3g==", "dev": true, "engines": { "node": ">=16" @@ -451,15 +452,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.26", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.26.tgz", - "integrity": "sha512-BGRZ/Uykx+IgQoTGqvRqbBMQy7QSuY0pbTHgtmKtc1scgzZMJQKMDwyuE6LJzlhdlrV7TsVY0lyXREybnDpQPQ==", + "version": "3.0.27", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.27.tgz", + "integrity": "sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.6.tgz", - "integrity": "sha512-2z9JqWgsRYROnqeMj1k1L1taSQQHMhqfU6EqDNApsEQT3naznKntV8KKyybr2YSz0bIG9fMbzVv0GoQBbLgD9A==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.9.tgz", + "integrity": "sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -517,9 +518,9 @@ "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.8.tgz", - "integrity": "sha512-rCPsbDHuRnFUbzWAY6O1H9+cLZt5FNQwjPVw2TdQZfipdb0lim984aLGY+nupi1iKC3lfjyd5SVUgmSZEG1QNA==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.11.tgz", + "integrity": "sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw==", "dev": true }, "node_modules/@cspell/dict-en-common-misspellings": { @@ -535,9 +536,9 @@ "dev": true }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", - "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.2.tgz", + "integrity": "sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg==", "dev": true }, "node_modules/@cspell/dict-fonts": { @@ -547,9 +548,9 @@ "dev": true }, "node_modules/@cspell/dict-fsharp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.0.tgz", - "integrity": "sha512-dHPkMHwW4dWv3Lv9VWxHuVm4IylqvcfRBSnZ7usJTRThraetSVrOPIJwr6UJh7F5un/lGJx2lxWVApf2WQaB/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz", + "integrity": "sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==", "dev": true }, "node_modules/@cspell/dict-fullstack": { @@ -571,9 +572,9 @@ "dev": true }, "node_modules/@cspell/dict-golang": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.3.tgz", - "integrity": "sha512-KiNnjAeqDBq6zH4s46hzBrKgqIrkSZ9bbHzQ54PbHfe+jurZkSZ4lXz6E+315RNh2TkRLcNppFvaZqJvKZXomA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.4.tgz", + "integrity": "sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ==", "dev": true }, "node_modules/@cspell/dict-haskell": { @@ -601,9 +602,9 @@ "dev": true }, "node_modules/@cspell/dict-k8s": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", - "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.2.tgz", + "integrity": "sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==", "dev": true }, "node_modules/@cspell/dict-latex": { @@ -624,6 +625,12 @@ "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", "dev": true }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz", + "integrity": "sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==", + "dev": true + }, "node_modules/@cspell/dict-node": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", @@ -637,9 +644,9 @@ "dev": true }, "node_modules/@cspell/dict-php": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.3.tgz", - "integrity": "sha512-PxtSmWJCDEB4M8R9ER9ijxBum/tvUqYT26QeuV58q2IFs5IrPZ6hocQKvnFGXItjCWH4oYXyAEAAzINlBC4Opg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.4.tgz", + "integrity": "sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==", "dev": true }, "node_modules/@cspell/dict-powershell": { @@ -649,15 +656,15 @@ "dev": true }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.4.tgz", - "integrity": "sha512-KjsfuGwMWvPkp6s0nR+s4mZc9SQhh1tHDOyQZfEVRwi+2ev7f8l7R6ts9sP2Mplb8UcxwO6YmKwxHjN+XHoMoA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.5.tgz", + "integrity": "sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==", "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.9.tgz", - "integrity": "sha512-JMA4v/ZPJWuDt3PPFz+23VIY3iDIB+xOTQ6nw+WkcJU5yr6FUl5zMU9ModKrgujg3jGRuuJqofErZVPqHNHYAA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.10.tgz", + "integrity": "sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^1.0.11" @@ -688,15 +695,15 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.4.tgz", - "integrity": "sha512-+WpBcJmhPl+jZEEGqgeiyDeJuCJ/M2TuVPaHJJI83LQLvLf1z4/5dkHXU7fUkimpxXFJWWR1DlWLA3+PKBeTfg==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.9.tgz", + "integrity": "sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA==", "dev": true }, "node_modules/@cspell/dict-sql": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.1.tgz", - "integrity": "sha512-v1mswi9NF40+UDUMuI148YQPEQvWjac72P6ZsjlRdLjEiQEEMEsTQ+zlkIdnzC9QCNyJaqD5Liq9Mn78/8Zxtw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.2.tgz", + "integrity": "sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==", "dev": true }, "node_modules/@cspell/dict-svelte": { @@ -724,21 +731,21 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.7.tgz", - "integrity": "sha512-ac52OLDMYBHkRQ8XzihOWnyfqri3M84ELTZdqBhR5YGcHW/mxKhsmXqudA980SdRRKaicD39yhX4idAFb4AsDg==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.9.tgz", + "integrity": "sha512-P6tAmDVhrW03hmhetxhBKlNTYwL2lk8ZehYQwSpXaLnaFrS3xrQvfUaJ3Mj9W2CIMzSYXlLmPO2FLRhXK2dnEw==", "dev": true, "dependencies": { - "import-meta-resolve": "^3.0.0" + "import-meta-resolve": "^3.1.1" }, "engines": { "node": ">=16" } }, "node_modules/@cspell/strong-weak-map": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.7.tgz", - "integrity": "sha512-n+jRgwH0wU+HsfqgCGVzPmWnZl4SyhtvPxusKwXj6L/STGdt8IP2rYl1PFOtyvgjPjh8xXe/jRrq7zH07btiKA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.9.tgz", + "integrity": "sha512-XKpw/p3+EN+PWiFAWc45RJPI9zQRkPSVdUFeZb0YLseWF/CkogScgIe4CLfMLITiVbP0X/FKk90+aTPfAU38kg==", "dev": true, "engines": { "node": ">=16" @@ -1160,18 +1167,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1192,21 +1199,21 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -1228,9 +1235,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1302,24 +1309,24 @@ } }, "node_modules/@types/adm-zip": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.2.tgz", - "integrity": "sha512-33OTTnnW3onOE6HJuoqsi7T7Ojupz7zO/Vs5ddRNVCYQnu4lg05RqH/pr9eidHGvGyYfdO4uPO9cvegAMixBCQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.4.tgz", + "integrity": "sha512-/pYie/76O0TTqU4L/z1XqQ5mA5QvScaP/EO3lpH7iQ6/AjioYyuvi2IAmQeimuTTnytl03e9g8YFYkGV2Bxojw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", "dev": true }, "node_modules/@types/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-Tla7hH9oeXHOlJyBFdoqV61xWE9FZf/y2g+gFVwQ2vE1/eBzjUno5JCd3Hdb5oATve5OF6xNjZ/4VIZhVVx+hA==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.6.tgz", + "integrity": "sha512-0VqpvusJn1/lwRegCxcHVdmLfF+wIsprsKMC9xW8UPcTxhFcQtoN/fBU1zMe8pH7D/RuueMh2CaBaNv+GrLqTw==", "dev": true, "dependencies": { "@types/linkify-it": "*", @@ -1327,33 +1334,36 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.3.tgz", - "integrity": "sha512-T5k6kTXak79gwmIOaDF2UUQXFbnBE0zBUzF20pz7wDYu0RQMzWg+Ml/Pz50214NsFHBITkoi5VtdjFZnJ2ijjA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", - "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", - "dev": true + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/web-bluetooth": { - "version": "0.0.17", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", - "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz", + "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==", "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", - "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" }, "engines": { @@ -1373,13 +1383,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", - "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1390,9 +1400,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", - "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1403,13 +1413,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", - "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1430,12 +1440,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", - "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1446,134 +1456,153 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.1.tgz", + "integrity": "sha512-tUBEtWcF7wFtII7ayNiLNDTCE1X1afySEo+XNVMNkFXaThENyCowIEX095QqbJZGTgoOcSVDJGlnde2NG4jtbQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, "node_modules/@vue/compiler-core": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", - "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz", + "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", "dev": true, "dependencies": { - "@babel/parser": "^7.21.3", - "@vue/shared": "3.3.4", + "@babel/parser": "^7.23.0", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", - "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", + "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.3.4", - "@vue/shared": "3.3.4" + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", - "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", + "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", "dev": true, "dependencies": { - "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.4", - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-ssr": "3.3.4", - "@vue/reactivity-transform": "3.3.4", - "@vue/shared": "3.3.4", + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.8", + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-ssr": "3.3.8", + "@vue/reactivity-transform": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", - "magic-string": "^0.30.0", - "postcss": "^8.1.10", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", - "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", + "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.4", - "@vue/shared": "3.3.4" + "@vue/compiler-dom": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/devtools-api": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", - "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==", "dev": true }, "node_modules/@vue/reactivity": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", - "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz", + "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==", "dev": true, "dependencies": { - "@vue/shared": "3.3.4" + "@vue/shared": "3.3.8" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", - "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", + "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", "dev": true, "dependencies": { - "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.4", - "@vue/shared": "3.3.4", + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", - "magic-string": "^0.30.0" + "magic-string": "^0.30.5" } }, "node_modules/@vue/runtime-core": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", - "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz", + "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==", "dev": true, "dependencies": { - "@vue/reactivity": "3.3.4", - "@vue/shared": "3.3.4" + "@vue/reactivity": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", - "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz", + "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.3.4", - "@vue/shared": "3.3.4", - "csstype": "^3.1.1" + "@vue/runtime-core": "3.3.8", + "@vue/shared": "3.3.8", + "csstype": "^3.1.2" } }, "node_modules/@vue/server-renderer": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", - "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz", + "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.3.4", - "@vue/shared": "3.3.4" + "@vue/compiler-ssr": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { - "vue": "3.3.4" + "vue": "3.3.8" } }, "node_modules/@vue/shared": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", - "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz", + "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==", "dev": true }, "node_modules/@vueuse/core": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.4.1.tgz", - "integrity": "sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz", + "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==", "dev": true, "dependencies": { - "@types/web-bluetooth": "^0.0.17", - "@vueuse/metadata": "10.4.1", - "@vueuse/shared": "10.4.1", - "vue-demi": ">=0.14.5" + "@types/web-bluetooth": "^0.0.18", + "@vueuse/metadata": "10.5.0", + "@vueuse/shared": "10.5.0", + "vue-demi": ">=0.14.6" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -1606,14 +1635,14 @@ } }, "node_modules/@vueuse/integrations": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.4.1.tgz", - "integrity": "sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.5.0.tgz", + "integrity": "sha512-fm5sXLCK0Ww3rRnzqnCQRmfjDURaI4xMsx+T+cec0ngQqHx/JgUtm8G0vRjwtonIeTBsH1Q8L3SucE+7K7upJQ==", "dev": true, "dependencies": { - "@vueuse/core": "10.4.1", - "@vueuse/shared": "10.4.1", - "vue-demi": ">=0.14.5" + "@vueuse/core": "10.5.0", + "@vueuse/shared": "10.5.0", + "vue-demi": ">=0.14.6" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -1698,21 +1727,21 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.4.1.tgz", - "integrity": "sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz", + "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.4.1.tgz", - "integrity": "sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz", + "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==", "dev": true, "dependencies": { - "vue-demi": ">=0.14.5" + "vue-demi": ">=0.14.6" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -1745,9 +1774,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2026,9 +2055,9 @@ "dev": true }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -2138,29 +2167,29 @@ } }, "node_modules/cspell": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.7.tgz", - "integrity": "sha512-p23EuTu+7b2qioRxC7sV1TVfxIPm7928BtT4jYBHGeONiYP0EOOWNP8ynaksMYLTifQBzH1Q0LO4L5ogHiQsfw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.9.tgz", + "integrity": "sha512-QzunjO9CmV5+98UfG4ONhvPtrcAC6Y2pEKeOrp5oPeyAI7HwgxmfsR3ybHRlMPAGcwKtDOurBKxM7jqXNwkzmA==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "7.3.7", - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "@cspell/dynamic-import": "7.3.7", + "@cspell/cspell-json-reporter": "7.3.9", + "@cspell/cspell-pipe": "7.3.9", + "@cspell/cspell-types": "7.3.9", + "@cspell/dynamic-import": "7.3.9", "chalk": "^5.3.0", "chalk-template": "^1.1.0", - "commander": "^11.0.0", - "cspell-gitignore": "7.3.7", - "cspell-glob": "7.3.7", - "cspell-io": "7.3.7", - "cspell-lib": "7.3.7", - "fast-glob": "^3.3.1", + "commander": "^11.1.0", + "cspell-gitignore": "7.3.9", + "cspell-glob": "7.3.9", + "cspell-io": "7.3.9", + "cspell-lib": "7.3.9", + "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^7.0.0", + "file-entry-cache": "^7.0.1", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", - "vscode-uri": "^3.0.7" + "vscode-uri": "^3.0.8" }, "bin": { "cspell": "bin.mjs", @@ -2174,14 +2203,14 @@ } }, "node_modules/cspell-dictionary": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.7.tgz", - "integrity": "sha512-mJ0h2BGxYEqb/1FxKD50WuufKhDaCaIk8pwZQryqazXQCvoTpla0yud3KO61Cke92za8z37Rfb+5xATlywEfaw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.9.tgz", + "integrity": "sha512-lkWfX5QNbs4yKqD9wa+G+NHRWmLgFdyposgJOyd/ojDbx99CDPMhMhg9pyMKdYl6Yt8kjMow58/i12EYvD8wnA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "cspell-trie-lib": "7.3.7", + "@cspell/cspell-pipe": "7.3.9", + "@cspell/cspell-types": "7.3.9", + "cspell-trie-lib": "7.3.9", "fast-equals": "^4.0.3", "gensequence": "^6.0.0" }, @@ -2196,12 +2225,12 @@ "dev": true }, "node_modules/cspell-gitignore": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.7.tgz", - "integrity": "sha512-nP4Gg+zq5y0njzhiNYTLvaJIMAponBhJoTMzkXCOOKYEHJmiRQocfa3gO4t2s8iZ4YVhscbrB2h+dYvo3MLQqg==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.9.tgz", + "integrity": "sha512-DLuu+K2q4xYNL4DpLyysUeiGU/NYYoObzfOYiISzOKYpi3aFLiUaiyfF6xWGsahmlijif+8bwSsIMmcvGa5dgA==", "dev": true, "dependencies": { - "cspell-glob": "7.3.7", + "cspell-glob": "7.3.9", "find-up": "^5.0.0" }, "bin": { @@ -2212,9 +2241,9 @@ } }, "node_modules/cspell-glob": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.7.tgz", - "integrity": "sha512-DJX5wJ5dhcNzyycukZst+WtbIdpCLTL7DaKS0EKW/57QjzMwwMBgpsF89ufnreGHB8dHrPF85epF9qyOI1SRNg==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.9.tgz", + "integrity": "sha512-7PaTkCzJWjQex3men857v3ExF7Q10jbQkfD+wdln2te9iNFd+HEkstA173vb828D9yeib1q1of8oONr2SeGycg==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -2224,13 +2253,13 @@ } }, "node_modules/cspell-grammar": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.7.tgz", - "integrity": "sha512-4cyJ4Alq/wBGTctH7fNTbY9EZCihm11fbrGSYVe8w+msRNx6W8rugsMX009aHiw9zlvGrMAeTD08YFPnBVdfpA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.9.tgz", + "integrity": "sha512-s1QOPg4AxWE8XBewDQLe14j0uDyWGjREfm4dZFTrslAZUrQ8/df5s152M5LtgOEza33FrkKKE2axbGvgS9O7sQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7" + "@cspell/cspell-pipe": "7.3.9", + "@cspell/cspell-types": "7.3.9" }, "bin": { "cspell-grammar": "bin.mjs" @@ -2240,12 +2269,12 @@ } }, "node_modules/cspell-io": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.7.tgz", - "integrity": "sha512-zqGGllG/OM3Of7zaOELdrSoBpCyG9nJuSRCzLfKgnCG4g2zpoMfDZknJaY9VjZODHP99PvYWooF8E6kVxT34Fw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.9.tgz", + "integrity": "sha512-IbXOYaDxLg94uijv13kqb+6PQjEwGboQYtABuZs2+HuUVW89K2tE+fQcEhkAsrZ11sDj5lUqgEQj9omvknZSuA==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "7.3.7", + "@cspell/cspell-service-bus": "7.3.9", "node-fetch": "^2.7.0" }, "engines": { @@ -2253,33 +2282,33 @@ } }, "node_modules/cspell-lib": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.7.tgz", - "integrity": "sha512-KuFn0WTwmK50Ij1KVaXVuheleSOfv3oFIO3PfMuFg7llkfPfaRawF0b61da/EFGckU/hUc8uHRbBuGELlDo3tA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.9.tgz", + "integrity": "sha512-eFYYs8XoYmdu78UxrPisD+hAoXOLaLzcevKf9+oDPDgJmHpkGoFgbIBnHMRIsAM1e+QDS6OlWG/rybhZTqanCQ==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "7.3.7", - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-resolver": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "@cspell/dynamic-import": "7.3.7", - "@cspell/strong-weak-map": "7.3.7", + "@cspell/cspell-bundled-dicts": "7.3.9", + "@cspell/cspell-pipe": "7.3.9", + "@cspell/cspell-resolver": "7.3.9", + "@cspell/cspell-types": "7.3.9", + "@cspell/dynamic-import": "7.3.9", + "@cspell/strong-weak-map": "7.3.9", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.3.7", - "cspell-glob": "7.3.7", - "cspell-grammar": "7.3.7", - "cspell-io": "7.3.7", - "cspell-trie-lib": "7.3.7", + "cspell-dictionary": "7.3.9", + "cspell-glob": "7.3.9", + "cspell-grammar": "7.3.9", + "cspell-io": "7.3.9", + "cspell-trie-lib": "7.3.9", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.7" + "vscode-uri": "^3.0.8" }, "engines": { "node": ">=16" @@ -2368,13 +2397,13 @@ } }, "node_modules/cspell-trie-lib": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.7.tgz", - "integrity": "sha512-Vv8TdTMZD3DE79SorTwn5NoWj8JD7DnYMeUK+5S6JDNLy4Ck+kTEPN6Ic9hvLAxuDmQjmoZI3TizrWvuCG66aA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.9.tgz", + "integrity": "sha512-aTWm2KYXjQ+MlM6kB37wmTV9RU8+fgZYkiFfMc48M0MhBc6XkHUibMGrFAS29gp+B70kWPxe+VHLmFIk9pRPyg==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", + "@cspell/cspell-pipe": "7.3.9", + "@cspell/cspell-types": "7.3.9", "gensequence": "^6.0.0" }, "engines": { @@ -2553,18 +2582,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2607,9 +2637,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", - "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz", + "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -2864,9 +2894,9 @@ } }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2973,9 +3003,9 @@ "dev": true }, "node_modules/focus-trap": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.3.tgz", - "integrity": "sha512-7UsT/eSJcTPF0aZp73u7hBRTABz26knRRTJfoTGFCQD5mUImLIIOwWWCrtoQdmWa7dykBi6H+Cp5i3S/kvsMeA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", "dev": true, "dependencies": { "tabbable": "^6.2.0" @@ -3266,9 +3296,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", - "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", + "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", "dev": true, "funding": { "type": "github", @@ -3472,9 +3502,9 @@ "dev": true }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -3554,9 +3584,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.4.tgz", - "integrity": "sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -3632,6 +3662,15 @@ "balanced-match": "^1.0.0" } }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/markdownlint-cli/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -3748,9 +3787,9 @@ } }, "node_modules/minisearch": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", - "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.2.0.tgz", + "integrity": "sha512-BECkorDF1TY2rGKt9XHdSeP9TP29yUbrAaCh/C03wpyf1vx3uYcP/+8XlMcpTkgoU0rBVnHMAOaP83Rc9Tm+TQ==", "dev": true }, "node_modules/ms": { @@ -3760,9 +3799,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -4022,9 +4061,9 @@ } }, "node_modules/preact": { - "version": "10.18.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.1.tgz", - "integrity": "sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==", + "version": "10.18.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.2.tgz", + "integrity": "sha512-X/K43vocUHDg0XhWVmTTMbec4LT/iBMh+csCEqJk+pJqegaXsvjdqN80ZZ3L+93azWCnWCZ+WGwYb8SplxeNjA==", "dev": true, "funding": { "type": "opencollective", @@ -4041,9 +4080,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -4208,9 +4247,9 @@ } }, "node_modules/sass": { - "version": "1.69.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.0.tgz", - "integrity": "sha512-l3bbFpfTOGgQZCLU/gvm1lbsQ5mC/WnLz3djL2v4WCJBDrWm58PO+jgngcGRNnKUh6wSsdm50YaovTqskZ0xDQ==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -4225,9 +4264,9 @@ } }, "node_modules/search-insights": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.8.3.tgz", - "integrity": "sha512-W9rZfQ9XEfF0O6ntgQOTI7Txc8nkZrO4eJ/pTHK0Br6wWND2sPGPoWg+yGhdIW7wMbLqk8dc23IyEtLlNGpeNw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.10.0.tgz", + "integrity": "sha512-pQGrOE56QuTRmq4NzliRZe9rv914hBMBjOviuDliDHoIhmBGoyZRlFsPd4RprGGNC4PKdD2Jz54YN4Cmkb44mA==", "dev": true, "peer": true }, @@ -4293,9 +4332,9 @@ } }, "node_modules/shiki": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", - "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", "dev": true, "dependencies": { "ansi-sequence-parser": "^1.1.0", @@ -4564,6 +4603,12 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", @@ -4595,9 +4640,9 @@ "dev": true }, "node_modules/vite": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", - "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -4650,30 +4695,31 @@ } }, "node_modules/vitepress": { - "version": "1.0.0-rc.20", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.20.tgz", - "integrity": "sha512-CykMUJ8JLxLcGWek0ew3wln4RYbsOd1+0YzXITTpajggpynm2S331TNkJVOkHrMRc6GYe3y4pS40GfgcW0ZwAw==", + "version": "1.0.0-rc.25", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.25.tgz", + "integrity": "sha512-1dqWiHNThNrVZ08ixmfEDBEH+764KOgnev9oXga/x6cN++Vb9pnuu8p3K6DQP+KZrYcG+WiX7jxal0iSNpAWuQ==", "dev": true, "dependencies": { "@docsearch/css": "^3.5.2", "@docsearch/js": "^3.5.2", - "@types/markdown-it": "^13.0.1", - "@vue/devtools-api": "^6.5.0", - "@vueuse/core": "^10.4.1", - "@vueuse/integrations": "^10.4.1", - "focus-trap": "^7.5.2", + "@types/markdown-it": "^13.0.4", + "@vitejs/plugin-vue": "4.3.1", + "@vue/devtools-api": "^6.5.1", + "@vueuse/core": "^10.5.0", + "@vueuse/integrations": "^10.5.0", + "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^6.1.0", - "shiki": "^0.14.4", - "vite": "^4.4.9", - "vue": "^3.3.4" + "shiki": "^0.14.5", + "vite": "^4.5.0", + "vue": "^3.3.6" }, "bin": { "vitepress": "bin/vitepress.js" }, "peerDependencies": { "markdown-it-mathjax3": "^4.3.2", - "postcss": "^8.4.30" + "postcss": "^8.4.31" }, "peerDependenciesMeta": { "markdown-it-mathjax3": { @@ -4709,22 +4755,30 @@ "dev": true }, "node_modules/vue": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", - "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz", + "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-sfc": "3.3.4", - "@vue/runtime-dom": "3.3.4", - "@vue/server-renderer": "3.3.4", - "@vue/shared": "3.3.4" + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-sfc": "3.3.8", + "@vue/runtime-dom": "3.3.8", + "@vue/server-renderer": "3.3.8", + "@vue/shared": "3.3.8" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/vue-eslint-parser": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", - "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", "dev": true, "dependencies": { "debug": "^4.3.4", diff --git a/package.json b/package.json index 8e155f61c..ad5202d87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@cap-js/docs", - "version": "0.20.0", + "version": "0.25.0", "description": "Capire on VitePress", "type": "module", "scripts": { @@ -27,6 +27,6 @@ "markdownlint-cli": ">=0.35.0", "markdownlint-rule-search-replace": "^1.1.1", "sass": "^1.62.1", - "vitepress": "^1.0.0-rc.20" + "vitepress": "^1.0.0-rc.25" } } diff --git a/plugins/index.md b/plugins/index.md index f9282cde4..f42f1d55a 100644 --- a/plugins/index.md +++ b/plugins/index.md @@ -18,6 +18,17 @@ These plugins are created and maintained in close collaboration and shared owner font-style: italic; margin: -44px 0 40px; } + main .vp-doc a:has(> img) { + display: inline-flex; + align-items: center; + transition: opacity 0.2s; + } + main .vp-doc a:has(> img):hover { + opacity: 0.7; + } + main .vp-doc a:has(> img):not(:last-child) { + margin-right: 1em; + } @@ -64,9 +75,8 @@ The GraphQL Adapter is a protocol adapter that generically generates a GraphQL s Available for: -[](https://www.npmjs.com/package/@cap-js/graphql) +[](https://www.npmjs.com/package/@cap-js/graphql) -Click on the icon to get detailed instructions. {.learn-more} @@ -77,12 +87,12 @@ The OData v2 Proxy is a protocol adapter that allows you to expose your services Available for: -[](https://www.npmjs.com/package/@cap-js-community/odata-v2-adapter) -[](../java/migration#v2adapter) +[](https://www.npmjs.com/package/@cap-js-community/odata-v2-adapter) +[](../java/migration#v2adapter) Click on the icons to get detailed instructions. {.learn-more} -See also [_Advanced > OData APIs > V2 Support_](../advanced/odata#v2-support) {.learn-more} +See also [_Advanced →> OData APIs → V2 Support_](../advanced/odata#v2-support) {.learn-more} @@ -94,7 +104,7 @@ The UI5 Dev Server is a CDS server plugin that enables the integration of UI5 (U Available for: -[](https://www.npmjs.com/package/cds-plugin-ui5) +[](https://www.npmjs.com/package/cds-plugin-ui5) Click on the icon to get detailed instructions. {.learn-more} @@ -118,7 +128,7 @@ annotate my.Incidents { Available for: -[](https://npmjs.com/package/@cap-js/change-tracking) +[](https://npmjs.com/package/@cap-js/change-tracking) Click on the icon to get detailed instructions. {.learn-more} @@ -148,8 +158,8 @@ Features: Available for: -[](../guides/data-privacy/audit-logging) -[](../java/auditlog) +[](../guides/data-privacy/audit-logging) +[](../java/auditlog) Click on the icons to get detailed instructions. {.learn-more} @@ -180,7 +190,7 @@ Features: Available for: -[](https://github.com/cap-js/notifications#readme) +[](https://github.com/cap-js/notifications#readme) Click on the icon to get detailed instructions. {.learn-more} @@ -191,4 +201,4 @@ Click on the icon to get detailed instructions. {.learn-more}
-
\ No newline at end of file +
diff --git a/project-words.txt b/project-words.txt index e588a3393..baa4b568e 100644 --- a/project-words.txt +++ b/project-words.txt @@ -3,3 +3,5 @@ unlocalized undiscloses isdir Undeploying +SWAPI +SusaaS \ No newline at end of file